iptables是基于Linux内核模块的一款防火墙软件,能够针对网络层协议(tcp和udp)数据包过滤,从而加固系统的安全性,这里有两点需要注意:1.由于iptables是基于Linux Kernel工作的所以对系统的性能是有一定影响的,某些业务场景下建议关闭iptables;2.iptables虽然也被称为防火墙,但是毕竟软件级防火墙,不可当作硬件级防火墙(我以前使用过Juniper的SSG-550M-SH,当然价格也非常昂贵)的替代品,尤其防御DoS/DDoS攻击(如CC、SYN flood、DNS Query Flood、SYN Flood、UDP Flood等)iptables毫无作用,准确的说还是把iptables定义为包过滤工具。
默认的iptables是不支持7层(应用层)数据包过滤的,不过可以通过给内核打layer7 patch,使得iptables支持过滤应用层数据包,如腾讯QQ、MSN、迅雷等应用软件数据包的功能,从而能满足小型企业使用一台Linux作为网关并且利用iptables layer7模块限制公司员工工作期间使用QQ聊天,迅雷下载的目的,节约了小公司的运营成本。
下面介绍如何让iptables支持layer 7模块功能,我的系统是RHEL6.2,内核版本2.6.32.22
1.1 安装相关的软件包
#yum install -y ncurses-devel
1.2 下载相关源码包到/usr/src目录下
netfilter-layer7-v2.22.tar.gz
iptables-1.4.20.tar.bz2 //写此文时最新版本的iptables
linux-2.6.32.22.tar.gz //与系统自带kernel版本一致
l7-protocols_2007-11-22.tar.gz
1.3 编译kernel
#cd /usr/scr
#tar xzvf linux-2.6.32.22.tar.gz
#tar xavf netfilter-layer7-v2.22.tar.gz
#ln -s linux-2.6.32.22 linux 创建软连接
#cd /usr/src/linux
#patch -p1 <../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch (注:这里显示patch支持内核的版本范围是2.6.25-2.6.28,但测试用在2.6.32.22上也可以)
#cp /boot/config-2.6.32-220.el6.i686 /usr/src/linux/.config
#make menuconfig 执行之后出现选择内核模块的界面,通过相应的菜单,选择需要加载的模块
1.3 Networking support -->>Networking Options -->>Network packet filtering framework -->>Core Netfilter Configuration ,如图所示
选择完成后保存退出
#make
#make modules_install
#make install
编译完成后重启
#reboot
需要注意的是系统默认是启动原先的内核的,在开机的时候在grub界面选择启动新的内核,上面的是我自己编译过的内核,而下面的是RHEL系统默认启动的内核,我们选择上面的
2.重启进入系统后编译安装iptables
2.1卸载系统默认用rpm包安装的iptables
卸载前我们先把iptables的启动脚本及脚本配置文件备份到/tmp目录
#cp /etc/init.d/iptables /tmp
#cp /etc/sysconfig/iptables-config /tmp
卸载iptables,在卸载时会存在包的依赖关系无法卸载
#rpm -e --nodeps iptables-ipv6 iptables iptstate
2.2编译安装iptables
#cd /usr/src
#tar jxvf iptables-1.4.20.tar.bz2
#cd iptables-1.4.20
#cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extensions/
#./configure --prefix=/usr --with-ksource=/usr/src/linux
#make
#make install
3.编译安装l7protocols
l7protocols 是layer7所能够支持的协议包
#cd /usr/src
#tar xzvf l7-protocols_2007-11-22.tar.gz
#cd l7-protocols_2007-11-22
#make install
4.修改iptables启动脚本,已经备份在/tmp目录下
4.1 修改iptables启动脚本
首先将脚本跟配置文件复制到相应的目录然后再做修改
#cp /tmp/iptables-config /etc/sysconfig/
#cp /tmp/iptables /etc/init.d/
#chmod a+x /etc/init.d/iptables
#vim /etc/init.d/iptables 把所有/sbin/$IPTABLES替换为/usr/sbin/$IPTABLES 在vim命令模式下:%s@/sbin/$IPTABLES@/usr/sbin/$IPTABLES@g 然后保存退出
5.重新启动iptables
#service iptables restart
6.作为网关禁止QQ,MSN,迅雷等
禁止腾讯QQ
#iptables -A FORWARD -s 192.168.62.0/24 -m layer7 --l7proto qq -j DROP
禁止酷狗
#iptables -A FORWARD -s 192.168.62.0/24 -m layer7 --l7proto msn -j DROP
禁止迅雷
#iptables -A FORWARD -s 192.168.62.0/24 -m layer7 --l7proto xunlei -j DROP
7.本机禁止登录QQ测试
7.1首先我没有增加layer7的iptables策略,登录QQ
可以看出网络是正常的,QQ也可以正常登录
7.2 增加iptables策略
#iptables -A OUTPUT -s 192.168.62.0/24 -m layer7 --l7proto qq -j DROP
#service iptables save
重新登录QQ
可以看出网络仍然是正常的,但无法登录QQ,提示连接服务器超时,从而达到我们要的效果
补充:有哪些可以被禁止的应用层协议呢?
#ls /etc/l7-protocols/protocols/ 只要里面有的都可以封杀,使用方法跟上面的一样,将其目录中对应文件的后缀名去掉
比如说,此目录里有个pplive.pat 的文件,那么实现网关上禁止pplive的方法则是
#iptables -A FORWARD -s 192.168.62.0/24 -m layer7 --l7proto pplive -j DROP
PS:关于朋友留言给我提问l7模块是否能限制web qq的使用呢?
答案是否定的,通过测试可以看到,客户端QQ软件无法登录,但webQQ可以登录。道理很简单,使用浏览器登录web QQ是用的http协议而不是qq的应用协议,所以可以使用web QQ。