是否需要 nat table INPUT 鏈?
iptables 手冊頁建議使用以下標準表和鏈:
raw mangle nat filter PREROUTING X X X INPUT X X X FORWARD X X OUTPUT X X X X POSTROUTING X X
但是iptables 維基百科頁面中的圖表並沒有表明使用了 nat INPUT 鏈。我知道該圖是一種簡化,僅僅是因為它們例如故意省略了安全表。當我嘗試自學防火牆時,這可能是一個迂腐的問題,但答案可能很有趣。
更新:修復nat/INPUT順序。
原理圖最初不包括nat/INPUT,但我錯誤地寫了 int 在filter/INPUT之前,並且這個原理圖後來(錯誤地)更新為mangle/INPUT和filter/INPUT之間的這個鏈,結果是錯誤的。
nat/INPUT在**filter/INPUT之後掛鉤。
由於nat類型是特殊的並且與conntrack連結,事實證明nftables的優先級甚至不依賴於鉤子優先級,因為nat只影響同一nat鉤子內多個鏈之間的優先級。使用nftables而不是iptables無法通過將優先級更改為低於 filter/INPUT 的 0 或 mangle/INPUT 的 -150 的值來改變這一點:它總是準確地掛在 100 處。(與 nat/PREROUTING 的行為相同:它總是準確地掛接-100 用於 PREROUTING,即使鏈優先級為 -199)。所有這些都可以使用iptables
-j TRACE
或nftables進行測試meta nftrace set 1
特徵並查看遍歷鏈的結果順序。在核心 5.13.x 上進行的測試,關於此的特定行為將來可能會改變。iptables甚至無法更改這些優先級,無論如何也別無選擇。正如@Andrew Bate所寫,目前可以在此處找到給出正確順序的正確示意圖:
也就是說,關於這個問題……
nat/PREROUTING將在初始路由決策之前應用,對於所有情況(路由或本地端點流量),nat/INPUT 將在初始路由決策之後發生,僅當流量被視為本地時。
它在路由和連接跟踪方面的實現方式,在路由之前,使用nat/PREROUTING,您可以更改會影響路由的內容:目的地 (
-j DNAT
),但不能更改來源。路由之後,使用nat/INPUT,情況正好相反:您不能更改目的地,但可以更改起點 (-j SNAT
)。您與nat/OUTPUT(在示意圖上)和nat/POSTROUTING具有一定的反向對稱性:nat/OUTPUT僅用於本地發起的流量,並且可以更改路由決策,例如在nat/PREROUTING中,因此可以更改目的地(使用
-j DNAT
) ,第二個是所有流量,路由或本地啟動,在任何路由決策已經完成之後(並且可以使用nat/INPUT-j SNAT
更改源)。為了回答這個問題,nat/INPUT直到需要它才存在。它是專門為處理新出現的情況而創建的,它避免需要命名空間,而是使用conntrack 區域。它出現在 2010 年。此連結包含激發其創建的使用範例,但由於它使用 conntrack 區域(允許將完全相同的流(相同的 5 元組協議、saddr、sport、daddr、dport)分離為不同的 conntrack 條目,因此很難掌握)區域標籤。例如,對於特殊策略路由流量,一個從eth0到達eth2,另一個從eth1到達eth3,或者在第一個連結中環回流量並單獨跟踪/nat)。