
在我的 Linux 盒子中10.20.1.1
,我有兩個 UDP 應用程式分別綁定在連接埠46000 (App A)
和上36000(App B)
。這些應用程式與分別綁定為10.10.1.1:36000 (Srv X)
和的兩個 UDP 伺服器進行通訊10.10.1.2:36000 (Srv Y)
。
當我發送資料包時,我要求始終使用 UDP 來源連接埠 36000 36000 - 36000
。
我的 iptables 規則如下。我的目的是DNAT
從 Srv X 連接埠傳入資料包,36000 to 46000
以便應用程式 A 接收它。
*nat
-A PREROUTING -s 10.10.1.1/32 -p udp --dport 36000 -j DNAT --to-destination :46000
*raw
-A PREROUTING -p udp --dport 36000 -j CT --notrack
-A PREROUTING -p udp -j ACCEPT
-A OUTPUT -p udp --dport 36000 -j CT --notrack
-A OUTPUT -p udp -j ACCEPT
*filter
-A INPUT -p udp -m udp --dport 36000 -j ACCEPT --> rule 1
-A INPUT -p udp -m udp --dport 46000 -j ACCEPT --> rule 2
-A OUTPUT -p udp -m udp --dport 36000 -j ACCEPT -> rule 3
當我從中發送一個資料包時,App A to Srv X
一切順利。/proc/net/ip_conntrack
和 OUT 封包中沒有 conntrack 條目匹配rule 3
。當回應來自 時Srv X to App A
,資料包遍歷原始表,但它DOES NOT
經歷DNAT
並直接跳到過濾表規則 1。
問題:
RAW表表明沒有
CONNTRACK
.然而,上述行為表明App A -> Srv X
帶有 src 和 dst 連接埠的第一個封包36000 - 36000
正在被某處的某個模組追蹤。因此,來自的反應Srv X -> App A
似乎沒有經過DNAT。我該如何避免這種情況CONNTRACK
?如何確保來自目標連接埠 36000 的 Srv X 的每個傳入資料包始終經過 DNAT?
預先感謝,電傳
答案1
透過查看網路過濾器文檔,據說“連接追蹤是 NAT 的基礎”,因此如果不啟用則無法擁有 DNAT連線。