
這頁面似乎表明,如果錶鍊中存在PREROUTING
將nat
目標翻譯1.2.3.4:80
為 的規則,則和鏈10.1.1.1:8080
中的規則應該匹配,而不是。INPUT
FORWARD
10.1.1.1:8080
1.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 和通用網路中的封包流描述了查看資料包的不同鉤子之間的關係。這是其中的一小部分:
所以如果你想互動莊嚴地帶數據包前nat,合乎邏輯的選擇是mangle/PREROUTING
:連線鉤子已經追蹤了資料包:它不會獲得無效狀態,但是納特仍然沒有發生。
只要記住 iptables'納特只看到第一個資料包,然後其他所有資料都直接由連線,仍然發生在同一個地方:在mangle/PREROUTING
和 路由決策之間。
Anton Danilov 的書中描述了另一種方法回答: 透過查詢連線從查找表中檢查以前的地址。