除其他外,我在 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
链。您的规则应如下所示:
https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg是一个全面的图像,数据包如何在 Linux 网络堆栈和不同的 IPTables 链/表中流动。