简介:在Linux的防火墙体系Netfilter下有一个独立的模块L7 filter 。从字面上看Netfilter是对网络数据的过滤,L7 filter是基于数据流应用层内容的过滤。不过实际上 L7 filter的本职工作不是对数据流进行过滤而是对数据流进行分类。它使用模式匹配算法把进入设备的数据包应用层内容与事先定义好的协议规则进行比对,如果匹配成功就说明这个数据包属于某种协议。

L7 filter是基于数据流工作的,建立在Netfilter connstrack功能之上。因为一个数据流或者说一个连接的所有数据都是属于同一个应用的,所以L7 filter没有必要对所有的数据包进行模式匹配,而只匹配一个流的前面几个数据包 (比如10个数据包)。当一个流的前面几个数据包包含了某种应用层协议的特征码时 (比如QQ,MSN,迅雷等),则这个数据流被L7 filter识别;当前面几个数据包的内容没有包含某种应用层协议的特征码时,则L7 filter放弃继续做模式匹配,这个数据流也就没有办法被识别。

总体步骤:
1、7层过滤首先需要内核支持,因此重新编译内核,给新内核加入Layer 7补丁;
2、卸载系统自带的iptables,先保存旧的的配置信息,新的可以引用;
3、安装Layer 7;
4、安装Layer 7协议;


所需要的源码包和补丁包:
linux-2.6.28.10.tar.gz    

下载地址:  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.10.tar.gz
netfilter-layer7-v2.22.tar.gz
iptables-1.4.6.tar.bz2
l7-protocols-2009-05-28.tar.gz

以上的三个软件包,下载地址:

http://down.51cto.com/data/362187

步骤如下:

  1. 为内核打上l7filter的补丁: 
  2. #tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src            
  3. 解压内核到/usr/src 
  4.  
  5. #tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src 
  6. 解压l7filter到/usr/srcc 
  7.  
  8. #cd /usr/src 
  9. #ln -sv  linux-2.6.28.10  linux 
  10. #cd /usr/src/linux/ 
  11. #patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch 
  12. 为内核打上l7filter的补丁 
  13.  
  14. #cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config 
  15. 为编译内核提供一个config模版 
  16.  
  17. #make  menuconfig 


进入图形化界面,配置内核参数,根据自身的需要进行适当的增删
但要让内核支持l7filter则以下选项必须选上:

  1. Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration 
  2. <M>  Netfilter connection tracking support 
  3. <M>  “layer7” match support 
  4. <M>  “string” match support 
  5. <M>  “time”  match support 
  6. <M>  “iprange”  match support 
  7. <M>  “connlimit”  match support 
  8. <M>  “state”  match support 
  9. <M>  “conntrack”  connection  match support 
  10. <M>  “mac”  address  match support 
  11. <M>   "multiport" Multiple port match support 
  12.  
  13.  
  14. Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration 
  15. <M> IPv4 connection tracking support (required for NAT) 
  16. <M>   Full NAT 
  17.     <M>     MASQUERADE target support 
  18.     <M>     NETMAP target support 
  19.     <M>     REDIRECT target support  


#make
#make modules_install
#make install



内核编译完成后,重新启动操作系统,使用新的内核启动。
华丽的分割线

---------------------------------------------------------------------------------------------

使用新内核启动系统后:
到此,内核对l7filter的支持已经具备,接下来只需要重新编译安装iptbales,由于编译安装iptables后,并不会提供SysV风格的启动脚本,因此我们在卸载之前安装的那个iptables时,对其进行一下备份,将其保存在家目录中:
#cp /etc/init.d/iptables ~/iptables
#cp /etc/sysconfig/iptables-config ~/

#rpm -e iptables-ipv6  iptables  iptstate  --nodeps
卸载之前安装的iptables,因为其具有依赖性,所以这里使用"--nodeps"
#tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src
#cd /usr/src/iptables-1.4.6
#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


安装l7filter协议
#tar zxvf l7-protocols-2009-05-28.tar.gz
#cd l7-protocols-2009-05-28
#make install
#mv ~/iptables  /etc/rc.d/init.d/

启动支持l7filter的iptables
#service iptables start