iptables 基本概念
匹配(match):符合指定的條件,比如指定的 IP 地址和端口。
丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理。
接受(accept):和丟棄相反,接受這個包,讓這個包通過。
拒絕(reject):和丟棄相似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息可以指定,也可以自動產生。
目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕。
跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上。
規則(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. 進入出去的網絡接口。完畢。