iptables簡介
iptables
實際上就是一種包過濾型防火牆。iptables
是Linux系統下最常見的防火牆命令,但實際上它只是一個命令行工具,真正的內核防火牆是位於操作系統內核空間的netfilter
。通過iptables
命令制定規則並執行,即可使得netfilter
在內核層對數據包作出相應的處理。
四表五鏈
iptables中的表是存放鏈的容器,而鏈是存放規則的容器。在數據包進入系統的時候,防火牆會對其報文作規則匹配,並執行相應的動作
。
四表:
- filter表:用於過濾數據包
- nat表:網絡地址轉換功能(IP+端口)
- mangle表:拆封且修改數據報文並重新封裝
- raw表:關閉nat表上啓用的鏈接追蹤機制,爲了提高效率使用的,raw本身的含義是指“原生的”、“未經過加工的”,符合raw表所對應規則的數據包將會跳過一些檢查,這樣就可以提高效率
優先級爲 : raw > mangle > nat > filter
五鏈:
- PREROUTING鏈:用於目標地址轉換(DNAT) 數據包進入路由之前
- INPUT鏈:用於處理進入本機的數據包
- OUTPUT鏈:用於處理由本機出去的數據包
- FORWARD鏈:用於處理轉發數據包
- POSTROUTING鏈:用於源地址轉換(SNAT) 發送到網卡之前
Ⅰ.【鏈】
鏈是規則的容器。在鏈上有一系列的規則處理動作。報文進入主機的整個鏈路如下圖。
① 進入主機的報文(通常爲請求報文),進入路由選擇前,進行判斷其目標是否爲本機IP,如果是則進入INPUT鏈執行該鏈上設定的規則,將請求送至應用層處理;若不是本機IP,則會執行FORWARD鏈上的規則,將請求報文轉發到目標主機,並通過POSTROUTING鏈送出。
② 本機發起的報文(通常爲響應報文),則會執行OUTPUT鏈上的規則,再由POSTROUTING鏈送出。
由此可見,任何報文進出都必須PREROUTING和POSTROUTING兩條鏈的。
Ⅱ. 【表】
表是鏈的容器。前面有說到,規則分爲很多種,比如說過濾端口、修改報文、轉發數據包等等。具有相同功能的規則的集合就叫做表。iptables默認有4張表,分別是負責過濾的filter表(默認缺省操作即針對該表)、負載轉換網絡地址的nat表、負責修改報文的mangle表以及負責數據跟蹤處理的raw表。那表和鏈是什麼關係呢?表的功能不同,決定了鏈上的規則所能處於的表也是不同的。也就是說,不同的鏈所能具有表對應的功能是不同的;反過來說,不同的表上能存在的鏈是固定的。其對應關係如下圖所示:
表是有優先級的,其優先順序如上圖所示,從左往右,優先級由高到低。
Ⅲ. 【規則】
前面一直在說規則。規則是由匹配條件和指定動作組成的集合。設定好匹配條件和指定處理動作以後,報文進入鏈路,會根據匹配條件去匹配報文,匹配成功以後就會按設定的動作去處理,比如接受包、拒絕包、轉發包等。
- 匹配條件
iptables可以根據報文的源地址、目的地址、傳輸協議、服務類型等信息進行匹配。這些條件通常用命令參數來設定。常見的命令參數如下表:
參數 | 說明 |
---|---|
-P | 設置默認策略 |
-F | 清空規則鏈 |
-L | 查看規則鏈 |
-I num | num缺省爲0,即在規則鏈的頂部加入新規則;num可設定加入的位置 |
-A | 在規則鏈的末尾加入新規則 |
-D num | 刪除指定位置的規則 |
-s | 匹配報文來源地址 |
-d | 匹配報文目標地址 |
-i | 匹配指定網卡流入的數據 |
-o | 匹配指定網卡流出的數據 |
-p | 匹配協議,可選項TCP、UDP、ICMP |
-m | 使用擴展模塊來匹配報文 |
—dport | 匹配目標端口號 |
—sport | 匹配來源端口號 |
- 指定動作
動作 | 說明 |
---|---|
ACCEPT | 允許數據包通過 |
DROP | 直接丟棄數據包,不給出響應 |
REJECT | 拒絕數據包通過,給出拒絕響應 |
REDIRECT | 本機端口重定向、映射、透明代理 |
SNAT | 源地址轉換 |
DNAT | 目標地址轉換 |
MASQUERADE | IP僞裝(NAT),用於ADSL |
LOG | 日誌記錄 |
舉例說明
下面舉例說明iptables的用法。
① 舉例:僅允許遠程主機訪問本機的80端口,本機地址10.0.0.254
iptables -F iptables -A INPUT -p tcp -d 10.0.0.254 --dport 80 -j ACCEPT iptables -A INPUT -p tcp -j DROP
② 舉例:將本地的80端口的請求轉發到8080端口,本機地址10.0.0.254
# 方式1:redirect iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 # 方式2:DNAT iptables -t nat -A PREROUTING -p tcp -d 10.0.0.254 --dport 80 -j DNAT --to-destination 10.0.0.254:8080
這裏列了兩種方式,第一種redirect方式實際上是端口重定向,只對本機IP有效,效率比DNAT高。第二種則是DNAT轉發模式,它既可以轉發到本機IP,也可以轉發到外部其他主機。
③ 舉例:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然後針對192.168.137.0/24開通22端口,對所有網段開放80端口,對所有網段開放21端口。
iptables -F iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 21 -j ACCEPT
小結
- 使用
-t
參數來指定對哪個表進行操作,缺省狀態下默認是對filter
表。 - 要重視規則的順序,默認是由上到下進行匹配,前面若匹配成功並執行相應的動作以後,後面再有規則可以匹配到之前的報文,也無法執行相應的動作。這裏舉例說明下:
舉例:僅允許遠端IP爲192.168.0.1的主機訪問本機的22端口。
先來看常見的錯誤寫法:
iptables -P INPUT ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT
上例中的規則想要實現僅允許遠端192.168.0.1的IP訪問本機的22端口。本機INPUT規則鏈預設爲ACCEPT允許所有包流入,第一條規則匹配到對本機的22端口的所有請求報文並執行丟棄動作,第二條規則匹配到來源於192.168.0.1對本機22端口的訪問,這時候允許執行動作是沒有任何效果的;因爲第一條規則直接拒絕了所有的包。所以這種寫法有誤。正確的寫法應該是:
iptables -P INPUT ACCEPT iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
或者:
iptables -P INPUT DROP iptables -A INPUT -p tcp --dport 22 -j DROP iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT
iptables的基本概念以及常見參數先總結到這裏。關於iptables更多常用的命令,之後再抽時間總結整理吧。
The End.