Netfilter/Iptables Layer7 应用层过滤策略


    Netfilter/Iptables 作为一个典型的包过滤防火墙体系,对于网络层,传输层的数据包过滤具有非常优秀的性能和效率,然而,对于一些面向局域网上网用户的Linux网关服务器,有时候还需要使用QQ,MSN等聊天,使用BT下载工具等现象进行封锁。下面将介绍如何为Netfilter/Iptables 增加应用层过滤。


    QQ,MSN等聊天,使用BT下载工具均使用了相对固定的应用层协议。使用L7-filter项目的补丁文件包可以为linux内核增加相应的应用层过滤功能,结合其提供的l7-protocols第7层协议定义包,能够识别不同应用层的数据特征


L7-filter项目站点:http://l7-filter.sourceforge.net/  下载最新的补丁包及协议包

内核站点:http://www.kernel.org    下载内核,iptables的源码包


注意:L7-filter补丁包内的数据,要与内核及iptables源码版本相匹配


将netfilter-layer7 源码包中的对应补丁文件添加到内核源码中,对内核进行重新编译,安装,安装后使用新内核启动Linux操作系统。


注意:源码目录所在分区至少保持有2.5G的剩余磁盘空间。

wget http://jaist.dl.sourceforge.net/project/l7-filter/l7-filter%20kernel%20version/2.22/netfilter-layer7-v2.22.tar.gz
wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.8.tar.xz
wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.2.tar.bz2
wget http://jaist.dl.sourceforge.net/project/l7-filter/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz


帮助文件:http://l7-filter.sf.net/HOWTO-kernel 

netfilter-layer7:netfilter-layer7-v2.22.tar.gz

Linux内核源码包:linux-2.6.28.8.tar.xz

l7-protocols协议包:l7-protocols-2009-05-28.tar.gz      

iptables源码包:iptables-1.4.2.tar.bz2  


内核编译步骤:

解包

配置make menuconfig

编译

安装


1.解压释放netfilter-layer7 和内核源码包,使用patch工具合并补丁文件

yum -y install xz
xz -d linux-2.6.28.8.tar.xz 
tar xf linux-2.6.28.8.tar -C /usr/src/
tar xf netfilter-layer7-v2.22.tar.gz -C /usr/src/
cd /usr/src/linux-2.6.28.8/
patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch 
------------------------------------------------------------------------------
patching file net/netfilter/Kconfig
Hunk #1 succeeded at 757 with fuzz 1 (offset -38 lines).
patching file net/netfilter/Makefile
Hunk #1 succeeded at 78 with fuzz 2 (offset -6 lines).
patching file net/netfilter/xt_layer7.c
patching file net/netfilter/regexp/regexp.c
patching file net/netfilter/regexp/regexp.h
patching file net/netfilter/regexp/regmagic.h
patching file net/netfilter/regexp/regsub.c
patching file net/netfilter/nf_conntrack_core.c
Hunk #1 succeeded at 206 (offset 5 lines).
patching file net/netfilter/nf_conntrack_standalone.c
Hunk #1 succeeded at 162 (offset -3 lines).
patching file include/net/netfilter/nf_conntrack.h
patching file include/linux/netfilter/xt_layer7.h



2.重新配置内核编译参数,添加state机制及layer7支持

使用当前RHEL5系统的内核配置文件作为参考,在此基础上添加新的功能

cp /boot/config-2.6.18-194.el5 .config
make menuconfig


在配置界面中,方向键用于定位需要配置的项目

select进入子配置菜单

exit返回上一层

help查看帮助信息

空格切换所选项目的编译类型


三种状态:

[]表示不需要该功能

[M]将功能编译成模块

[*]将功能直接编入内核


Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) ---> Core Netfilter Configuration ---> 

  Netfilter connection tracking support  

    "layer7" match support   

    "string" match support

    "time" match support

    "iprange" address range match support    

    "connlimit" match support"  

    "state" match support  

    "conntrack" connection match support

    "mac" address match support

    "multiport" Multiple port match support

 

Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration ---> 

  IPv4 connection tracking support (required for NAT) 

    Full NAT                                                                           

      MASQUERADE target support                                                        

      NETMAP target support                                                            

      REDIRECT target support   


Netfilter/Iptables Layer7 应用层过滤策略_第1张图片

Netfilter/Iptables Layer7 应用层过滤策略_第2张图片

Netfilter/Iptables Layer7 应用层过滤策略_第3张图片

Netfilter/Iptables Layer7 应用层过滤策略_第4张图片

Netfilter/Iptables Layer7 应用层过滤策略_第5张图片

Netfilter/Iptables Layer7 应用层过滤策略_第6张图片

Netfilter/Iptables Layer7 应用层过滤策略_第7张图片

Netfilter/Iptables Layer7 应用层过滤策略_第8张图片

Netfilter/Iptables Layer7 应用层过滤策略_第9张图片

Netfilter/Iptables Layer7 应用层过滤策略_第10张图片

Netfilter/Iptables Layer7 应用层过滤策略_第11张图片

Netfilter/Iptables Layer7 应用层过滤策略_第12张图片

Netfilter/Iptables Layer7 应用层过滤策略_第13张图片

Netfilter/Iptables Layer7 应用层过滤策略_第14张图片

  

使用Exit返回 最后当提示保存时,使用Yes确认保存,修改将保存到源码目录中的.config文件中。

/usr/src/linux-2.6.28.8/.config


3.编译新内核,并安装新内核文件

make && make modules_install && make install


新内核编译安装过程将花费较长时间,数十分钟到数小时不等

新内核文件被安装到/boot目录,模块文件将复制到/lib/modules/2.6.28

[root@www iptables-1.4.2]# ls -l /boot/*2.6.28*
-rw------- 1 root root 2604581 12-08 10:16 /boot/initrd-2.6.28.8.img
-rw-r--r-- 1 root root 1129804 12-08 10:15 /boot/System.map-2.6.28.8
-rw-r--r-- 1 root root 2102800 12-08 10:15 /boot/vmlinuz-2.6.28.8     
[root@www iptables-1.4.2]# du -sh /lib/modules/2.6.28.8/
318M/lib/modules/2.6.28.8/

如果编译内核,途中断过,想重新编译,那么先使用

make mrproper    删除不必要的文件和目录,初次编译内核不需要

make clean       删除不必要的模块和文件


4.调整GRUB引导菜单,使系统以新内核启动,然后重启linux服务器

vi /boot/grub/grub.conf

default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.28.8)
        root (hd0,0)
        kernel /vmlinuz-2.6.28.8 ro root=LABEL=/ rhgb quiet
        initrd /initrd-2.6.28.8.img
title Red Hat Enterprise Linux Server (2.6.18-194.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-194.el5 ro root=LABEL=/ rhgb quiet
        initrd /initrd-2.6.18-194.el5.img
reboot


重新编译安装iptables及安装l7-protocols协议包


除了要对linux内核应用layer7补丁以外,对iptables同样需要应用layer7补丁,才能完整实现应用层过滤功能,在解包后的/usr/src/netfilter-layer7-v2.22/目录中也包括针对iptables源码包的补丁文件。l7-protocols协议包用于为iptables提供判断别应用层数据的特征依据。


1.卸载原有系统中的iptables

cp /etc/rc.d/init.d/iptables /tmp/          备份iptables启动脚本
cp /etc/sysconfig/iptables.config /tmp      备份iptables配置文件
rpm -e iptables-ipv6 iptables iptstate --nodeps


2.解压释放iptables,并应用补丁文件(复制extensions子目录即可)

tar xf iptables-1.4.2.tar.bz2 -C /usr/src/
cd /usr/src/iptables-1.4.2/
cp /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*   extensions/


3.配置,编译并安装iptables,需要使用--with-ksource 参数指定内核源码路径

./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.28.8
make && make install


4.安装l7-protocols协议包

tar xf l7-protocols-2009-05-28.tar.gz 
cd l7-protocols-2009-05-28
make install


5.恢复iptables启动脚本及配置文件

cp /tmp/iptables /etc/init.d/iptables
cp /tmp/iptables.config /etc/sysconfig/iptables.config


vim /etc/rc.d/init.d/iptables 编辑iptables启动脚本

把$iptables的路径改成/sbin/$iptables

service iptables start
chkconfig iptables on


如果在防火墙启动的时候报错

Loading additional iptables modules: ip_conntrack_netbios_n[FAILED]


vi /etc/sysconfig/iptables-config

注释掉

#IPTABLES_MODULES="ip_conntrack_netbios_ns"


使用iptables 设置应用层过滤规则


使用layer7显示匹配策略过滤使用QQ,MSN Edonkey等应用层协议的数据访问

iptables -A FORWARD -m layer7 --l7proto qq -j DROP
iptables -A FORWARD -m layer7 --l7proto msn-filetransfer -j DROP
iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP
iptables -A FORWARD -m layer7 --l7proto bittorrenr -j DROP
iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP
iptables -A FORWARD -m layer7 --l7proto edonkey -j DROP


使用--connlimit 显示匹配进行数据并发连接控制,超过100个并发连接将拒绝

iptables -A FORWARD -p tcp --syn -m connlimit --connlimit-above 100 -j DROP


使用--time显示匹配根据时间范围设置访问策略,允许周一到周五 8:00-18:00之间的数据访问

iptables -A FORWARD -p tcp --dport 80 -m time --timestart 8:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT


使用string显示匹配策略过滤包含tencent,verycd,***,***的网络访问

iptables -A FORWARD -p udp --dport 53 -m string --string "qq" --algo bm -j DROP
iptables -A FORWARD -p udp --dport 53 -m string --string "tencent" --algo bm -j DROP
iptables -A FORWARD -p udp --dport 53 -m string --string "verycd" --algo bm -j DROP
iptables -A FORWARD -p udp --dport 53 -m string --string "***" --algo bm -j DROP
iptables -A FORWARD -p udp --dport 53 -m string --string "***" --algo bm -j DROP


其中--algo参数用于指定字符串识别算法,bm 或 kmp



备注1:

XZ压缩最新压缩率之王

xz是绝大数linux默认就带的一个压缩工具。压缩的比例大,但是时间慢


xz -z 要压缩的文件

如果要保留被压缩的文件加上参数 -k ,如果要设置压缩率加入参数 -0 到 -9调节压缩率。如果不设置,默认压缩等级是6.

xz -d 要解压的文件

同样使用 -k 参数来保留被解压缩的文件。


创建或解压tar.xz文件的方法


习惯了tar czvf或tar xzvf的人可能碰到tar.xz也会想用单一命令搞定解压或压缩。其实不行 

tar里面没有征对xz格式的参数比如:

z是针对gzip

j是针对 bzip2

创建tar.xz文件:只要先tar cvf Crushlinux.tar Crushlinux/这样创建Crushlinux.tar文件先,然后使用xz -z Crushlinux.tar来将Crushlinux.tar压缩成为Crushlinux.tar.xz

解压tar.xz文件:先xz -d Crushlinux.tar.xz将Crushlinux.tar.xz解压成Crushlinux.tar 然后,再用tar xvf Crushlinux.tar来解包