用LINUX AS构建和安装一个独立的防火墙
防火墙架设前的知识点补充
防火墙支持状态过滤。状态主要有以下四种:
NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack(内核包跟踪)模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,如UDP包,就要匹配它
ESTABLISHED在两个方向上的数据传输。即只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答就认为是此状态。
RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是 RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有关的一个RELATED
INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。
本章所建立的防火墙是基于“禁止一切”的默认策略的。按照默认的情况,所有的网络数据流都被禁止,服务作为策略的例外来单独启用。
对于单系统的家庭或是小型商业用户配置,假设大多用户都使用一个单独的计算机来连接 Internet,或用单个防火墙来保护一个小型的专用的局域网。之所以这样假设是因为这样的站点一般不会去花更多资金来扩展原有系统结构以构建更高级的防火墙。
“最小安全”并不是“不安全”,这种“最小保护”防火墙只是比拥有较多机器的更复杂的防火墙稍差一些。安全性是一种可利用的资源与逐渐减少的回报之间的均衡。如果要求更高的安全性,付出更多的投入,不一定能在效益上有相应倍数的提高。
日后我们会介绍更多的安全配置,以提供保护较为复杂的局域网的附加内部安全性,也提供比单系统防火墙更安全的服务器配置。
作为防火墙的管理程序,iptables为输入和输出规则链建立单独的数据包过滤规则以组成防火墙。定义防火墙规则的一个重要方面就是规则的定义顺序。
数据包过滤规则以它们被定义的顺序存储在内核的输入、输出或转发规则链中。单个规则被插入到链的开头或添加到链的结尾。本章例子中的所有规则都是添加到链的结尾的
本章所有过滤器的例子中使用的是数字服务端口号而不是它们的符号名称,如在/etc/services中列出的那样。iptables支持符号化的服务端口名称,之所以不使用符号名称而使用数字是因为在Linux的不同版本中符号名称不太统一
本章将会用到一个名为rc.firewall的脚本,这个脚本的位置依赖于Linux调用该脚本的方式而不同。例如,在Red Hat,或SUSE系统中,此脚本位于/etc/rc.d目录;但在Debian中,它位于/etc/init.d目录。鉴于用到的shell语法可能不同,在例子中会用Bourne(sh)或Bourne Again(bash)shell的语法来编写。
脚本应该以“shebang”开头来调用shell作为脚本的解释程序。脚本中的第一行如下:
#!/bin/sh
定制还是购买Linux内核
最好不要在防火墙运行X Window,进一步说,最好不要安装。因为一般这个软件没有太多用处,而且曾被用做攻击服务器的途径。
有人需要从成百上千英里以外的某地方控制一台Linux计算机,和他们一样,我也要从很远的地方启动防火墙脚本,在这种情况下,最好做两项准备:首先,将防火墙脚本开始的一个或几个执行动作的默认策略定为接受,这样做是为了调试脚本,而不是规则语法即是如此。在脚本被调试正确后,再将策略改回为丢弃策略。
其次非常重要的一点是,在从远程执行防火墙脚本时,最好设置corn作业,使防火墙可以在不久后的某一时间停止下来。这样可以有效地允许你启用防火墙并进行一些测试,并且,当存在错误设置的(或者丢失的)规则时,不至于将你锁在计算机外面而无法返回与计算机的连接。
临时客串知识点:
Linux 技巧: 用 cron 和 at 调度作业
系统管理员需要在系统负载低的午夜运行作业,或者需要每天或每月运行作业,同时又不愿意牺牲睡眠时间或假期。调度任务的其他原因包括自动执行日常任务或者确保每次都以相同的方式处理任务。本文帮助您使用 cron 和 at 功能调度作业定期运行或在指定的时间运行一次。
以一定的时间间隔运行作业需要使用 cron 设施进行管理,它由 crond 守护进程和一组表(描述执行哪些操作和采用什么样的频率)组成。这个守护进程每分钟唤醒一次,并通过检查 crontab 判断需要做什么。用户使用 crontab 命令管理 crontab。crond 守护进程常常是在系统启动时由 init 进程启动的。
为了简单,假设希望定期运行清单 1 所示的命令。这个命令实际上只报告日期和时间,其他什么事都不做,但是它可以说明如何使用 crontab 设置 cron 作业,而且还可以通过输出看到作业运行的时间。设置 crontab 条目需要一个包含转义的 shell 元字符的字符串,所以适合于简单的命令和参数。在这个示例中,将从脚本 /home/ian/mycrontab.sh 运行 echo 命令,这个脚本不需要参数。 这可以减少处理转义字符的工作。
创建 crontab
使用 crontab 命令和 -e(表示 “edit”)选项创建 crontab。这会打开 vi 编辑器,除非在 EDITOR 或 VISUAL 环境变量中指定了另一种编辑器。
每个 crontab 条目包含六个字段:
- 分钟
- 小时
- 日
- 月
- 星期
- 由 sh 执行的字符串
分钟和小时的范围分别是 0-59 和 0-12,日和月的范围分别是 1-31 和 1-12。星期的范围是 0-6,0 表示星期日。星期也可以指定为 sun、mon、tue 等等。第 6 个字段包含前 5 个字段之后的所有内容,它是要传递给 sh 的字符串。百分号(%)将转换为空行,所以如果要使用 % 或其他任何特殊字符,就要在前面加上反斜线(\)。第一个 % 之前的一行传递给 shell,这个 % 之后的所有行都作为标准输入传递。
各个与时间相关的字段可以指定一个单独的值、值的范围(比如 0-10 或 sun-wed)或者以逗号分隔的单独值和范围列表。清单 2 给出一个 crontab 条目示例。
在这个示例中,我们的命令在 7 月的每个星期五和星期六晚上 10 点到午夜之间的第 0、20、40 分钟(每 20 分钟)执行。
crontab 存储在哪里?
用 crontab 命令创建的 crontab 存储在 /etc/spool/cron 下面的一个子目录中,这个子目录与创建 crontab 的用户同名,所以上面的 crontab 存储在 /etc/spool/cron/ian 中。
有时候,需要只运行作业一次而不是定期运行。为此,应该使用 at 命令。要运行的命令是从 -f 选项指定的文件读取的,-v 选项显示运行作业的时间
例如:
[ian@lyrebird ~]$ at -f mycrontest.sh 10pm tomorrow
job 14 at Sun Jul 8 22:00:00 2007
[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007
[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2007
[ian@lyrebird ~]$ at -f mycrontest.sh 2:00 next week
job 17 at Sat Jul 14 02:00:00 2007
可以管理 cron 和 at 作业。使用 crontab 命令和 -l 选项列出 crontab,使用 atq 命令显示用 at 命令加入队列中的作业
[ian@lyrebird ~]$ crontab -l
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
[ian@lyrebird ~]$ atq
16 Wed Jul 11 02:00:00 2007 a ian
17 Sat Jul 14 02:00:00 2007 a ian
14 Sun Jul 8 22:00:00 2007 a ian
15 Tue Jul 10 02:00:00 2007 a ian
可以使用 cron 命令和 -r 选项删除所有调度的 cron 作业
[ian@lyrebird ~]$ crontab -l
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
[ian@lyrebird ~]$ crontab -r
[ian@lyrebird ~]$ crontab -l
no crontab for ian
用 atq 和 atrm 显示并删除作业
[ian@lyrebird ~]$ atq
16 Wed Jul 11 02:00:00 2007 a ian
17 Sat Jul 14 02:00:00 2007 a ian
14 Sun Jul 8 22:00:00 2007 a ian
15 Tue Jul 10 02:00:00 2007 a ian
[ian@lyrebird ~]$ atrm 16 14 15
[ian@lyrebird ~]$ atq
17 Sat Jul 14 02:00:00 2007 a ian
以上是关于作业调度的知识点补充。如果有了以上的CRON我们就不会把自己锁在外面了。例如,在调试防火墙脚本时,可以创建一个corn作业,每两分钟停止防火墙一次,这样可以安全地运行防火墙脚本并可以知道是否已锁定SSH会话。如果已经锁定,只需要等待防火墙脚本再运行几分钟,等待防火墙自行关闭,然后就可以去修订脚本继续运行了。
本节课防火墙示例中使用的符号常量
如果为经常使用的名字或地址定义了符号常量,防火墙的脚本就极易读懂和维护。下面的常量或者是本章例子中用到的,或者是在网络标准中定义的通用常量。在下面的例子中,也是以“shebang”行作为开头。
#!/bin/sh IPT="/sbin/iptables" # Location of iptables on your system INTERNET="ethO" # Internet-connected interface LOOPBACK_INTERFACE="1o" # however your system names it IPADDR="my.ip.address" # your IP address MY_ISP="my.isp.address.range" # ISP server & NOC address range SUBNET_BASE="my.subnet.network" # Your subnet's network address SUBNET_BROADCAST="my.subnet.bcast" # Your subnet's broadcast address LOOPBACK="127.0.O.O/8" # reserved loopback address range CLASS_A="IO.O.O.O/8" # class A private networks CLASS_B="172.16.O.O/12" # class B private networks CLASS_C="192.168.0.0/16" # class C private networks CLASS_D_MULTICAST="224.0.O.O/4" # class D multicast addresses CLASS_E_RESERVED_NET="240.0.O.O/5" # class E reserved addresses BROADCAST_SRC="O.O.O.O" # broadcast source address BROADCAST_DEST="255.255.255.255" # broadcast destination address PRIVPORTS="0:1023" # well-known, privileged port range UNPRIVPORTS="1024:65535" # unprivileged port range
删除预先存在的规则
定义一组过滤规则时,首先要做的事情就是从规则链中清除任何已经存在的规则。否则任何新定义的规则将加到已有的规则之后。那么,数据包在到达链上新定义的点之前,很容易与一个先前存在的规则匹配。
删除规则也叫做刷新规则链,当没有参数直接针对特定的链时,下面的命令一次性刷新所有链上的规则:
$IPT –flush
$IPT -t nat –flush
$IPT -t mangle --flush
规则链变为空,但所有用户自定义规则链仍存在,刷新链并不影响当时处于有效的默认策略的状态。
下一步是删除所有用户自定义规则链,下面的命令可以删除它们:
$IPT-X
$IPT-t nat-X
$IPT-t mangle-X
停止防火墙
$IPT --policy INPUT ACCEPT
$IPT --policy OUTPUT ACCEPT
$IPT --policy FORWARD ACCEPT
$IPT -t nat --policy PREROUTING ACCEPT
$IPT -t nat --policy OUTPUT ACCEPT
$IFT -t nat --policy POSTROUTING ACCEPT
$IPT -t mangle --policy PREROUTING ACCEPT
$IPT -t mangle --policy OUTPUT ACCEPT
下面就可以容易地停止防火墙了,将下面代码置于上面代码之后,当你使用参数“stop”时,脚本会直接而干净地重置默认策略并将防火墙完全停止:
if [ "$1" = "stop" ];then
echo "Firewall completely stopped! WARNING: THIS HOST HAS NO FIREWALL RUNNING. " exit 0
fi
启动回环接口
本地服务依赖于回环网络接口。系统启动之后,系统的默认策略是接受所有的数据包,清除所有预先存在的规则链对此也没有任何影响。但是,当防火墙被重新初始化时并且先前使用了默认禁止策略,丢弃策略在此时也将依然有效。在没有任何接受规则的情况下,回环接口是不能被访问的。
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
重置默认策略
使用丢弃默认策略时,除非定义规则为明确允许或拒绝一个匹配的数据包,否则数据包将被丢弃。我们想要的是,自动丢弃我们不想要的入站数据包且并不通知远方的发送者,拒绝出站数据包并向内部发送者返回一个ICMP错误消息。对用终端用户来说,其不同之处举例来讲,如果有人在远程站点试图连接你的Web服务器,他的浏览器会挂起,直到系统返回TCP超时状态,但他未得到你的站点或Web服务器是否存在的指示。另一方面,如果你试图连接一个远程Web服务器,你的浏览器会立即收到一个错误通知,指示这个操作是不允许的:
$IPT --policy INPUT DROP
$IPT --policy OUTPUT DROP
$IPT --policy FORWARD DROP
这样,结合上面的设置除了本地回环业务流外的其他网络业务流都会被阻塞。
如果防火墙主机只有一个网络接口,转发(FORWARD)策略当然是没有必要的。定义转发策略是为以后做准备的,这样,最好加入下面的代码:
$IPT -t nat --policy PREROUTING DROP
$IPT -t nat --policy OUTPUT DROP
$IPT -t nat --policy POSTROUTING DROP
$IPT -t mangle --policy PREROUTING DROP
$IPT -t mangle --policy OUTPUT DROP
默认策略规则和最先匹配规则为准默认策略看起来似乎是最先匹配规则为准的例外。默认策略命令不依赖于其位置,它们本身不是规则。一个规则链的默认策略是指,一个数据包与规则链上的规则都做了比较却未找到匹配之后所采用的策略。
默认策略用于定义默认的数据包处理方式,它相对规则来说需要首先在脚本中定义。假设策略命令在脚本最后执行,此时如果防火墙脚本包含一个语法错误导致它过早地退出,那么接受一切的默认策略将生效。
拒绝扫描
排在最前面的状态标记列表列出的是必须进行检测的位,除了那些位以外,第二张状态标记列表列出了必须在检测中设为匹配的位。
$IPT -A INPUT -m unclean -j DROP# All of the bits are cleared
$IPT -A INPUT -ptcp --tcp-flags ALL NONE -j DROP# SYN and FIN are both set
$IPT -A INPUT -p top --tcp-flags SYN,FIN SYN,FIN -j DROP# SYN and RST are both set$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP# FIN and RST are both set$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP# FIN is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP# PSH is the only bit set, without the expected accompanying ACK
$1PT -A INPUT -p top --top-flags ACK,PSH PSH -j DROP# URG is the only bit set, without the expected accompanying ACK
$1PT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
利用连接状态绕过规则检测
因为状态模块相对一些Linux防火墙来说会需要更多的内存,所以本章的防火墙示例,将会提供有状态模块和没有状态模块两种选择。
使用状态模块可以让正在进行的交换在正常操作的情况下绕过标准防火墙规则。但是,如果一个连接的状态表中某项发生循环或超时,就必须转而使用标准的规则。
防火墙静态和动态规则
资源限制的可测性和状态表超时要求同时使用动态和静态规则。这种限制成为了大型商业防火墙的一个卖点。
限制的可测性问题主要是因为,一个大型的防火墙往往需要处理50,000~100,000个同时的连接,这样就有大量的状态要处理。系统资源有时被用尽,这样连接就无法建立起来,这时就需要放弃新的连接或是让软件退回到无状态模式。
还有一个就是超时问题,连接状态并不能永远保持。一些慢速或静止态的连接的状态信息有时会被清除掉,这样可以为更活跃的连接留出更多的空间。当一个相关的新的数据包又传来时,状态信息将被重新建立。同时,在传输栈查询连接信息并通知状态模块此数据包确实是已经存在的一个数据交换连接的一部分时,数据包的网络流又回到无状态模式下。
if [ "$CONNECTION_TRACKING" = "1" ]; then
SIPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Using the state module alone, INVALID will break protocols that use
# bi-directional connections or multiple connections or exchanges,
# unless an ALG is provided for the protocol. At this time, FTP and
# IRC are the only protocols with ALG support.
$IPT -A INPUT -m state --state INVALID -j LOG \
--log-prefix "INVALID input: "
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A OUTPUT -m state --state INVALID -j LOG \
--log-prefix "INVALID output: "
$IPT -A OUTPUT -m state --state INVALID -j DROP
fi
源地址欺骗及其他不合法地址
在众多的源地址欺骗中,你可以确定识别出的一种欺骗,那就是它伪装成了你的IP地址。下面的规则可以丢弃那些声称是来自你的机器的入站数据包:
$IPT -A INPUT -i $INTERNET -s $IPADDR -j DROP
正如第1章和第2章中介绍的那样,A、B、C类地址范围中都有一些私有IP地址专门留给局域网使用。这些地址不会在Internet中使用,路由器也不会使用这些私有地址去路由数据包。然而事实上,有些路由器确实会转发含私有源地址的数据包。
另外,如果和你同在一个ISP子网(即与你在路由器的同一侧)中的某些人向外发送了带有私有地址的数据包,即使路由器没有转发,这些数据包你也可以看到。如果你的NAT或代理设置不当,和你在同一局域网下的机器也会泄漏私有地址。
下面三个规则不允许以任何A、B或C类私有网络地址为源地址的数据包入站。在一个公用网络中,这样的数据包不允许出现:
$IPT -A INPUT -i $INTERNET -s $CLASS_A -j DROP
$IPT -A INPUT -i $1NTERNET -s $CLASS_B -j DROP
$IPT -A INPUT -i $INTERNET -s $CLASS_C -j DROP
下面的规则不允许来自回环网络地址的数据包:
$IPT -A INPUT -i $INTERNET -s $LOOPBACK -j DROP
因为回环接口是内部的本地软件接口,任何声称来自这样的地址的数据包都是故意伪造的。
下面的两个规则用于记录匹配的数据包。防火墙的默认策略是禁止一切,这样的话,广播地址也被默认地丢弃了,如果需要使用,必须明确地启用它:
$1PT -A INPUT -i $1NTERNET -s $BROADCAST_DEST -j LOG
$1PT -A INPUT -i $INTERNET -s $BROADCAST_DEST -j DROP
$IPT -A INPUT -i $INTERNET -d $BROADCAST_SRC -j LOG
$1PT -A INPUT -i $INTERNET -d $BROADCAST_SRC -j DROP
澄清IP地址0.0.O.0的意义
地址O.0.0.0保留作为广播源地址。在Netfilter中,指明与任意地址(如any/0,0.0.0.0/0或者 O.0.0.0/0.0.0.0)进行匹配的规则不与广播地址匹配。原因是广播数据包在其数据包头中有一标记位用以指示这是一个发给网络上所有接口的广播数据包,而不是一个点对点发给特定目的地址的单点传送数据包。对广播数据包的处理与非广播数据包不同,不存在IP地址是0.0.0.O的合法的非广播数据包。
下面两条规则阻塞两种形式的直接广播:
# Refuse directed broadcasts# Used to map networks and in Denial of Service attacks$IPT -A INPUT -i $INTERNET -d $SUBNET_BASE -j DROP$IPT -A INPUT -i $INTERNET -d $SUBNET_BROADCAST -j DROP
由于默认禁止策略,以及部分依靠匹配目的地址来明确地接受某些数据包的防火墙规则,所有这些直接广播消息都不会被防火墙接受。在局域网使用真实网络地址进行更大规模配置时,设置这些规则将非常困难。
由于使用了变长的网络前缀,一个站点的网络或主机地址域可能是,也可能不是一个字节的长度。为了讲起来简单,假设SUBNET_BASE是你的网络地址,如192.168.1.0;SUBNET_ BROADCAST是你的网络广播地址,如192.168.1.255。
后面的章节中会为DHCP客户机设置一些例外。在DHCP的客户机及服务器端口初始化时,广播源和目的地址要被用到。
多播地址只能被用做目的地址,下面的规则丢弃假冒的多播网络数据包:
# Refuse Class D multicast addresses# illegal as a source address
$IPT -A INPUT -i $1NTERNET -s $CLASS_D_MULTICAST -j DROP
合法的多播数据包都是UDP数据包下面的规则禁止了非UDP协议的多播数据包:
$IPT-A INPUT-i$INTERNET-P ! udp-d$CLASS_D_MULTICAST-j DROP
#保留地址块在注册之前是不能路由的。它们在拒绝服务攻击中可以被用做源地址。防火墙可以阻塞以这些保留地址块为源地址的数据包
但是,因为自2000年以后IANA开始灵活地
为站点分配这些地址块,所以防火墙这样运作也变得有些不太现实了。下面的规则定义丢弃以那些地址块为源地址的数据包:
$IPT -A INPUT -i $INTERNET -s 0.0.0.0/8 -j DROP
$IPT -A INPUT -i $INTERNET -s 169.254.0.0/16 -j DROP
$IPT -A INPUT -i $INTERNET -s 192.0.2.0/24 -j DROP
上面是一些应该注意的地方,下面我们以一个脚本来讲述本课程的重点
本课涉及的脚本是为各种服务的应用协议设立的防火墙规则主要是应用于独立的Linux主机。并且每个服务的客户端规则以及服务端规则同时存在,尽管并不是每一个规则都是必要的。完整的 iptables防火墙脚本应该放在/etc/rc.d/rc.firewall或者/etc/init.d/firewall中,如下所示:
#!/bin/sh/sbin/modprobe ip_conntrack_ftp CONNECTION_TRACKING="1" ACCEPT_AUTH="O" SSH_SERVER="O" FTP_SERVER="O" WEB_SERVER="O" SSL_SERVER="O" DHCP_CLIENT="1" IPT="/sbin/iptables" # Location of iptables on your system INTERNET="ethO" # Internet-connected interface LOOPBACK_INTERFACE="lo" # however your system names it IPADDR="my.ip.address" # your IP address SUBNET_BASE="my,subnet,base" # ISP network segment base address SUBNET_BROADCAST="my.subnet.bcast" # network segment broadcast address MY_ISP="my.isp.address.range" # ISP server & NOC address range NAMESERVER="isp.name.server.l" # address of a remote name server POP_SERVER="isp,pop,server" # address of a remote pop server MAIL_SERVER="isp.mail.server" # address of a remote mail gateway NEWS_SERVER="isp.news.server" # address of a remote news server TIME_SERVER="some.time.server" # address of a remote time server DHCP_SERVER="isp.dhcp.server" # address of your ISP dhcp server LOOPBACK="127.0.O.O/8" # reserved loopback address range CLASS_A="1O.O.O,O/8" # Class A private networks CLASS_B="172.16.0.O/12" # Class B private networks CLASS_C="192.168.0.0/16" # Class C private networks CLASS_D_MULTICAST="224.0.O.O/4" # Class D multicast addresses CLASS E RESERVED NET="240.O.O.O/5" # Class E reserved addresses
BROADCAST_SRC="0.O.O.O" # broadcast source address BROADCAST_DEST="255.255.255.255" # broadcast destination address PRIVPORTS="0:1023" # well-known, privileged port range UNPRIVPORTS="1024:65535" # unprivileged port range SSH_PORTS="1024:65535" NFS_PORT="2049" LOCKD_PORT="4045" SOCKS_PORT="1080n OPENWINDOWS_PORT="2000" XWINDOW_PORTS="6000:6063" SQUID_PORT="3128"################################################################ Enable broadcast echo Protection echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts# Disable Source Routed Packets for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f done# Enable TCP SYN Cookie Protection echo i > /proc/sys/net/ipv4/tcp_syncookies# Disable ICMP Redirect Acceptance for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f done# Don't send Redirect Messages for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo 0 > $f done# Drop Spoofed Packets coming in on an interface, which, if replied to,# would result in the reply going out a different interface. for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f done# Log packets with impossible addresses. for f in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $f done################################################################ Remove any existing rules from all chains$IPT --flush$IPT -t nat --flush
$IPT -t mangle --flush$IPT -X$IPT -t nat -X$IPT -t mangle -X$IPT --policy INPUT ACCEPT$IPT --policy OUTPUT ACCEPT$IPT --policy FORWARD ACCEPT$IPT -t nat --policy PREROUTING ACCEPT$IPT -t nat --policy OUTPUT ACCEPT$IPT -t nat --policy POSTROUTING ACCEPT$IPT -t mangle --policy PREROUTING ACCEPT$IPT -t mangle --policy OUTPUT ACCEPT if [ "$1" = "stop" ] then echo "Firewall completely stopped! WARNING: THIS HOST HAS NO FIREWALL RUNNING." exit 0 fi# Unlimited traffic on the loopback interface$IPT -A INPUT -i lo -j ACCEPT$IPT -A OUTPUT -o lo -j ACCEPT# Set the default policy to drop$IPT --policy INPUT DROP$IPT --policy OUTPUT DROP$IPT --policy FORWARD DROP$IPT -t nat --policy PREROUTING DROP$IPT -t nat --policy OUTPUT DROP$IPT -t nat --policy POSTROUTING DROP$IPT -t mangle --policy PREROUTING DROP$IPT -t mangle --policy OUTPUT DROP################################################################ Stealth Scans and TCP State Flags# Unclean$IPT -A INPUT -m unclean -j DROP# All of the bits are cleared$IPT -A INPUT -ptcp --tcp-flags ALL NONE -j DROP# SYN and FIN are both set$IPT -A INPUT -ptcp --tcp-flags SYN,FIN SYN,FIN -j DROP# SYN and RST are both set$IPT -A INPUT -p top o-tcp-flags SYN,RST SYN,RST -j DROP# FIN and RST are both set$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP# FIN is the only bit set, without the expected accompanying ACK$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP# PSH is the only bit set, without the expected accompanying ACK$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP# URG is the.only bit set, without the expected accompanying ACK$IPT -A INPUT -ptcp --tcp-flags ACK,URG URG -j DROP################################################################ Using Connecti6n State to By-pass Rule Checking
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Using the state module alone, INVALID will break protocols that use
# bi-directional connections or multiple connections or exchanges,
# unless an ALG is provided for the protocol. At this time, FTP and
# IRC are the only protocols with ALG support.
$IPT -A INPUT -m state --state INVALID -j LOG \
--log-prefix "INVALID input: "
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A OUTPUT -m state --state INVALID -j LOG \
--log-prefix "INVALID output: "
$IPT -A OUTPUT -m state --state INVALID -j DROP fi################################################################ Source Address Spoofing and Other Bad Addresses# Refuse spoofed packets pretending to be from# the external interface's IP address$IPT -A INPUT -i $INTERNET -s $IPADDR -j DROP# Refuse packets claiming to be from a Class A private network$IPT -A INPUT -i $INTERNET -s $CLASS_A -j DROP# Refuse packets claiming to be from a Class B private network$IPT -A INPUT -i $INTERNET -s $CLASS_B -j DROP# Refuse packets claiming to be from a Class C private network$IPT -A INPUT -i $INTERNET -s $CLASS_C -j DROP# Refuse packets claiming to be from the loopback interface$IPT -A INPUT -i $INTERNET -s $LOOPBACK -j DROP# Refuse malformed broadcast packets$IPT -A INPUT -i $INTERNET -s $BROADCAST_DEST -j LOG$IPT -A INPUT -i $INTERNET -s $BROADCAST_DEST -j DROP$IPT -A INPUT -i $INTERNET -d $BROADCAST_SRC -j LOG$IPT -A INPUT -i $INTERNET -d $BROADCAST_SRC -j DROP if [ "$DHCP_CLIENT" = "0" ]; then
# Refuse directed broadcasts
# Used to map networks and in Denial of Service attacks
$IPT -A INPUT -i $INTERNET -d $SUBNET_BASE -j DROP
$IPT -A INPUT -i $INTERNET -d $SUBNET_BROADCAST -j DROP
# Refuse limited broadcasts
$IPT -A INPUT -i $INTERNET -d $BROADCAST_DEST -j DROP fi# Refuse Class D multicast addresses
# illegal as a source address$IPT -A INPUT -i $INTERNET -s $CLASS_D_MULTICAST -j DROP$IPT -A INPUT -i $INTERNET -p ! udp -d $CLASS_D_MULTICAST -j DROP$IPT -A INPUT -i $INTERNET -p udp -d $CLASS_D_MULTICAST -j ACCEPT# Refuse Class E reserved IP addresses$IPT -A INPUT -i $INTERNET -s $CLASS_E_RESERVED_NET -j DROP if [ "$DHCP_CLIENT" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p udp \
-s $BROADCAST_SRC --sport 67 \
-d $BROADCAST_DEST --dport 68 -j ACCEPT fi# refuse addresses defined as reserved by the IANA# 0.*.*.* - Can't be blocked unilaterally with DHCP# 169.254.0.0/16 - Link Local Networks# 192.0.2.0/24 - TEST-NET$IPT -A INPUT -i $INTERNET -s 0.0.0.0/8 -j DROP$IPT -A INPUT -i $INTERNET -s 169.254.0.0/16 -j DROP$IPT -A INPUT -i $INTERNET -s 192.0.2.0/24 -j DROP################################################################ Disallowing Connections to Common TCP Unprivileged Server Ports# X Window connection establishment$IPT -A OUTPUT -o $INTERNET -p tcp --syn \
--destination-port $XWINDOW_PORTS -j REJECT# X Window: incoming connection attempt$IPT -A INPUT -i $INTERNET -p tcp --syn \
--destination-port $XWINDOW_PORTS -j DROP# Establishing a connection over TCP to NFS, OpenWindows, SOCKS, or squid$IPT -A OUTPUT -o $INTERNET -p tcp \
-m multiport --destination-port \
$NFS_PORT,$OPENWINDOWS_PORT,$SOCKS_PORT,$SQUID_PORT \
--syn -j REJECT$IPT -A. INPUT -i $INTERNET -p tcp \
-m multiport --destination-port \
$NFS_PORT,$OPENWINDOWS_PORT,$SOCKS_PORT,$SQUID_PORT \
--syn -j DROP################################################################ Disallowing Connections to Common UDP Unprivileged Server Ports# NFS and lockd if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-m state --state NEW -j REJECT
$IPT -A INPUT -i $INTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-m state --state NEW -j DROP else
$IPT -A OUTPUT -o $1NTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-j REJECT
$IPT -A input -i $INTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-j DROP fi################################################################ DNS Name Server# DNS Forwarding Name Server or client requests if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p udp \
-s ¢IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 -j ACCEPT$IPT -A INPUT -i $INTERNET -p udp \
-s $NAMESERVER --sport 53 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT# TCP is used for large responses if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $1NTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp! --syn \
-s $NAMESERVER --sport 53 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT# DNS Caching Name Server (local server to primary server)
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport 53 \
-d $NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport 53 \
-d $NAMESERVER --dport 53 -j ACCEPT$IPT -A INPUT -i $INTERNET -p udp \
-s $NAMESERVER --sport 53 \
-d $IPADDR --dport 53 -j ACCEPT################################################################ Filtering the AUTH User Identification Service (TCP Port 113)# Outgoing Local Client Requests to Remote Servers
$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 113 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 113 -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp ! --syn \
--sport 113 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT# Incoming Remote Client Requests to Local Servers if [ "$ACCEPT_AUTH" = "1" ]; then
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 113 \
-m state --state NEW -j ACCEPT
fi$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 113 -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p tcp! --syn
-s $IPADDR --sport 113 \
--dport $UNPRIVPORTS -j ACCEPT else$IPT -A INPUT -i $INTERNET -p tcp\
--sport $UNPRIVPORTS \
-d $IPADDR --dport 113 -j REJECT --reject-with tcp-reset fi################################################################ Sending Mail to Any External Mail Server# Use "-d $MAIL_SERVER" if an ISP mail gateway is used instead if [ '$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 25 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 25 -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp ! --syn \
--sport 25 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT################################################################ Retrieving Mail as a POP Client (TCP Port 110} if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $POP_SERVER --dport 110 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $POP_SERVER --dport 110 -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp ! --syn \
-s $POP_SERVER --sport 110 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT################################################################ Accessing Usenet News Services (TCP NNTP Port 119) jf [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp\
-s $IPADDR --sport $UNPRIVPORTS \
-d $NEWS_SERVER --dport 119 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $NEWS_SERVER --dport 119 -j ACCEPT$IPT -A INPUT -i $INTERNET -ptcp ! --syn \
-s $NEWS_SERVER --sport 119 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT
# ssh (TCP Port 22)# Outgoing Local Client Requests to Remote Servers if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $SSH_PORTS \
--dport 22 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADOR --sport $SSH_PORTS \
--dport 22 -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp ! --syn \
--sport 22 \
-d $IPADDR--dport $SSH_PORTS -j ACCEPT# Incoming Remote Client Requests to Local Servers if [ "$SSH_SERVER" = "1" ]; then
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -ptcp \
--sport $SSH_PORTS \
-d $IPADDR--dport 22 \
-m state --state NEW -j ACCEPT
fi$IPT -A INPUT -i $INTERNET -p tcp \
--sport $SSH_PORTS \
-d $IPADDR --dport 22 -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p tcp ! --syn \
-s $IPADDR --sport 22 \
--dport $SSH_PORTS -j ACCEPT fi################################################################ ftp (TCP Ports 21, 20)# Outgoing Local Client Requests to Remote Servers# Outgoing Control Connection to Port 21 if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 21 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $1NTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 21 -i ACCEPT
$IPT -A INPUT -i $1NTERNET -p tcp! --syn \
--sport 21 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT# Incoming Port Mode Data Channel Connection from Port 20 if [ "$CONNECTION_TRACKING" = "1" ]; then
# This rule is not necessary if the ip_conntrack_ftp
# module is used.
$IPT -A INPUT -i $INTERNET -p tcp \
--sport 20 \
-d $IPADDR --dport $UNPRIVPORTS \
-m state --state NEW -j ACCEPT
fi$IPT -A INPUT, -i $INTERNET -p top \
--sport 20 \
,
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p tcp ! --syn \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 20 -j ACCEPT# Outgoing Passive Mode Data Channel Connection Between Unprivileged Ports if [ "$CONNECTION_TRACKING" = "1" ]; then
# This rule is not necessary if the ip_conntrack_ftp
# module is used.
$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport $UNPRIVPORTS -m state --state NEW -j ACCEPT fi
$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport $UNPRIVPORTS -j ACCEPT
$IPT -A INPUT -i $INTERNET -p top ! --syn \
--sport $UNPRIVPORTS \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT# Incoming Remote Client Requests to Local Servers if [ "$FTP_SERVER" = "1" ]; then
# Incoming Contron Connection to Port 21
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 21 \
-m state --state NEW -j ACCEPT
fi$IPT -A INPUT -i $INTERNET -p tcp\
--sport $UNPRIVPORTS \
-d $IPADDR --dport 21 -j ACCEPT
$IPT -A OUTPUT -o $INTERNET -p tcp ! --syn \
-s $IPADDR --sport 21 \
--dport $UNPRIVPORTS -j ACCEPT
# Outgoing Port Mode Data Channel Connection to Port 20
if [ "$CONNECTION_TRACKINC" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport 20\
--dport SUNPRIVPORTS -m state --state NEW -j ACCEPT
fi$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport 20 \
--dport $UNPRIVPORTS -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp ! --syn \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 20 -j ACCEPT
# Incoming Passive Mode Data Channel Connection Between, Unprivileged Ports if [ "$CONNECTION_TRACKING" = "1"]; then
$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport $UNPRIVPORTS \
-m state --state NEW -j ACCEPT
fi$IPT -A INPUT -i $INTERNET -ptcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p tcp ! --syn \
-s $IPADDR --sport $UNPRIVPORTS \
--dport $UNPRIVPORTS -j ACCEPT fi################################################################ HTTP Web Traffic (TCP Port 80)# Outgoing Local Client Requests to Remote Servers if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 80 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 80 -j ACCEPT$IPT -A INPUT -i $1NTERNET -p tcp! --syn \
--sport 80 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT
# Incoming Remote Client Requests to Local Servers if [ "$WEB_SERVER" = "1" ]; then
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 80 \
-m state --state NEW -j ACCEPT fi$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 80 -j ACCEPT$IPT -A OUTPUT -o $INTERNET -ptcp ! --syn \
-s $IPADDR --sport 80 \
--dport $UNPRIVPORTS -j ACCEPT fi################################################################ SSL Web Traffic (TCP Port 443)# Outgoing Local Client Requests to Remote Servers if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -ptcp \
-s $IPADDR --sport SUNPRIVPORTS \
--dport 443 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p tcp\
-s $IPADDR --sport $UNPRIVPORTS \
--dport 443 -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp ! --syn
--sport 443 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT# Incoming Remote Client Requests to Local Servers if [ "$SSL_SERVER" = "1" ]; then
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 443 \
-m state --state NEW -j ACCEPT fi$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 443 -j ACCEPT$IPT -A OUTPUT -o $INTERNET -ptcp ! --syn \
-s $IPADDR --sport 443 \
--dport $UNPRIVPORTS -j ACCEPT fi################################################################ whois (TCP Port 43)# Outgoing Local Client Requests to Remote Servers if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 43 -m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $1NTERNET -p tcp\
-s $IPADDR --sport $UNPRIVPORTS \
--dport 43 -j ACCEPT$IPT -A INPUT -i $INTERNET -p tcp ! --syn \
--sport 43 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT################################################################ Accessing Remote Network Time Servers (UDP 123)# Note: Some client and servers use source port 123# when querying a remote server on destination port 123. if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $1NTERNET -p udp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $TIME_SERVER --dport 123 \
-m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $TIME_SERVER --dport 123 -j ACCEPT$IPT -A INPUT -i $INTERNET -p udp \
-s $TIME_SERVER --sport 123 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT################################################################ Accessing Your ISP's DHCP Server (UDP Ports 67, 68)# Some broadcast packets are explicitly ignored by the firewall.# Others are dropped by the default policy.# DHCP tests must precede broadcast-related rules, as DHCP relies# on broadcast traffic initially. if [ "$DHCP_CLIENT" = "1" ]; then
# Initialization or rebinding: No lease or Lease time expired.
$IPT -A OUTPUT -o $INTERNET -p udp \
-s $BROADCAST_SRC --sport 68 \
-d $BROADCAST_DEST --dport 67 -j ACCEPT
# Incoming DHCPOFFER from available DHCP servers$IPT -A INPUT -i $INTERNET -p udp \
-s $BROADCAST_SRC --sport 67 \
-d $BROADCAST_DEST --dport 68 -j ACCEPT
# Fall back to initialization
# The client knows its server, but has either lost its lease,
# or else needs to reconfirm the IP address after rebooting.$IPT -A OUTPUT -o $INTERNET -p udp \
-s $BROADCAST_SRC --sport 68 \
-d $DHCP_SERVER --dport 67 -j ACCEPT$IPT -A INPUT -i $INTERNET -p udp \
-s $DHCP_SERVER --sport 67 \
-d $BROADCAST_DEST --dport 68 -j ACCEPT
# As a result of the above, we're supposed to change our IP
# address with this message, which is addressed to our new
# address before the dhcp client has received the update.
# Depending on the server implementation, the destination address
# can be the new IP address, the subnet address, or the limited
# broadcast address.
# If the network subnet address is used as the destination,
# the next rule must allow incoming packets destined to the
# subnet address, and the rule must precede any general rules
# that block such incoming broadcast packets.$IPT -A INPUT -i $INTERNET -p udp \
-s $DHCP_SERVER --sport 67 \
--dport 68 -j ACCEPT
# Lease renewal$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport 68 \
-d $DHCP_SERVER --dport 67 -j ACCEPT$IPT -A INPUT -i $INTERNET -p udp \
-s $DHCP_SERVER --sport 67 \
-d $IPADDR --dport 68 -j ACCEPT
# Refuse directed broadcasts
# Used to map networks and in Denial of Service attacks
iptables -A INPUT -i $INTERNET -d $SUBNET_BASE -j DROP
iptables -A INPUT -i $INTERNET -d $SUBNET_BROADCAST -j DROP
# Refuse limited broadcasts
iptables -A INPUT -i $INTERNET -d $BROADCAST_DEST -j DROP fi################################################################ ICMP Control and Status Messages# Log and drop initial ICMP fragments$IPT -A INPUT -i $INTERNET --fragment -p icmp -j LOG \
--log-prefix "Fragmented ICMP: "$IPT -A INPUT -i $INTERNET --fragment -p icmp -j DROP$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type source-quench -d $IPADDR -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type source-quench -j ACCEPT$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type parameter-problem -d $IPADDR -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type parameter-problem -j ACCEPT$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type destination-unreachable -d $IPADDR -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type fragmentation-needed -j ACCEPT# Don't log dropped outgoing ICMP error messages$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type destination-unreachable -j DROP# Intermediate traceroute responses$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type time-exceeded -d $IPADDR -j ACCEPT# allow outgoing pings to anywhere if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $1PADDR --icmp-type echo-request \
-m state --state NEW -j ACCEPT fi$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type echo-request -j ACCEPT$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type echo-reply -d $IPADDR -j ACCEPT# allow incoming pings from trusted hosts if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p icmp \
-s $MY_ISP --icmp-type echo-request -d $IPADDR \
-m state --state NEW -j ACCEPT fi$IPT -A INPUT -i $INTERNET -p icmp \
-s $MY_ISP --icmp-type echo-request -d$IPADDR -j ACCEPT$IPT -A OUTPUT -o $INTERNET -p icmp \
- -s $IPADDR --icmp-type echo-reply -d $MY_ISP -j ACCEPT################################################################ Logging Dropped Packets# Don't log dropped incoming echo-requests$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type ! 8 -d $IPADDR -j LOG$IPT -A INPUT -i $INTERNET -p tcp \
-d $IPADDR -j LOG$IPT -A OUTPUT -o $INTERNET -j LOG exit 0
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21173334/viewspace-608368/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21173334/viewspace-608368/