FORWARD 或 INPUT 鏈中的 iptables 過濾如何與 NAT 交互作用?

FORWARD 或 INPUT 鏈中的 iptables 過濾如何與 NAT 交互作用?

頁面似乎表明,如果錶鍊中存在PREROUTINGnat目標翻譯1.2.3.4:80為 的規則,則和鏈10.1.1.1:8080中的規則應該匹配,而不是。INPUTFORWARD10.1.1.1:80801.2.3.4:80

如果想要實施更像概述的操作順序該怎麼辦這裡?即NAT前如何對封包的特徵進行過濾?

一種可能性似乎是使用桌子PREROUTING的鏈條raw。問題是 conntrack 在raw/PREROUTING(請參閱註 1)中不可用,例如,非初始 UDP 片段將與初始片段無關,並且會產生意外的匹配。

如果我清楚地描述了這個困境,以及是否有任何解決方法,請告訴我。

註1:如果我錯了,請糾正我,但是當我嘗試在 中使用 conntrack 時raw/PREROUTING,所有初始 SYN 資料包都被標記為“ INVALID”而不是“ NEW”。在 Netfilter 流程​​圖中,「conntrack」似乎也位於raw/PREROUTING.

答案1

你不需要任何raw/PREROUTING規則。您可以使用conntrack匹配按原始(轉換前)目標/來源位址/連接埠號過濾封包。這conntrack是舊state比賽的後繼者。它可以檢查與conntrack entry(和 NAT)相關的各種附加元資料。

幾個例子:

# allow any port-forwarded packets
iptables -t filter -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

# check the original destination address of DNATed packets
iptables -t filter -A FORWARD -p tcp --dport 8080 -m conntrack --ctstate DNAT --ctorigdstport 80 --ctorigdst X.X.X.X --ctdir ORIGINAL -j ACCEPT

iptables -m conntrack --help有關更多詳細信息,請檢查和的輸出man iptables-extensions

答案2

Netfilter 和通用網路中的封包流描述了查看資料包的不同鉤子之間的關係。這是其中的一小部分:

Netfilter 和通用網路中的封包流

所以如果你想互動莊嚴地帶數據包nat,合乎邏輯的選擇是mangle/PREROUTING連線鉤子已經追蹤了資料包:它不會獲得無效狀態,但是納特仍然沒有發生。

只要記住 iptables'納特只看到第一個資料包,然後其他所有資料都直接由連線,仍然發生在同一個地方:在mangle/PREROUTING和 路由決策之間。

Anton Danilov 的書中描述了另一種方法回答: 透過查詢連線從查找表中檢查以前的地址。

相關內容