【51CTO独家特稿】Linux系统管理员们都接触过Netfilter/iptables,这是Linux系统自带的免费防火墙,功能十分强大。在这个《深入浅出Netfilter/iptables防火墙框架》系列中,51CTO安全/Linux专家李洋将对Netfilter/iptables进行详尽的、条理的介绍。上一篇(基础篇)介绍了netfilter/iptables的原理,本文是入门篇,介绍Netfilter/iptables框架的安装、启动和简单应用。
1、安装和启动Netfilter/iptables系统
因为Netfilter/iptables的netfilter组件是与内核2.4.x集成在一起的,高版本的Linux都配备了netfilter这个内核工具,所以一般不须要下载,而只要下载并安装iptables用户空间工具的源代码包:http://www.netfilter.org/projects/iptables/downloads.html。目前,最新源代码安装包是:iptables-1.4.10.tar.bz2。
在开始安装iptables用户空间工具之前,要对系统做某些修改,主要有如下选项须要配置修改:
- CONFIG_PACKET:如果要使应用程序和程序直接使用某些网络设备,那么这个选项是有用的。
- CONFIG_IP_NF_MATCH_STATE:如果要配置有状态的防火墙,那么这个选项非常重要而且很有用。这类防火墙会记得先前关于信息包过滤所做的决定,并根据它们做出新的决定。
- CONFIG_IP_NF_FILTER:这个选项提供一个基本的信息包过滤框架。如果打开这个选项,则会将一个基本过滤表(带有内置的INPUT、FORWARD和OUTPUT链)添加到内核空间。
- CONFIG_IP_NF_TARGET_REJECT:这个选项允许指定:应该发送ICMP错误消息来响应已被DROP掉的入站信息包,而不是简单地杀死这些信息包。
安装源代码包:
//将源代码文件解压缩 #bzip2 -d iptables-1.4.10-tar.bz2 #tar -xvf iptables 1.4.10.tar //切换目录 #cd iptables 1.4.10 //编译该工具,指定编译的内核目录为/usr/src/linux-2.6.4-8 #make KERNEL_DIR=/usr/src/linux-2.4.16-8 //执行make install命令,同样设定内核目录为/usr/src/linux-2.6.4-8 #make install KERNEL_DIR=/usr/src/linux-2.6.4-8
安装完成后,就可以启动防火墙了:
//使用service命令手工启动 # service iptables start
如果想要在系统启动的时候也启动该防火墙服务,那么可以使用setup命令,然后进入System service选项,选择iptables守护进程即可。
2、 Iptables简单应用
1) 基本规则应用
下面将给出运用上述框架理论形成规则的一些简单示例,以供读者在实际的应用过程中进行模仿和使用:
(1)接受来自指定IP地址的所有流入的数据包:
#iptables -A INPUT -s 203.159.0.10 -j ACCEPT
(2)只接受来自指定端口(服务)的数据包:
#iptables -D INPUT --dport 80 -j DROP
(3)允许转发所有到本地(198.168.10.13)smtp服务器的数据包:
#iptables -A FORWARD -p tcp -d 198.168.10.13 --dport smtp -i eth0 -j ACCEPT
(4)允许转发所有到本地的udp数据包(诸如即时通信等软件产生的数据包):
#iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
(5)拒绝发往WWW服务器的客户端的请求数据包:
#iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j REJECT
(6)允许目的为指定端口的tcp数据包进入:
#iptables -A INPUT -p tcp -m multiport --destination-port 21,53,80,25,110 ACCEPT
(7)允许来源为指定端口的tcp数据包进入:
#iptables -A INPUT -p tcp -m multiport --source-port 21,53,80,25,110 ACCEPT
(8)丢掉SYN和ACK标志位置位的数据包:
#iptables -A INPUT-p tcp --tcp-flags ALL SYN,ACK DROP
2) 碎片检测及流量控制
(1)检查IP碎片:在TCP/IP网络中,链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU,这些被分段的片段就成为IP碎片。那么,如果在防火墙处不对IP碎片进行特别处理的话,那么有可能部分IP碎片会被防火墙拦截,从而影响到接受端对这些碎片的还原,并最终影响到信息的完整性和可用性问题,所以,下面的例子给出防火墙允许IP碎片通过的规则:
#iptables -A FORWARD -p tcp -f -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
需要特别留意上述规则中的-f选项,它指定了第二个以及以后的IP碎片将由防火墙来处理通过,否则的话,考虑下面的规则,防火墙有可能对其第二个及其以后的IP碎片进行拦截,从而影响正常的信息流通:
#iptables -A FORWARD -p tcp -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
(2)速率限制:iptables提供了非常健全的速率控制机制,主要用来限制由外向内的单位时间内通过的数据包个数,这样做的一个直接的好处就是尽可能地抑制前面多次提到的拒绝服务攻击或者是分布式拒绝服务攻击,因为这两种攻击的一个非常典型的表现就是单位时间内有很多数据包涌向目的地。所以,我们可以使用下面的规则来限制单位时间内允许通过防火墙,从而进入被保护网络的数据包个数:
#iptables -A INPUT -m limit --limit 200/second #iptables -A INPUT -m limit --limit 10000/minute
上述两条规则分别限制1秒内和1分钟内通过的数据包个数不能超过200和10000个。当然,在实际应用中,也可以通过/second、/minute、、/hour、/day这样的时间间隔来进行设定,并且,其中诸如200和10000这些具体数值的设定需要用户根据具体情况和经验来进行设定,没有规定的数值可循。
另外,在设定速率限制后,还可以设定超过该限制所触发的一些处理事件,比如说直接丢弃。下面的规则表示当速率超过200限制后,将直接对后续数据包进行丢弃:
#iptables -A INPUT -m limit --limit-burst 200
【编辑推荐】