Iptables

UDP NAT 不工作

  • June 9, 2020

除其他外,我在 IP 地址為 192.168.1.71 和 abcd 的機器上有以下 iptables NAT 規則,其中 abcd 代表公共 IP 地址:

iptables -t nat -A PREROUTING -p udp --dport 20001 -j DNAT --to-destination 192.168.1.72:20000
iptables -t nat -A POSTROUTING -p udp -s 192.168.1.72 --sport 20000 -j SNAT --to-source a.b.c.d:20001

當通過 STUN,我嘗試在本地機器 192.168.1.72 上找到分配給具有本地埠 20000 的套接字的公共 IP 地址時,我沒有得到 20001,我一直得到 32018。但是,我確實得到了正確的 IP 地址 abcd我需要在我的 iptables 規則中進行哪些更改?

更新:問題在於我從 STUN 響應中計算埠號。相關問題:規則:

  iptables -A INPUT -p udp -j LOG --log-prefix "iptables: "

不記錄匹配數據包的數據包,但會記錄其他數據包。將此規則置於上述兩條規則之上或之下並沒有什麼不同。

如果第一個數據包總是從網路內部發送,那麼你只需要規則 in POSTROUTING。Linux 連接跟踪還處理 UDP“關聯”,因此它知道如何處理返回數據包。

例如,DNS over UDP 回複數據包使用 Linux 連接跟踪中繼到 NAT 後面的客戶端。

您的LOG規則被放入INPUT錶鍊中filter,該鏈僅用於目的地是路由器本身的數據包。PREROUTING/鏈處理的數據包POSTROUTING永遠不會進入INPUT鏈。

您的規則應如下所示:

iptables -t nat -A POSTROUTING -p udp -j LOG --log-prefix "iptables: "
iptables -t nat -A POSTROUTING -p udp -s 192.168.1.72 --sport 20000 -j SNAT --to-source a.b.c.d:20001

https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg是一個全面的圖像,數據包如何在 Linux 網路堆棧和不同的 IPTables 鏈/表中流動。

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