
本次对iptabbles+l7的介绍分为两部分:2 p' a, e9 W0 V
第一部分——————对系统升级打l7补丁
7 s3 f' S% p9 p+ C# S# U第二部分——————对iptables+l7的应用2 F4 `" c2 v$ q- }1 D& \! X
第一部分:对系统升级打补丁
5 U& F; y* c3 _" P, Y为了使用l7层协议进行控制,我们要在内核中打补丁文件,需要重新编译内核文件,下面的每一步都需要小心谨慎,不然就要重头开始了~需要软件的朋友可以Q395061796
; y5 Q9 J1 L$ i1 i软件需求:
( c6 M8 a0 A7 U$ ^/ z2 s - U! _/ b0 ?/ A/ k! U# e
1、 拆解内核文件与layer7文件:
6 ~# j* o: P( P[root@zhangc ~]# tar jxvf linux-2.6.25.19.tar.bz2 -C /usr/src/' L! c7 J" T, U( i
[root@zhangc ~]# tar zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/
/ [3 l Q9 D) m# G) h H; i- p2、 将补丁文件放入内核文件夹内' O e# Q1 E* T+ s+ M0 N
[root@zhangc ~]# cd /usr/src/linux-2.6.25.19/- B2 k# |( k0 _: g9 @- F
[root@zhangc linux-2.6.25.19]# patch -p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch; f1 C# ?. Y. `# I- k: r
3、 使用内核文件配置新内核
, T$ N8 y! A2 s5 {[root@zhangc linux-2.6.25.19]# cp /boot/config-2.6.18-164.el5 .config8 v g: s8 B+ `9 S: ?
[root@zhangc linux-2.6.25.19]#make menuconfig( ]% ^$ }5 P! N# J% S1 X4 l2 }3 B
将一些需要的服务选项选为M,编译为模块。" ^ t* K& P: K M( v/ s3 x4 R
第一部分选项:
. N8 \+ r2 t0 ^* v) n' v 2 M/ O/ d4 S. q
5 ^" |0 ~ O5 r% C, p

6 @9 W0 w2 b: `8 s4 S1 { - K7 }4 u/ d! z# d5 r! F
编译以下3个模块% }/ l7 p/ ~. P) R; ?

# ?" W' U3 x8 V: l) ~; S 7 v& i0 l Q9 [/ y

) p2 O7 H9 v4 g% D第二部分选项: o5 G% L: u/ @7 H! W
7 h+ K. k, G( @" M$ {( d5 L- |

& Y( D+ F! D1 N9 v- B3 Z6 o
, X P* \* T& L : N) x! U. {! ~$ D
编译以下4个模块
- v" f( V. d# K1 i* b4 g# [* m' E
2 Q( @1 c% a' p8 m ; P; b% L8 c# d6 r9 l% y
( |. [ f) Y5 D; I1 _

- c' }. d+ |, }8 C1 o& ^4.编译内核、安装模块、安装内核. c0 Y, e- i8 y. k n' L9 u
[root@zhangc linux-2.6.25.19]# make
6 M0 x% Q$ P' r) A$ s5 \, p9 ]% K[root@zhangc linux-2.6.25.19]# make modules_install
/ u% s M) S- Z: f. L0 |# b. ~' L[root@zhangc linux-2.6.25.19]# make install: Y. h" |1 }4 e+ n" v
5.卸载老版本iptables, y, b% e, l* b
[root@zhangc ~]# rpm -e iptables –nodeps$ l \+ z, o8 x4 D% C
6.拆解并合并iptables+layer7补丁' f6 Q% ^: r1 h9 F: F
[root@zhangc ~]# tar jxvf iptables-1.4.2.tar.bz2 -C /usr/src/$ I t: [ w4 E! E% \
[root@zhangc ~]# cd /usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward/& @3 }. k, m" |
[root@zhangc iptables-1.4.1.1-for-kernel-2.6.20forward]# cp * /usr/src/iptables-1.4.2/extensions/ x |+ d* a9 [6 c. d
7.编译并安装
+ r% Y9 \' [( J[root@zhangc iptables-1.4.1.1-for-kernel-2.6.20forward]# cd /usr/src/iptables-1.4.2/; @ ]( O; r( ?' s% R( S3 |6 T" J
[root@zhangc iptables-1.4.2]# ./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19/2 z' Z0 E; p) b1 l7 t4 g8 ~- j
[root@zhangc iptables-1.4.2]# make
9 D; F N0 q" f% K$ A[root@zhangc iptables-1.4.2]# make install
) A1 w8 P) i1 n8.安装l7-prorocols模式包1 ~3 F7 ~7 i8 R* r' S
[root@zhangc ~]# tar zxvf l7-protocols-2008-10-04.tar.gz -C /etc/% U" K, x) q2 r9 K) e9 E5 k
[root@zhangc ~]# mv /etc/l7-protocols-2008-10-04/ /etc/l7-protocols) i8 f d! t7 q; T
9.修改文件ip6tables,能正常启用service% u4 B: C- y1 @- e4 S
[root@zhangc ~]# vim /etc/init.d/ip6tables /etc/init.d/iptables
" n3 b- ~( g: j[root@zhangc ~]# service iptables save【这条命令进行测试】! t" U/ g4 |: s3 k. ?# |$ M
[root@zhangc ~]# service iptables restart# l! z9 T+ q* a% T# J* d
( }+ A; A7 I& p2 _' U+ H% e6 r# F
10.系统的修补已经完成,可以正常使用iptables+l7.2 y) N% U; C" D5 Q: D2 U6 D
b! E# r. l0 a4 \/ X" I; D
第二部分:iptables+l7的应用. p! q( h2 N7 u2 \) _6 k. P, h% h
l7规则的格式:1 x+ a. t; O$ W3 O; K# x
通过向防火墙提供有关对来自某个源地址、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用iptables系统提供的特殊命令iptables建立这些规则,并将其添加到内核空间特定信息包过滤表内的链中。关于添加、去除、编辑规则的命令,一般语法如下:" b( n/ \; T# N5 f
iptables [-t table] command [match] [target]
" @9 I% T/ g( G& {4 ~5 u1.表(table)3 I' h% q$ x* t: s9 ?
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三个可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter作为缺省表。
4 K; Z K# e* k4 V1 dFilter用于一般的信息包过滤,包含INPUT,OUTPUT,FORWARD链1 \. f& q; [+ ~3 [
Nat 用于要转发的信息包,包含PREROUTING,OUTPUT,POSTROUTING链# ~! t; ^# H j0 T3 `
2.命令(command)
" u+ D+ Y/ H- ^8 n$ @. B3 O+ W0 Icommand部分是iptables命令最重要的部分。它告诉iptables命令要做什么,例如插入规则、将规则添加到链的末尾或删除规则。
" ?. U5 Q+ A* j8 {2 @) Z-A或—append:将一条规则附加到链的末尾, B, s: w1 ]7 ]0 a- {
-D或—delete:删除一条规则
& e }. r) A6 c-P或—policy : 设置链的缺省目标" o. P- F( y7 `
-R或—replace:替换指定链的相应规则( Y" k$ _6 n8 k
-L 或—list : 列出指定链中的所有规则* N$ F% u8 ~4 S+ Z( b. H
-F 或—flush:默认删除所有链中的规则;如果指定链名,该命令删除链中的所有规则8 Q& S/ I9 G9 T( C0 W( c& z; q
-N或—new-chain:创建新的链(名称为命令中的指定名称)+ \( |% ?; [& {6 _/ E
-X:删除用户的空链
. ?% ?4 h. z6 U$ R' n-i指的是数据流入的那个入口网卡+ q! f) V+ Y2 W- s
-o指的是出口网卡
$ c& z9 ]! B4 Q0 Y) d) ?-t指的是表格4 m3 E9 b/ u+ q; j- X
-p则是指协议
2 C# i" N: q9 F3 J/ `% `' k) \8 F-m表示调用模块1 M5 y1 R; {" A
-j代表执行的动作
2 q/ ^* q0 R2 \* ]3 E--sport代表源端口$ D2 b7 u1 s2 w/ o
--dport代表目的端口9 ]8 @. [4 f6 h. b
--syn则表示带有syn标识设置的TCP数据包。SYN用于初始化一个TCP连接,如果自己机器上没有运行任何服务器,别人也就不会向你发送SYN数据包。
/ \( x& w0 l: o/ _: H/ q! c: _! I1 V3.匹配(match)
& ?3 l- ]# m2 B- e7 V. giptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源地址、目的地址、协议等)。匹配分为通用匹配和特定于协议的匹配两大类。. H. J7 E C1 ?3 d
-p或–protocol:该通用协议匹配用于检查某些特定协议。其中ALL为缺省值,缺省源于所有IP地址匹配。可以使用!符号表示不与该项匹配。
7 w: j" X; `1 `-s或—source:根据数据包的源地址进行匹配。可以使用!表示不与该选项匹配。& I$ q# T) V2 i7 j8 T" A7 ?
-d或—destination:根据数据包的目的地址进行匹配。可以使用!表示取反。; W# c6 i _3 |- P* y
4.目标(target)
+ r, F- K+ v% ]目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。许多用于建立高级规则的其它目标,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。在此对常用的3个进行简单介绍。
& y. u2 h/ g; O9 d6 R7 H [, Z3 MACCEPT:当数据包与规则完全匹配时,会允许数据包通过。! {2 F- ?% m) ]0 Y
DROP:当数据包与规则完全匹配是,会丢弃数据包。
- q- q" W, o9 C9 ~2 r/ OMASQUERADE:当数据包与规则完全匹配时,将数据包的源IP地址伪装为当前接口的IP地址。
* B$ R2 q C0 r% h9 w5.使用方法:! M- @: |+ R, W( m
增加规则:+ c9 k" v8 i& l% q- Q
阻止来自某一特定IP范围内的数据包5 f5 \1 I8 D1 g- h) u6 }% ]8 N
#Iptables –t filter –A INPUT –s 192.168.100.0/24 –j DROP& E. d, U, l6 q% \* C
阻止所有流向攻击者IP地址的数据包8 H) v! \3 a3 ^
#Iptables –t filter –A OUTPUT –d 192.168.100.0/24 –j DROP! g1 d* Z8 c. h# q! R" j3 Y
删除规则:
& K5 [& e6 S+ h" E: I: Q#Iptabels –t filter –D OUTPUT –d 192.168.100.0/24 –j DROP
- R, a9 d2 Q0 u/ k缺省策略+ J. x4 `& h: `! M, L# ]4 K$ W: |
#iptabels –P INPUT DROP1 B7 t3 m A0 t# ?) e: }" x1 |& b& n7 C
地址伪装
2 d( t2 X, \* A+ V- s' j#iptabels –t nat –A POSTROUTING –s 192.168.100.0/24 –o eth1 –j MASQUERADE
) P4 [, S+ n" M" X& {8 _6.常用的iptables 模块
. I& G4 O2 @" Z1 g" l1 Y(1)string(字符串匹配,可以用做内容过滤)
+ B* @4 T0 V, b* P5 U, `#iptables -I FORWARD -d 192.168.3.0/24 -p tcp --sport 80 -m string --string "广告" -j DROP
* c( }! A2 Q" q* V0 `3 }: Y(2)comment (备注匹配,可以支持最多256个字符)3 B* Y$ l& l3 W' v: `! }
#iptables -I FORWARD -s 192.168.3.159 -m string --string "qq.com" -j DROP -m comment --comment "denny go to qq.com"
$ J" h9 P5 o: @4 f" w3 N0 D% B7 a(3)connlimit(同时连接个数限制匹配) --connlimit-above n 限制为多少个。--connlimit-mask n 这组主机的掩码,默认是connlimit-mask 32 ,即每个ip.1 U- R ], t- O& K$ H
#iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT5 P5 P5 ?/ m7 Z8 i0 R0 ~ y0 R/ J& n% k
(4)time(时间匹配)—timestart开始时间。--timestop结束时间。
! D" D0 }% G; w. c4 p#iptables -t filter-A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri
& i; G( }- ]% t8 n(5) iprange (ip范围匹配)
4 m) x9 A5 ^( ?4 w& ^+ @# V#iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT6 |: X5 m: d; |, [5 C' ?0 E# }& H
(6)state模块 –-state 分文三种状态:NEW、ESTABLISHED、RELATED) e1 L1 d' q/ `; D) U6 `
#iptables -t filter -A -m state --state ESTABLISHED,RELATED -j ACCEPT
9 k" @1 G0 O- c. _7.案例:
: j8 @: g9 _- ?. `5 O+ _# O9 v试验目的:100.21-30网段上班时间能够能够访问FTP服务器,禁止上班时间访问sina网站,禁止使用迅雷、qq软件。
* K* O5 T: X5 L; N5 _! C 4 ~, p2 y& t- K5 `3 n, Z$ @
第一、 打开转发功能拒绝所有通过9 G6 }0 d- l1 u/ Z8 \" ?! D: u
[root@zhangc ~]# vim /etc/sysctl.conf
) h5 `; v* [/ e3 u7 H4 \; j
4 x/ F$ Z. F( F[root@zhangc ~]# sysctl –p* g7 `! O4 @- U' Q5 ]
第二、实现对FTP服务器的访问
* f1 x$ Q9 s( Z允许http通过
# D# ^% C7 g) R7 I. |, ~: S[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 ACCEPT7 y8 t& G& I# g/ Y! r2 J
允许DNS通过" _% G. T7 ?' t; @, |/ ^& K* R
[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; Q! |! o, q) I+ j
标准包过滤:每禁用一个服务,都要过滤掉流出的数据包和流入的数据包,相对比较稍微有些繁琐。. n0 c9 ?& u; U
[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, f, w3 T6 }: U9 K4 L4 F( V
[root@zhangc ~]# iptbales -t filter -A FORWARD -p tcp --sport 21 -j ACCEPT【服务器端请求的接收21端口】
1 N q& d: [6 \+ v/ F$ p6 I0 b[root@zhangc ~]# iptables -t filter -A FORWARD -p tcp --sport 20 -j ACCEPT【服务器回应】
1 ?# r {8 {5 N# t' C[root@zhangc ~]# iptables -t filter -A FORWARD -p tcp --dport 20 -j ACCEPT【客户端接收20端口】3 b Q7 R% r/ Q+ j" z) m) k7 v+ N
状态包过滤:记录一个会话的状态,从防火墙出去的数据包回应的时候默认允许通过。
% i& Y$ a; a+ L+ X5 e" B: {0 |[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" B9 F. |; \3 J6 O7 q
[root@zhangc ~]# iptables -t filter -A -m state --state ESTABLISHED,RELATED -j ACCEPT) X4 X. @% v3 `8 `$ P2 I
以上两种方法都有可以使用进行FTP的访问/ H l4 K$ {, f9 R+ m
第三、禁止上班时间访问sina、迅雷、qq
0 Q0 a; g( x/ d c& |[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
: p+ ]- c6 G( h6 Y[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 DROP2 C( P" K" l$ |" g& r$ J J
[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 DROP, D; b, W5 g# Z1 w) @. S
[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 DROP5 c5 x* [8 k" `0 W' q; G
|
|