Iptables
UDP NAT 不工作
除其他外,我在 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 鏈/表中流動。