致所有 iptables 专家:我正在研究在我的网络中使用 UDP 打洞来实现 NAT 穿越的可行性 - 我试图找出哪些 UDP 端口可以用于 NAT 后面两个对等体之间的 P2P 连接(想象两个玩家尝试玩使用 P2P 网络模型的在线游戏)。我观察到我的 ISP 允许在某些端口范围内进行 NAT 穿越(例如可能是 9000-29999)
找出这些有利端口是相当可行的 - 只需在公共可访问的 IP 地址 (A) 和端口 (P) 上公开一个中央 UDP 服务器,然后您从计算机连接到该服务器。然后,中央服务器将向您发送(或者您从其日志中读取,无论如何)您连接的 IP 地址和端口 - 要实现 P2P 连接,您希望您的 ISP 的 NAT 也使用这个发现的端口来连接其他对等点(我在这里不详细介绍,这只是一个大概的想法)。
因此,要测试端口是否保持不变,您可以连接到主机上的另一个端口,如果返回的地址和端口相同,则有可能建立 p2p 连接(我也应该尝试不同的主机 - 好吧 - 但我的预算有限,所以主机相同,端口不同)。
现在我知道我刚才描述的本质上是 STUN 服务器背后的想法,请不要建议在答案中研究它,我对这个问题中的 STUN 服务器不感兴趣。
要找到另一个合适的端口,只需连接到服务器上的另一个端口,然后查看返回的端口是否仍然相同。要找到所有端口,只需扫描整个端口范围,找出哪些端口可以工作(在哪些端口上您的公共端口保持不变),哪些端口不工作。
例如,如果我在端口 3478 和 3479(默认 STUN 端口)以及端口 5000 上启动服务器,我会发现我的公共端口对于端口 3478 和 3479 保持不变,但对于端口 5000 却完全不同。为什么?我不知道。
为了测试更多这些端口,我需要在多个端口上启动服务器(或者在更多端口上打开多个 UDP 套接字,我认为这没关系)...所以我想我可以做一些解决方法,只需在一个端口上启动服务器端并在 iptables 中设置一些巧妙的重定向规则(例如将端口 1024~65535 重定向到 UDP 服务器正在运行的端口):
概述:
------------------ --------------------------
Public Internet Your normal home computer behind your ISP's NAT
System A System B
L = local IP address 10.0.0.1
A = some public IP address
UDP Server, port P=6000 <------------> UDP Client (running on some constant local port Z)
trying to connect to range of ports [1025 ~ 65535]
------------------ ----------------------------
用于将端口 1024~65535 的连接重定向到端口 6000 的 iptables 规则:
-A PREROUTING -i ens3 -p udp -m udp --dport 1024:65535 -j REDIRECT --to-ports 6000
设置此规则后,我能够使用任何重定向端口连接到服务器,但是:我的流量的一个方面发生了巨大变化 - 服务器报告的源端口现在开始一直变化,即使是我之前确定为有利的端口(例如 3478、3479)。好像重定向不仅将 UDP 数据包重定向到目标端口,而且还更改其源端口。
我理解这可能是 iptables(netfilter?)有据可查的行为,并且对此无能为力。
但也许还有一些其他我不知道的 iptables 魔法可以实现所需的行为 - 例如不干扰 UDP 数据包中的源端口。
有人知道吗?