
我喜歡手動編輯 iptables 文件,但有些事情讓我有點困惑。
從我對iptables手冊的理解來看,它從上到下遍歷規則,如果不可能匹配,它將被記錄並被底部的預設規則拒絕。
都好。
但這些是什麼意思:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
<accept ssh, ssl, etc>
<log all, deny all>
頂部的鏈具有預設策略“接受” - 這是否只是表示我們接受資料包到表中filter
以供以後匹配的一種方式?對我來說,讀完手冊後,感覺好像它會接受所有內容,然後不閱讀規則,因為這就是規則默認的工作方式 - 如果有任何內容匹配,它將停止閱讀規則,然後按照政策規定執行。有任何有關此行為的文件嗎?我找不到足夠具體的東西。
我也看到了這個,在*filter
表之後:
*filter
:RH-Firewall-1-INPUT - [0:0]
這使得您能夠添加自己的鏈並將其他鏈路路由到該鏈:
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
但這裡根本沒有為該鏈指定“ACCEPT”或“DROP”,而是有一個破折號(-)。
這讓我更加困惑——它是如何運作的?
答案1
內建鏈上的策略決定了封包會發生什麼情況,這些封包通過了鏈中的所有規則,而沒有將單一規則與決定性目標相匹配。在上面的範例中,如果資料包在整個
FORWARD
鏈中沒有與任何具有決定性目標的規則相匹配,則將被ACCEPT
ed,因為鏈的策略是ACCEPT
。使用者定義的鏈不能有策略。一路通過用戶定義鏈而沒有將規則與決定性目標相匹配的數據包將返回到發送它們的鏈,並在發送規則之後的規則處返回到用戶定義鏈(“調用鏈”)他們在那裡。
A決定性的目標是處理資料包的目標;例如DROP
、ACCEPT
、 和MASQUERADE
;非決定性目標包括LOG
和空目標(沒有目標的規則是相當合法的)。當封包與具有處置目標的規則相符時,該封包被視為已處理,並且不會發生進一步的規則處理。當封包匹配沒有判定目標的規則時,封包處理將繼續到下一個規則。
這種目標匹配和部署邏輯的一個重要推論是:首場決定性比賽獲勝。我們經常在 SF 上看到問題,人們有一條鍊子說,例如,
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
其中包含一條阻止存取 Web 伺服器的規則 ( tcp dpt:80
)。他們希望允許單一外部 IP 位址(例如1.2.3.4
)存取此 Web 伺服器,因此他們新增了一條規則
iptables -A INPUT -p tcp --dport 80 -s 1.2.3.4 -j ACCEPT
他們最終得到了這樣的鏈條
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80
正如您所看到的,最後一條規則的資料包計數為零 -而它們將永遠為零。沒有資料包可以在不匹配它之前的規則的情況下匹配最後一個規則,並且它之前的規則是決定性的(DROP
),因此沒有資料包將到達最後一個規則。
正確處理這個問題的方法是確保你的例外先於你的規則, 像這樣:
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
20 875 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
現在,首先處理異常接受,然後處理和丟棄不是來自異常伺服器的其他 Web 伺服器資料包,最後鏈策略處理所有其他資料包並接受它們。