UPnP 打孔无法使用外部 IP 访问本地子网上的设备

UPnP hole punching can't use external IP to access device on local subnet

我有一个有点独特的情况,我需要能够为多节点对等类型的应用程序执行 NAT 打洞;所有节点都必须从 public 可访问的 IP 地址相互引用,即使其中一些节点可能位于本地子网上。

在这个问题的帮助下,我已经能够成功映射端口 (UDP hole punching implementation) using Open.Nat

我的代码基本上就是这么简单:

var discoverer = new NatDiscoverer();
var device = await discoverer.DiscoverDeviceAsync();
await device.CreatePortMapAsync(new Mapping(Open.Nat.Protocol.Tcp, port, port));

这成功地在我的路由器中创建了一个地图

我现在可以通过执行某些操作从外部网络(在移动数据连接上测试)成功连接到此 IP 和端口号 像这样

TcpClient client = new TcpClient();
client.Connect("publicip", 6968);

但是,当我尝试从 [=50] 连接到 相同的 public ip 地址 时=]本地子网 连接将失败并显示“No connection could be made because the target machine actively refused it?”。

我已经使用 wireshark 查看是否有任何数据包到达目标机器,但似乎没有。

很明显,路由器可能无法 forward/route 在本地子网上正确连接,所以我想了解的是,如果这是已知的限制UPnP 协议或特定于我的路由器?也许您在创建我遗漏的映射时有技巧?

我注意到我的路由器似乎使用 MiniUPnP http://miniupnp.free.fr/ 版本 20160321

我知道这是一个很难回答的问题,但希望我们能从专家那里得到一些关于 UPnP 在这种情况下应该做什么的澄清。

编辑:

关于我的问题的更多背景信息;让我详细说明为什么我有这样的要求。我在跨网络边界的移动设备上使用 Akka.NET clusters,Akka 集群要记住的关键点是 成功获得 Akka.NET 集群以形成集群之间必须可以生物定向访问.

现在考虑这样的情况

我的目标是只需要为服务器节点分配一个静态 ip,并允许所有集群节点无缝进出网络边界。实现此目的的理想方法是为网络上的每个节点分配 public 可到达的地址,而不管其物理位置如何。

这不是您真正可以解决的问题,也不是特定于 C# 的。大多数路由器只会匹配到达其面向互联网接口的 NAT 数据包。如果要允许同一 NAT 后面的多个节点 运行 直接相互连接,则需要实施另一个解决方案。

例如,您可以共享每个节点的专用接口地址。如果 public 地址匹配,则尝试直接连接。