本文不是專門討論IPCHAINS的工作原理,也不是討論IPCHAINS有關的參數和命令的用法。我只不過是想
說明一下IPCHAINS到底是怎樣工作的,重在流程。並結合一個IP包在到達防火牆後是經過怎樣的步驟最
後從防火牆出來。
(想要了解IPCHAINS的參數和命令的用法請看http://www.ibase.com/book/showQueryL.ASP?libID=284)
大家知道,REDHAT 6.2內自帶ipchains防火牆。系統有三個標准的防火牆鏈和用戶自定義的防火牆鏈。
還有它的規則和目標。首先要弄清這些概念:
其實畫個圖就清楚了,如下
`input' `Test'
---------------------------- ----------------------------
Rule1: -p ICMP -j REJECT Rule1: -s 192.168.1.1
-------------------------- --------------------------
Rule2: -p TCP -j Test Rule2: -d 192.168.1.1
-------------------------- ----------------------------
Rule3: -p UDP -j DENY
----------------------------
上圖就表示兩條鏈:系統的標准鏈INPUT鏈和用戶自定義鏈Test。
RuleX就是規則
-j 後面的就是目標或又是一個防火鏈。
當然,系統還有forward鏈,output鏈,你還可以定義自己的鏈(ipchains -N newname)
上圖說明input鏈中第一條規則是定義進來的協議為icmp的IP包就跳到REJECT目標,由於REJECT是系統自
定義
的,表示拒絕,所以符合-p icmp的包就被丟棄。
input第二條規則說明協議為tcp的包跳到test,由於test是用戶自定義的鏈,所以進來的包被送到test
鏈中去
決定它的命運。
現在弄清楚了基本的概念後我們再來看一看一個從192.168.1.1進來的tcp包要到1.2.3.4去,它是怎樣走
的?
(還是上面的圖):
當包進來後,它先被送到input鏈與第一條規則匹配。第一條規則不符合(不是icmp包),則此包進入第
二條規則。第二條規則符合(是tcp包),則按照-j(jump)後面定義的目標跳到相應的地方。因目標又
是一條鏈(用戶自定義的),所以包被送到test鏈繼續匹配test鏈中的規則。test鏈中第一條規則符合
(因原地址是192.168.1.1),但沒有指定其要去的地方,所以繼續匹配第二條規則。第二條規則不符合
(目的不是192.168.1.1,而是1.2.3.4)所以包又被送到input鏈繼續匹配下面的規則(因test鏈沒有指明
此包的命運,而input鏈又沒有執行完),input鏈中的第三條規則也不匹配,則決定此包最終命運的是
ipchains -P input 後面所定義的目標。如有ipchains -P input DENY 則此包被拒絕。如是ipchains
-P input ACCEPT則此包被接受
。等等。因為一個包從進入一條鏈到出來中間若沒有任何規則指明它的命運的話,此包要走完整個鏈,
象上面的列子一樣,若test鏈中有Rule3: -p tcp -j DENY則此包被丟棄。但如沒有,則最終是由
ipchains -P input決定此包的命運。
上面的文字說明用下圖來表示:
v __________________________
`input' / `Test' v
--------------------------/ ---------------------------
Rule1 / Rule1
-----------------------/- -------------------------
Rule2 / Rule2
-------------------------- -----------------------v----
Rule3 /--+___________________________/
---------------------------
v
上面只是討論了一個包在一條鏈中所經歷的過程,下面我們來看看在整個ipchains過程中一個包是怎樣
進入防火牆,又是怎樣出來的。
注意:一個包進入防火牆先一定是進入input鏈,如有可能最終從output鏈出去。而且當鏈中第一條規則
沒指明包的去向,它就被送到第二條規則去匹配,第二條規則沒指明,則繼續送到第三條規則,如有可
能(都沒指明包的去向),最終走完此鏈(ipchains -P)。
看下圖:
----------------------------------------------------------------
ACCEPT/ lo interface
v REDIRECT _______
--> C --> S --> ______ --> D --> ~~~~~~~~ -->forward----> _______ -->
h a input e {Routing } Chain output ACCEPT
e n Chain m {Decision} _______ --->Chain
c i ______ a ~~~~~~~~ ->_______
k t s
s y q v
u v e v DENY/ v
m DENY/ r Local Process REJECT DENY/
v REJECT a REJECT
DENY d ---------------------
v e -----------------------------
DENY
1:checksum:當一個包進來時,內核首先檢查它是不是被篡改。主要是檢查效驗碼。(checksum)如果效
驗碼不對,則此包被拒絕。
2:sanity:寫在每條防火鏈的前面,特別是input鏈。主要是檢驗那些不規范的包。如果包被sanity拒絕
則在syslog文件中有記載。
3:input:包進入input鏈,按照上面所說的一條鏈中的包的流程來走。是被拒絕,否定還是被接受,重
定向等。
4:Demasqerade:包被接受。如果此包是由原來的包經過偽裝後的包則直接跳到output鏈。為什麼說是經
過原來的包偽裝的包呢?因為後面我們將看到一個包到了output出口後有可能又會重新被送到input鏈再
進行匹配的。
5:Routing Decision:如果包不是以前偽裝過的包則通過路由機制判斷包的目的地址是本機器的還是需
要轉發給其他遠程機器的。
6:Local Process:如果包的目的地是本機器。則直接送到output鏈。
7:Lo interface:如果包是從local process傳來的,則它從output鏈中出來後interface被改為"lo",然
後再從新被送到input鏈,以接口是"lo"的身份再一次通過各個防火鏈。(這裡可看到Demasqerade)
8:forward:如果是需要轉發的包則進入forward鏈。forward鏈對那些需要轉發的包進行詳細的檢查,通
過了再進行轉發。
9:output:此鏈核對出去的包的詳細信息,符合則讓它通過。
至此,我相信不要舉列大家對一個包通過ipchains防火牆的整個過程也就一清二楚了。
順便說一下:
1:只容許TCP SYN連接
如果你想連接外面的web server但又不想web server連接你,又不能切斷web server對你提供的正常的
服務的話,你可以阻止那些從web server上請求對你進行連接的包拒絕。
ipchains -p tcp -s 192.168.1.1 -y(可自己定義,但-y不能少)
2:禁止IP Spoof
把/proc/sys/net/ipv4/conf/*/rp_filter 致為"1"
中國Linux論壇
後再從新被送到input鏈,以接口是"lo"的身份再一次通過各個防火鏈。(這裡可看到Demasqerade)
8:forward:如果是需要轉發的包則進入forward鏈。forward鏈對那些需要轉發的包進行詳細的檢查,通
過了再進行轉發。
9:output:此鏈核對出去的包的詳細信息,符合則讓它通過。
至此,我相信不要舉列大家對一個包通過ipchains防火牆的整個過程也就一清二楚了。
順便說一下:
1:只容許TCP SYN連接
如果你想連接外面的web server但又不想web server連接你,又不能切斷web server對你提供的正常的
服務的話,你可以阻止那些從web server上請求對你進行連接的包拒絕。
ipchains -p tcp -s 192.168.1.1 -y(可自己定義,但-y不能少)
2:禁止IP Spoof
把/proc/sys/net/ipv4/conf/*/rp_filter 致為"1"
中國Linux論壇