iptables是什麼?
iptables是運行在用戶空間的應用軟件,通過控制Linux內核netfilter模塊,來管理網絡數據包的處理和轉發。
iptables的基本結構
要對網絡數據包進行處理和轉發,我們首先需要明確的問題是:對什麼樣的數據進行怎麼樣的處理。因此我們可以用匹配條件 匹配成功後執行的動作
來描述我們的處理策略,我們將這種策略稱之爲規則。
一條規則能夠表達的信息是非常有限的,當我們需要描述更加複雜的策略的時候,我們就需要更多的規則。我們將這些規則排列起來,依次執行,我們將規則組成的有序列表稱爲鏈。
表達清楚了處理策略之後,我們接下來需要考慮在什麼時候執行這些策略,我們先來看看網絡數據包的處理過程:
從這張圖中,我們可以發現五個執行策略的機會:
因此我們將鏈也分爲五種,以區分他們起作用的不同階段:
- PREROUTING: 數據包進入路由表之前
- INPUT: 通過路由表後,目的地爲本機
- FORWARD: 通過路由表後,目的地不爲本機
- OUTPUT: 由本機產生,向外轉發
- POSTROUTIONG: 發送到網卡接口之前
因爲iptables有多種功能,爲了更好地管理,我們將功能相同的鏈放到同一個表中,iptables內置有四種表,每張表會包含一種或多種鏈:
- raw: PREROUTING、OUTPUT
- mangle: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
- nat: PREROUTING、OUTPUT、POSTROUTING
- filter: INPUT、FORWARD、OUTPUT
當多個表存在同一個鏈時,按照 raw -> mangle -> nat -> filter 的順序執行。
最後我們總結一下,在iptables中存在多個表,每個表中包含多個鏈,每個鏈中又包含多條規則,處理過程如下圖:
(此圖來自互聯網,如有侵權,請聯繫我)
iptables命令
iptables命令的使用我覺得Linux實戰-2小時玩轉iptables講得已經足夠好了,我再列舉不過畫蛇添足,因此在這裏只寫了一些自己的理解,具體的命令使用方法請參考Linux實戰-2小時玩轉iptables
要改變iptables的功能,需要對iptables中的各種規則進行操作,iptables命令的基本格式如下:
iptables [-t 表名] <操作命令> [鏈名] [規則號碼] [匹配條件] [匹配之後的操作]
表名、鏈名、規則號碼確定了操作的對象,操作命令描述了操作的類型,匹配條件和匹配之後的操作提供了執行操作所需的信息。
操作命令無非增刪改查四大類:
- 增:
- -A <鏈名> :Append 追加一條規則,放到最後
- -I [規則號碼]:Insert 插入一條規則(如果不指定規則號碼則默認爲1)
- -P <鏈名> <動作>:Policy 設置某個鏈的默認規則
- 刪
- -D <鏈名> {規則號碼 | 具體規則內容}:Delete 刪除一條規則
- -F [鏈名]:清空規則
- 改
- -R <鏈名> <規則號碼> <具體規則內容>:Replace 替換一條規則
- 查
- -L <鏈名>:List 列出規則
匹配條件從下層到上層依次有:
- 鏈路層:流入接口(-i)、流出接口(-o)
- 網絡層:來源地址(-s)、目的地址(-d)、協議類型(-p)
- 傳輸層:來源端口(–sport)、目的端口(–dport)
匹配之後的操作有:
- ACCEPT:允許數據包通過本鏈
- DROP:組織數據包通過本鏈而丟棄它
- 修改地址
- SNAT:修改源地址
- DNAT:修改目的地址
- MASQUERADE :動態源地址轉換
- REDRICT:進行端口映射,發送到某個端口的數據會被重定向到另一個端口。