1. 程式人生 > >iptables的相關概念和資料包的流程

iptables的相關概念和資料包的流程

原文連結:http://selboo.com/post/721/

iptables 相關概念 

匹配(match):符合指定的條件,比如指定的 IP 地址和埠。 
丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理。 
接受(accept):和丟棄相反,接受這個包,讓這個包通過。 
拒絕(reject):和丟棄相似,但它還會向傳送這個包的源主機發送錯誤訊息。這個錯誤訊息可以指定,也可以自動產生。 
目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕。 
跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上。 <br >規則(rule):一個或多個匹配及其對應的目標。 

鏈(chain):每條鏈都包含有一系列的規則,這些規則會被依次應用到每個遍歷該鏈的資料包上。每個鏈都有各自專門的用途, 這一點我們下面會詳細討論。 
表(table):每個表包含有若干個不同的鏈,比如 filter 表預設包含有 INPUT,FORWARD,OUTPUT 三個鏈。iptables 有四個表,分別是:raw,nat,mangle和filter,每個表都有自己專門的用處,比如最常用filter表就是專門用來做包過濾的,而 nat 表是專門用來做NAT的。 
策略(police):我們在這裡提到的策略是指,對於 iptables 中某條鏈,當所有規則都匹配不成功時其預設的處理動作。 
連線跟蹤(connection track):又稱為動態過濾,可以根據指定連線的狀態進行一些適當的過濾,是一個很強大的功能,但同時也比較消耗記憶體資源。


經過iptables的資料包的流程介紹 

一個數據包到達時,是怎麼依次穿過各個鏈和表的(圖)。 
點選在新視窗中瀏覽此圖片

基本步驟如下: 
1. 資料包到達網路介面,比如 eth0。 
2. 進入 raw 表的 PREROUTING 鏈,這個鏈的作用是趕在連線跟蹤之前處理資料包。 
3. 如果進行了連線跟蹤,在此處理。 
4. 進入 mangle 表的 PREROUTING 鏈,在此可以修改資料包,比如 TOS 等。 
5. 進入 nat 表的 PREROUTING 鏈,可以在此做DNAT,但不要做過濾。 
6. 決定路由,看是交給本地主機還是轉發給其它主機。 

到了這裡我們就得分兩種不同的情況進行討論了,一種情況就是資料包要轉發給其它主機,這時候它會依次經過: 

7. 進入 mangle 表的 FORWARD 鏈,這裡也比較特殊,這是在第一次路由決定之後,在進行最後的路由決定之前,我們仍然可以對資料包進行某些修改。 
8. 進入 filter 表的 FORWARD 鏈,在這裡我們可以對所有轉發的資料包進行過濾。需要注意的是:經過這裡的資料包是轉發的,方向是雙向的。 
9. 進入 mangle 表的 POSTROUTING 鏈,到這裡已經做完了所有的路由決定,但資料包仍然在本地主機,我們還可以進行某些修改。 
10. 進入 nat 表的 POSTROUTING 鏈,在這裡一般都是用來做 SNAT ,不要在這裡進行過濾。 
11. 進入出去的網路介面。完畢。 

另一種情況是,資料包就是發給本地主機的,那麼它會依次穿過: 
7. 進入 mangle 表的 INPUT 鏈,這裡是在路由之後,交由本地主機之前,我們也可以進行一些相應的修改。 
8. 進入 filter 表的 INPUT 鏈,在這裡我們可以對流入的所有資料包進行過濾,無論它來自哪個網路介面。 
9. 交給本地主機的應用程式進行處理。 
10. 處理完畢後進行路由決定,看該往那裡發出。 
11. 進入 raw 表的 OUTPUT 鏈,這裡是在連線跟蹤處理本地的資料包之前。 
12. 連線跟蹤對本地的資料包進行處理。 
13. 進入 mangle 表的 OUTPUT 鏈,在這裡我們可以修改資料包,但不要做過濾。 
14. 進入 nat 表的 OUTPUT 鏈,可以對防火牆自己發出的資料做 NAT 。 
15. 再次進行路由決定。 
16. 進入 filter 表的 OUTPUT 鏈,可以對本地出去的資料包進行過濾。 
17. 進入 mangle 表的 POSTROUTING 鏈,同上一種情況的第9步。注意,這裡不光對經過防火牆的資料包進行處理,還對防火牆自己產生的資料包進行處理。 
18. 進入 nat 表的 POSTROUTING 鏈,同上一種情況的第10步。 
19. 進入出去的網路介面。完畢。