
本次对iptabbles+l7的介绍分为两部分:
% c- a6 o& y6 K, ?第一部分——————对系统升级打l7补丁" q1 U- T! n! n# s# r
第二部分——————对iptables+l7的应用
& S1 ]0 A: x% K+ L1 _5 B- C第一部分:对系统升级打补丁/ c1 Q9 v" g' j+ q
为了使用l7层协议进行控制,我们要在内核中打补丁文件,需要重新编译内核文件,下面的每一步都需要小心谨慎,不然就要重头开始了~需要软件的朋友可以Q395061796
/ K1 x* u$ `5 R& A% c软件需求:$ V5 p# c0 y6 V& Y/ r9 F

/ O- F# g, \' I' ?& y) h5 m9 P1、 拆解内核文件与layer7文件:. Z1 ^1 o& G! Z. ?: ~: O3 x
[root@zhangc ~]# tar jxvf linux-2.6.25.19.tar.bz2 -C /usr/src/
1 ~$ X% V/ D+ g8 D) J" D6 y[root@zhangc ~]# tar zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/
+ g0 U& m J" m2、 将补丁文件放入内核文件夹内
' o, X, \: C5 Z m4 x- b7 s3 k[root@zhangc ~]# cd /usr/src/linux-2.6.25.19/
6 o! @; b C/ b* y; L' S3 B- M[root@zhangc linux-2.6.25.19]# patch -p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch
+ m3 D- \0 ^# \" G% G+ C3、 使用内核文件配置新内核6 |4 e5 A I4 T' d* t. n m
[root@zhangc linux-2.6.25.19]# cp /boot/config-2.6.18-164.el5 .config
; `& Q2 Z2 e& h, Z: T y, G[root@zhangc linux-2.6.25.19]#make menuconfig: ^8 M0 G0 \2 u
将一些需要的服务选项选为M,编译为模块。
6 V2 V8 j; w! }. G第一部分选项:. q0 ?# v/ q6 H
8 j: a( e, I4 Q6 S) I
+ \0 {+ R& O" d/ D* f0 j/ a1 ?

! e9 ?% B% F7 M' ~7 ^* A Q6 I. S0 m5 }) B( E
编译以下3个模块- i+ ]5 t' l$ O1 V8 P
( M6 P$ W1 J, _5 _; v

& y+ }9 ]& V9 T, J& i
J, N9 T# O0 B' M& j# J& A( c第二部分选项:" k- Z7 O `, X" o

3 A1 r/ d" I) J& L5 e & b$ n: t9 d- e1 X! u6 l- ^

5 |* J& F7 z( a d5 N& N
# a2 T$ s0 c; k5 ]编译以下4个模块
# _" \ r" K. k) W# z7 n, H
/ K; ?$ e* C& _" g( ~( S+ u/ m % f+ L. r( D% ?$ s S/ }- @

, D8 L/ X$ ^) d) `5 f
3 k+ X W% s! d! ?% g# u4.编译内核、安装模块、安装内核
/ W5 Q4 G7 `: v X9 G3 Z[root@zhangc linux-2.6.25.19]# make
7 ?3 [2 H7 I8 g S* J. _# R9 G! e[root@zhangc linux-2.6.25.19]# make modules_install* z1 f& H5 ?8 x4 D& F7 r7 c7 e" M0 R" t8 o
[root@zhangc linux-2.6.25.19]# make install/ B1 Q5 P+ E1 w% i
5.卸载老版本iptables
8 y% P" ]( E7 J[root@zhangc ~]# rpm -e iptables –nodeps; j( Y/ N3 [+ K( i; w) K' F* ^$ O
6.拆解并合并iptables+layer7补丁
& R8 a8 g3 ~: p7 a1 h2 H9 o4 T[root@zhangc ~]# tar jxvf iptables-1.4.2.tar.bz2 -C /usr/src/: y' Z# C- b8 J& i# b' u, A% m
[root@zhangc ~]# cd /usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward/
8 J b) O( b: [[root@zhangc iptables-1.4.1.1-for-kernel-2.6.20forward]# cp * /usr/src/iptables-1.4.2/extensions/
. \8 A8 `! j% T6 l4 Z7.编译并安装1 o2 Q9 t7 S( M- ] B- e
[root@zhangc iptables-1.4.1.1-for-kernel-2.6.20forward]# cd /usr/src/iptables-1.4.2/
& T; p& B& r+ C+ P, a0 z[root@zhangc iptables-1.4.2]# ./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19/
. D: {6 ^. w' x1 X0 Y2 e2 Z[root@zhangc iptables-1.4.2]# make; ^+ Z# U2 h- p2 v( r' E1 t: c! c
[root@zhangc iptables-1.4.2]# make install
a5 K% C& g- _, [4 b6 V8.安装l7-prorocols模式包
9 ?+ ^) G9 \$ M# D[root@zhangc ~]# tar zxvf l7-protocols-2008-10-04.tar.gz -C /etc/5 i/ d0 u. E* Q4 ?" s% \
[root@zhangc ~]# mv /etc/l7-protocols-2008-10-04/ /etc/l7-protocols
# X/ y6 k4 ?9 m4 o9.修改文件ip6tables,能正常启用service
6 C1 R- O+ {/ Y+ r8 ][root@zhangc ~]# vim /etc/init.d/ip6tables /etc/init.d/iptables' f) M1 U8 a$ E+ l f
[root@zhangc ~]# service iptables save【这条命令进行测试】
0 M; m Z6 U+ A' N[root@zhangc ~]# service iptables restart
, `+ R: h* G. [7 t- `5 e1 j 7 m! X7 q! c9 }% W G2 a
10.系统的修补已经完成,可以正常使用iptables+l7.* o1 G7 C7 M& e+ l1 y0 o

7 {& b' `2 S$ J第二部分:iptables+l7的应用
2 Q9 _! |, _0 Yl7规则的格式:
/ u8 R. ^5 J8 ~$ ^* k通过向防火墙提供有关对来自某个源地址、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用iptables系统提供的特殊命令iptables建立这些规则,并将其添加到内核空间特定信息包过滤表内的链中。关于添加、去除、编辑规则的命令,一般语法如下:
, Q6 Z: v: e# Q% B5 wiptables [-t table] command [match] [target]# d% B0 x! d! k, ~# g, m/ i
1.表(table)% P! r. Z' t) [" ~6 }/ {: b
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三个可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter作为缺省表。
& u* {# H' m* C+ ~$ YFilter用于一般的信息包过滤,包含INPUT,OUTPUT,FORWARD链3 ^, A+ V4 l, O
Nat 用于要转发的信息包,包含PREROUTING,OUTPUT,POSTROUTING链- W) y* ^9 }( g6 t" t9 Y) ]) y
2.命令(command)
2 A/ Y+ x; j4 k3 Z: U6 hcommand部分是iptables命令最重要的部分。它告诉iptables命令要做什么,例如插入规则、将规则添加到链的末尾或删除规则。2 t* ~, r1 _& p ]+ T
-A或—append:将一条规则附加到链的末尾2 ]( z1 W! g+ E8 \& `3 y$ R
-D或—delete:删除一条规则9 F9 d2 q4 p) M9 ?8 g9 f+ |% T
-P或—policy : 设置链的缺省目标7 t2 @& M4 c) q/ t A& ~
-R或—replace:替换指定链的相应规则2 e. `1 I+ D/ @0 t! Y
-L 或—list : 列出指定链中的所有规则
; ?8 ^' x1 _2 ?7 N+ @+ s-F 或—flush:默认删除所有链中的规则;如果指定链名,该命令删除链中的所有规则5 }, j6 z- _7 I' C! G' U4 u8 X9 S
-N或—new-chain:创建新的链(名称为命令中的指定名称)9 ]4 @( R$ N$ ?0 u" [; L4 P8 D; f) F- P
-X:删除用户的空链
* t: H3 w7 \9 x3 K3 w+ G. O* |-i指的是数据流入的那个入口网卡
% c- _# @: D R: K* P T j; j( J- g-o指的是出口网卡, [$ T* k* G7 r: L$ L. c
-t指的是表格. U( I5 J7 J/ _( Z8 j) ~$ ~+ A$ b
-p则是指协议8 y) ~, z# A/ }4 G
-m表示调用模块
4 G9 ~ S) z& z9 Y/ ]-j代表执行的动作
3 d B/ R% b# L3 z6 E( U- m8 T--sport代表源端口3 ?+ Z7 R. R, W( q4 z
--dport代表目的端口, _4 p- B8 z: o; Z
--syn则表示带有syn标识设置的TCP数据包。SYN用于初始化一个TCP连接,如果自己机器上没有运行任何服务器,别人也就不会向你发送SYN数据包。
3 M L, G; E8 d9 M# C1 ]$ L, y4 V3.匹配(match)
3 K* {2 G! F9 F# b7 {$ B: Eiptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源地址、目的地址、协议等)。匹配分为通用匹配和特定于协议的匹配两大类。
5 c& u* S6 ] x6 } ^' K# O-p或–protocol:该通用协议匹配用于检查某些特定协议。其中ALL为缺省值,缺省源于所有IP地址匹配。可以使用!符号表示不与该项匹配。
3 o( C- W+ K2 }" {6 X/ z! `$ U-s或—source:根据数据包的源地址进行匹配。可以使用!表示不与该选项匹配。
6 f5 w. C, X/ ?* O/ h# |' v- n/ L-d或—destination:根据数据包的目的地址进行匹配。可以使用!表示取反。; V( i$ t: R. u9 Q
4.目标(target)* z( U9 a# t! d2 T4 Q3 Z: ^7 `7 F- m
目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。许多用于建立高级规则的其它目标,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。在此对常用的3个进行简单介绍。
; E* O+ z8 P0 Q: j8 B( H0 o1 AACCEPT:当数据包与规则完全匹配时,会允许数据包通过。3 b) v7 ^; u4 O
DROP:当数据包与规则完全匹配是,会丢弃数据包。$ f8 t7 e6 [2 b0 O# t& Q+ c
MASQUERADE:当数据包与规则完全匹配时,将数据包的源IP地址伪装为当前接口的IP地址。7 w a5 H& \. r7 z- C( A
5.使用方法:* U- n2 T2 Y: O9 ?4 a: P
增加规则:. _; y0 L9 G) |- P8 h
阻止来自某一特定IP范围内的数据包
9 y6 y6 H6 R" j% X. x" h" L) t#Iptables –t filter –A INPUT –s 192.168.100.0/24 –j DROP, R1 C! @9 p* E j- T' X; {
阻止所有流向攻击者IP地址的数据包
# k( Y8 |5 e# _( f5 j: b#Iptables –t filter –A OUTPUT –d 192.168.100.0/24 –j DROP. I$ q! w5 ~5 U' f+ T$ s* x& E
删除规则: w1 G |: @2 g: G+ Y1 `
#Iptabels –t filter –D OUTPUT –d 192.168.100.0/24 –j DROP4 e4 S9 m1 D7 h5 K$ c) N! i9 Q
缺省策略
% a/ n1 X0 n9 r7 T$ K#iptabels –P INPUT DROP
9 i4 ]% Z9 o3 n; B9 i地址伪装
6 F9 F8 L: J; P: _! Z#iptabels –t nat –A POSTROUTING –s 192.168.100.0/24 –o eth1 –j MASQUERADE
, _: G7 s% ~: X& o9 L+ y6.常用的iptables 模块! T ~( E) n1 [) y* |% z' G- i9 D
(1)string(字符串匹配,可以用做内容过滤)! Z5 _2 D* ~) G1 ]) A9 e+ W% H
#iptables -I FORWARD -d 192.168.3.0/24 -p tcp --sport 80 -m string --string "广告" -j DROP# _' @4 h% G/ m& Y% ~" ~* ?
(2)comment (备注匹配,可以支持最多256个字符)% p+ h" y3 ]3 a) f0 @
#iptables -I FORWARD -s 192.168.3.159 -m string --string "qq.com" -j DROP -m comment --comment "denny go to qq.com"
* ~6 W& V' x( e( b$ y+ r' _8 }(3)connlimit(同时连接个数限制匹配) --connlimit-above n 限制为多少个。--connlimit-mask n 这组主机的掩码,默认是connlimit-mask 32 ,即每个ip.
& T. B- w, H i" S8 c' W6 ]/ g0 U5 E#iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
8 `( J' q% L- r2 A! k' a(4)time(时间匹配)—timestart开始时间。--timestop结束时间。
# V {9 `3 V. U3 ~. X#iptables -t filter-A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri
) j5 ?1 L+ Q+ o2 L: N" f; ](5) iprange (ip范围匹配)
9 y- S; o+ Y( {#iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT$ K7 N' t T& i% E r1 m( Z* i
(6)state模块 –-state 分文三种状态:NEW、ESTABLISHED、RELATED
6 A. V% A0 L1 }; c! Y1 C#iptables -t filter -A -m state --state ESTABLISHED,RELATED -j ACCEPT1 [1 h9 U$ y- j1 |
7.案例:
q$ k4 I% [. m c0 y试验目的:100.21-30网段上班时间能够能够访问FTP服务器,禁止上班时间访问sina网站,禁止使用迅雷、qq软件。
* Q! v! p9 Y/ C' A) o: S. e
; { E2 G' I+ @第一、 打开转发功能拒绝所有通过
$ a! |" W; x* T[root@zhangc ~]# vim /etc/sysctl.conf1 j* D E u, O, L1 ^, q) z

+ N' u- q* |. N6 O9 `+ P- L' J[root@zhangc ~]# sysctl –p
, }+ ~2 W1 y5 h- N* V$ b第二、实现对FTP服务器的访问: ?2 L6 N3 @- `3 G v# l$ l5 V
允许http通过& b) {6 X! Z' I' q% j5 J
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.21-192.168.100.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tun,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT
% ?2 w- [! R* t2 K4 S8 Z. O& i允许DNS通过7 @: P, W8 ]. Q: z! n. S5 ]
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.21-192.168.100.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tun,Wed,Thu,Fri -p udp --dport 53 -j ACCEPT
) t7 P- f( X- x4 }标准包过滤:每禁用一个服务,都要过滤掉流出的数据包和流入的数据包,相对比较稍微有些繁琐。
F2 n$ u' j8 Z/ F2 ~; S( R0 `[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.10-192.168.100.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
; R' e- i9 x& I4 G- u- h) r[root@zhangc ~]# iptbales -t filter -A FORWARD -p tcp --sport 21 -j ACCEPT【服务器端请求的接收21端口】& r. f9 R: u" `5 g" M
[root@zhangc ~]# iptables -t filter -A FORWARD -p tcp --sport 20 -j ACCEPT【服务器回应】& u# K' N% N8 \
[root@zhangc ~]# iptables -t filter -A FORWARD -p tcp --dport 20 -j ACCEPT【客户端接收20端口】* b! ^0 }, \7 V( N
状态包过滤:记录一个会话的状态,从防火墙出去的数据包回应的时候默认允许通过。- l! I1 }, h8 m1 C% d
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.10-192.168.100.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
; J4 l3 h' k+ l( r[root@zhangc ~]# iptables -t filter -A -m state --state ESTABLISHED,RELATED -j ACCEPT
7 A t F' U; b5 }以上两种方法都有可以使用进行FTP的访问/ _2 [" l. y7 I* S5 g! P: l5 V3 ^
第三、禁止上班时间访问sina、迅雷、qq
! \4 P% ?9 i$ r- r) v0 _& Z[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.145.21-192.168.145.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT
6 G8 A. K/ J, W; j[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.220.21-192.168.220.30 -m time --timestart 08:00 --timestop 20:00 –weekdays Mon,Tun,Wed,Thu,Fri -m string --string "sina" --algo bm -j DROP
1 z) f6 ]: l# ^7 o2 z4 \[root@zhangc ~]# iptables -A FORWARD -m iprange --src-range 192.168.145.21-192.168.145.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Fri -m layer7 --l7proto qq -j DROP8 A: C( j7 A( y; p! d2 k
[root@zhangc ~]# iptables -A FORWARD -m iprange --src-range 192.168.145.21-192.168.145.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Fri -m layer7 --l7proto xunlei -j DROP
8 H! [5 u7 U5 S+ w) {2 f( W4 Y |
|