Iptables

是否需要 nat table INPUT 鏈?

  • October 7, 2021

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/INPUTfilter/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)。

引用自:https://serverfault.com/questions/1008556