如果一个对等方的网络有多个外部 IP 地址,是否可以进行 UDP 打孔?

网络工程 纳特 UDP
2022-02-13 13:23:47

我为 UDP 打孔开发了一个实现,它适用于我遇到的大多数用例。但是,我们的一个办公室有一个网络配置,我们有两个 ISP 为我们提供互联网以实现冗余。这是为两条线路之间的负载平衡而设置的,因此,每当您与某物建立出站连接时,您都会在哪条线路上建立该连接。显然,每条线路都有自己的外部 IP 地址,而我的软件不知道该地址是什么,或者它正在使用哪个地址。

我相信这会阻止 UDP 打孔工作。我通过一个 IP 地址连接到我在 AWS 上运行的已知连接服务器,但是当我的软件被告知要连接到世界其他地方的对等点时,它可能会尝试连接到与它相同 IP 的对等点对连接服务器做了,或者它可能使用另一个,在这种情况下它不会连接。

是否有解决方案,或者双外部 IP 地址是否意味着 UDP 打孔永远不会可靠?

1个回答

UDP 打孔由外部代理服务将 NAT 后的公共 IP:端口组合传回给实际的通信方。这些组合是实际使用的组合,所以是的,当 NAT 路由器使用公共 IP 池而不是单个 IP 时,它也应该工作。

但是,如果一个或两个 NAT 路由器使用受限锥形 NAT,则 UDP 打孔无法工作这样,在入站 NAT 上检查源 IP:端口,当它与建立参数不匹配时,数据包将被丢弃。很可能,这就是您所看到的。

UDP 打孔可以在“已知”环境中使用。在临时场景中,这是一个运气问题,而且远非可靠。对于较旧的路由器,它可能大部分都可以工作,但对于具有更严格安全性的较新路由器则不然。很有可能,随着时间的推移,你的情况会变得更糟。

您的问题有多种解决方案,最突出的是:

  • VPN(优点:最佳整体方法,缺点:最苛刻的设置)
  • 配置的端口转发(目标 NAT;优点:省力,缺点:每个 p2p 链接需要单独处理)
  • 一种集中的、主动的代理服务,用于中继通信(优点:在用户端几乎不需要任何努力,缺点:需要外部服务并集成到应用程序协议中)