具体实施方式
以下对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
netfilter提供了一个抽象、通用化的框架,作为中间件,为每种网络协议(IPv4、IPv6等)定义一套钩子函数。Ipv4定义了5个钩子函数,这些钩子函数在数据报流过协议栈的5个关键点被调用,也就是说,IPv4协议栈上定义了5个“允许垂钓点”。在每一个“垂钓点”,都可以让netfilter放置一个“鱼钩”,把经过的网络包(Packet)钓上来,与相应的规则链进行比较,并根据审查的结果,决定包的下一步命运,即是被原封不动地放回IPv4协议栈,继续向上层递交;还是经过一些修改,再放回网络;或者干脆丢弃掉。
netfilter主要采用连线跟踪(Connection Tracking)、包过滤(Packet Filtering)、地址转换、包处理(Packet Mangling)4种关键技术。
连线跟踪是包过滤、地址转换的基础,它作为一个独立的模块运行。采用连线跟踪技术在协议栈低层截取数据包,将当前数据包及其状态信息与历史数据包及其状态信息进行比较,从而得到当前数据包的控制信息,根据这些信息决定对网络数据包的操作,达到保护网络的目的。
当下层网络接收到初始化连接同步(Synchronize,SYN)包,将被netfilter规则库检查。该数据包将在规则链中依次序进行比较。如果该包应被丢弃,发送一个复位(Reset,RST)包到远端主机,否则连接接收。这次连接的信息将被保存在连线跟踪信息表中,并表明该数据包所应有的状态。这个连线跟踪信息表位于内核模式下,其后的网络包就将与此连线跟踪信息表中的内容进行比较,根据信息表中的信息来决定该数据包的操作。因为数据包首先是与连线跟踪信息表进行比较,只有SYN包才与规则库进行比较,数据包与连线跟踪信息表的比较都是在内核模式下进行的,所以速度很快。
包过滤检查通过的每个数据包的头部,然后决定如何处置它们,可以选择丢弃,让包通过,或者更复杂的操作。
网络地址转换源(NAT)分为(Source NAT,SNAT)和目的NAT(Destination NAT,DNAT)2种不同的类型。SNAT是指修改数据包的源地址(改变连接的源IP)。SNAT会在数据包送出之前的最后一刻做好转换工作。地址伪装(Masquerading)是SNAT的一种特殊形式。DNAT 是指修改数据包的目标地址(改变连接的目的IP)。DNAT总是在数据包进入以后立即完成转换。端口转发、负载均衡和透明代理都属于DNAT。
利用包处理可以设置或改变数据包的服务类型(Type of Service,TOS)字段;改变包的生存期(Time to Live,TTL)字段;在包中设置标志值,利用该标志值可以进行带宽限制和分类查询。
本发明涉及以太网络封包流量的控制,实现了可以从应用层实现协议识别功能,它的实现原理是基于特征的关键字匹配。但是它不是简单的匹配某个单字和词,它使用了更高级“正则”来进行匹配。
L7filter有对网络数据包过滤,流量管理等功能,作为iptables的一个扩展,iptables加载l7filter的命令语法的一个实施例为:
iptables [specify table & chain] -m layer7 --l7proto [name of protocol] -j [action]
通常是操作iptables的mangle表如
iptables -t mangle -A POSTROUTING -m layer7 --l7proto [etc.]
禁止应用层服务
L7filter可以禁止QQ、HTTP、FTP、MSN、P2P等应用服务,例如作如下规则,不允许用户使用MSN,iptables命令规则为
iptables -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP
--l7proto后面加/etc/l7-protocols/protocols下面protocol名msnmessenger
限制单一IP
iptables -s 192.168.100.161 -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP
限制子网访问
iptables -s 192.168.100.0/24 -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP
流量限制
流量限制也是iptables与Linux下的TC结合控制应用服务流量的,只有iptables规则不一样。官方有一个shell脚本自动加载iptables策略
http://l7-filter.sourceforge.net/L7-Netfilter-example-nonbridge。
删除iptables mangle和TC策略
iptables -t mangle –F
tc qdisc del dev eth0 root
#缺省控制
tc qdisc add dev eth0 root handle 1: htb default 10
#设置类1:1总频宽
tc class add dev eth0 parent 1: classid 1:1 htb rate 1200kbps ceil 1200kbps
#设置http流量
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 300kbps ceil 500kbps prio 1
#设置BT
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20kbps ceil 200kbps prio 3
#设置队列规则
tc qdisc add dev eth0 parent 1:10 handle 11: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 12: sfq perturb 10
#设置过滤规则
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:10
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 1:20
#设置iptables
iptables -t mangle -A POSTROUTING -m layer7 --l7proto http -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j MARK --set-mark 2
可以看出主要是在iptables里控制,TC和普通控制相同。
Accouting
要统计跟踪应用服务的流量,如http、pop3等可用下面的命令得到
iptables -t mangle -A POSTROUTING -m layer7 --l7proto http
iptables -t mangle -A POSTROUTING -m layer7 --l7proto pop3
#查看流量
iptables -L -t mangle –nv
本发明的方法,如图1所示:在带有netfilter的Linux系统的网关服务器上安装L7-filter模块;利用所述L7-filter识别网络数据的协议并对应用层服务进行网络访问限制和/或流量控制,包括禁止应用层服务对网络的访问,限制单一IP地址访问,对应用层服务进行流量限制,设置网络访问过滤规则,流量统计,设置IP转发。该方法能够有效的识别各种通讯协议,做出正确判断,调用相应的流量控制方法,使网络环境更加优化。
以下通过一个具体的实例对本发明进行进一步阐述。
采用:内核补丁kernel-2.6.25-2.6.28-layer7-2.21.patch;Iptables的补丁iptables-1.4.1.1-for-kernel-2.6.20forward;内核版本linux-2.6.27;Iptables选择为iptables-1.4.1.1.tar。
1.为内核及iptables打l7filter补丁
1.1安装gcc
安装CentOS5.2时采用自定义软件,然后选中“based”并取消其它全部选定,进行基本安装。安装完成进入系统,首先安装GCC。
# rpm -ivhU kernel-headers-2.6.18-92.el5.i386.rpm
# rpm -ivhU glibc-headers-2.5-24.i386.rpm
# rpm -ivhU glibc-devel-2.5-24.i386.rpm
# rpm -ivhU libgomp-4.1.2-42.el5.i386.rpm
# rpm -ivhU cpp-4.1.2-42.el5.i386.rpm
# rpm -ivhU gcc-4.1.2-42.el5.i386.rpm
查看一下GCC版本:
# gcc -v
gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)
再查看当前内核版本:
# uname -r
2.6.19-default
还需要安装如下RPM包,这个包是在#make menuconfig 时必需的,否则报错:
# rpm -ivhU ncurses-devel-5.5-24.20060715.i386.rpm
1.2 给内核打补丁
先将l7filter解压:
# tar zxvf netfilter-layer7-v2.21.tar.gz
再给内核打l7filter补丁:
# tar zxvf linux-2.6.27.tar.gz
# cd linux-2.6.27
# patch -p1 < ../netfilter-layer7-v2.21/kernel-2.6.25-2.6.28-layer7-2.21.patch
还需要修改如下文件,否则编译时出错:
# vi scripts/kconfig/mconf.c
将static struct menu *current_menu;这一行注释掉,
并添加struct menu *current_menu;如下:
//static struct menu *current_menu;
struct menu *current_menu;
把以前的配置文件拷贝到当前内核目录,以继承原有配置:
# cp /boot/config-2.6.18-92.el5 ./.config
# make mrproper @@@删除不必要的文件和目录,初次编译内核不需要
# make clean @@@删除不必要的模块和文件
# make menuconfig @@@基于文本选单的配置界面,字符终端下推荐使用
选择相应的配置时,有三种选择,它们分别代表的含义如下:
Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
Networking support --->Networking options--->Network packet filtering framework (Netfilter) --->Core Netfilter Configuration --->
选中如下两行:
<M>"layer7" match support
[*] Layer 7 debugging output
然后保存退出内核配置模式。
# make dep @@@链接程序代码和函数库
# make bzImage @@@开始编译系统内核,此步大约需要25分钟
# make modules @@@开始编译外挂模块,此步大约需要1个小时
# make modules_install @@@安装编译完成的模块
# make install @@@将刚才编译完成的内核安装到系统里面
编译内核完成后,用新内核启动,然后进入系统
看一下当前系统内核:
# uname -r
2.6.27
1.3 安装iptables
下面给iptables打l7filter补丁,并编译、安装:
# tar jxvf iptables-1.4.1.1.tar.bz2
# cd iptables-1.4.1.1
# ln -s /home/l7filter/linux-2.6.27 /usr/src/linux
#cp netfilter-layer7-v2.21/iptables-1.4.1.1-for-kernel-2.6.20forward/libxt_layer7.* iptables-1.4.1.1/extensions/
# ./configure --with-ksource=/usr/src/linux/
#make
#make install
查看一下iptables的版本信息:
# iptables -v
iptables v1.4.1.1: no command specified
Try `iptables -h' or 'iptables --help' for more information.
现在已经完成了内核和iptables对l7filter的支持工作,下面开始设置。
1.4安装l7-filter协议文件:
# tar zxvf l7-protocols-2008-12-18.tar.gz
# cd l7-protocols-2008-12-18
# make install @@@进行安装,只是拷贝了一些文件到/etc目录
mkdir -p /etc/l7-protocols
cp -R * /etc/l7-protocols
2.利用l7filter来封禁迅雷、qq、msn等。
首先查看一下l7filter支持的封禁列表:
# ls /etc/l7-protocols/protocols/
100bao.pat gkrellm.pat ncp.pat ssdp.pat
aim.pat gnucleuslan.pat netbios.pat ssh.pat
aimwebcontent.pat gnutella.pat nntp.pat ssl.pat
applejuice.pat goboogy.pat ntp.pat stun.pat
ares.pat gopher.pat openft.pat subspace.pat
armagetron.pat guildwars.pat pcanywhere.pat subversion.pat
battlefield1942.pat h323.pat poco.pat teamfortress2.pat
battlefield2142.pat halflife2-deathmatch.pat pop3.pat teamspeak.pat
battlefield2.pat hddtemp.pat pplive.pat telnet.pat
bgp.pat hotline.pat qq.pat tesla.pat
biff.pat http.pat quake1.pat tftp.pat
bittorrent.pat http-rtsp.pat quake-halflife.pat thecircle.pat
chikka.pat ident.pat radmin.pat tor.pat
cimd.pat imap.pat rdp.pat tsp.pat
ciscovpn.pat imesh.pat replaytv-ivs.pat unknown.pat
citrix.pat ipp.pat rlogin.pat unset.pat
counterstrike-source.pat irc.pat rtp.pat uucp.pat
cvs.pat jabber.pat rtsp.pat validcertssl.pat
dayofdefeat-source.pat kugoo.pat shoutcast.pat ventrilo.pat
dhcp.pat live365.pat sip.pat vnc.pat
directconnect.pat liveforspeed.pat skypeout.pat whois.pat
dns.pat lpd.pat skypetoskype.pat worldofwarcraft.pat
doom3.pat mohaa.pat smb.pat x11.pat
edonkey.pat msn-filetransfer.pat smtp.pat xboxlive.pat
fasttrack.pat msnmessenger.pat snmp.pat xunlei.pat
finger.pat mute.pat socks.pat yahoo.pat
freenet.pat napster.pat soribada.pat zmaap.pat
ftp.pat nbns.pat soulseek.pat
从中可以看到,l7filter支持的封禁协议相当丰富,并且支持都很好。
以下命令将msn、qq、迅雷、电驴、BT进行了封禁:
# iptables -t mangle -I POSTROUTING -m layer7 --l7proto msnmessenger -j DROP
# iptables -t mangle -I POSTROUTING -m layer7 --l7proto qq -j DROP
# iptables -t mangle -I POSTROUTING -m layer7 --l7proto xunlei -j DROP
#iptables -t mangle -I PREROUTING -m layer7 --l7proto edonkey -j DROP
#iptables -t mangle -I PREROUTING -m layer7 --l7proto bittorrent -j DROP
启动IP转发,使客户端可以通过pppoe服务器访问外网:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 0/0
以下进行测试(装有l7filter的服务器作为企业网络的网关,这里该服务器IP为192.168.1.251):
C:\Documents and Settings\Administrator>tracert www.baidu.com
Tracing route to www.a.shifen.com [220.181.6.18]
Over a maximum of 30 hops:
1 1 ms <1 ms <1 ms 192.168.1.251
2 * 18 ms 17 ms 61.130.120.131
3 17 ms 17 ms 18 ms 61.130.126.45
4 17 ms 17 ms 17 ms 61.164.3.241
5 17 ms 19 ms 18 ms 61.164.9.189
6 37 ms 38 ms 37 ms 202.97.49.30
7 56 ms 55 ms 57 ms 202.97.37.149
8 57 ms 57 ms 57 ms 220.181.16.149
9 63 ms 68 ms 70 ms 220.181.16.10
10 60 ms 59 ms 59 ms 220.181.17.146
11 56 ms 57 ms 57 ms 220.181.6.18
Trace complete.
查看当前封禁情况:
# iptables -t mangle -L POSTROUTING -v
Chain POSTROUTING (policy ACCEPT 386 packets, 41321 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any any anywhere anywhere LAYER7 l7proto aim
0 0 DROP all -- any any anywhere anywhere LAYER7 l7proto bittorrent
0 0 DROP all -- any any anywhere anywhere LAYER7 l7proto edonkey
0 0 DROP all -- any any anywhere anywhere LAYER7 l7proto xunlei
0 0 DROP all -- any any anywhere anywhere LAYER7 l7proto qq
0 0 DROP all -- any any anywhere anywhere LAYER7 l7proto msnmessenger
其它的封禁情形不再一一演示,l7filter是个功能相当强大的七层网管。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。