Linux iptables DNAT 對沒有 conntrack 的傳入封包(無狀態)

Linux iptables DNAT 對沒有 conntrack 的傳入封包(無狀態)

在我的 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。

問題:

  1. RAW表表明沒有CONNTRACK.然而,上述行為表明App A -> Srv X帶有 src 和 dst 連接埠的第一個封包36000 - 36000正在被某處的某個模組追蹤。因此,來自的反應Srv X -> App A似乎沒有經過DNAT。我該如何避免這種情況CONNTRACK

  2. 如何確保來自目標連接埠 36000 的 Srv X 的每個傳入資料包始終經過 DNAT?

預先感謝,電傳

答案1

透過查看網路過濾器文檔,據說“連接追蹤是 NAT 的基礎”,因此如果不啟用則無法擁有 DNAT連線

相關內容