我有一个特殊的情况,我需要能够对多节点对等类型的应用程序执行NAT打孔;所有节点都必须从可公开访问的IP地址中互相引用,即使其中一些节点可能位于本地子网上。
我已经能够使用UDP hole punching implementation在此问题(Open.Nat)的帮助下成功映射端口。
我的代码基本上就是这样简单:
var discoverer = new NatDiscoverer();
var device = await discoverer.DiscoverDeviceAsync();
await device.CreatePortMapAsync(new Mapping(Open.Nat.Protocol.Tcp, port, port));
这成功在我的路由器中创建了一个地图
我现在可以通过执行类似的操作成功连接到该IP和端口号来自外部网络(在移动数据连接上进行了测试)>
连接到同一公共IP地址时,连接将失败,并显示“ No connection could be made because the target machine actively refused it?”。TcpClient client = new TcpClient(); client.Connect("publicip", 6968);
但是,当我尝试从本地子网
我已经使用wireshark来查看是否有任何数据包降落到目标计算机上,看来它们没有。
很显然,路由器可能无法在本地子网上正确转发/路由连接,所以我想了解的是这是UPnP协议的已知限制还是特定于我的路由器] >?当您创建我错过的映射时,也许有一个窍门?
我注意到我的路由器似乎使用MiniUPnP http://miniupnp.free.fr/版本20160321
我意识到这是一个棘手的问题,但是希望我们可以从专家那里得到一些关于在这种情况下UPnP应该做什么的澄清。
编辑:
我的问题有更多背景;让我详细说明为什么我有这样的要求。我在跨网络边界的移动设备上使用Akka.NET clusters,要记住Akka群集的要点是要成功获得一个Akka.NET群集以形成该群集的所有成员,必须彼此生物方向可达
。现在考虑这种情况
我的目标是只需要为服务器节点分配一个静态IP,并允许所有群集节点无缝地移入和移出网络边界。实现此目的的理想方法是为网络上的每个节点分配可公开访问的地址,而不管其物理位置。
我有一个特殊的情况,我需要能够对多节点对等类型的应用程序执行NAT打孔;所有节点都必须公开引用彼此的地方...
这并不是您真正可以解决的问题,并且它并不是特定于C#的。大多数路由器只会匹配到达其面向Internet的接口的NAT数据包。如果要允许在同一NAT之后运行的多个节点直接相互连接,则需要实现另一个解决方案。
例如,您可以共享每个节点的专用接口地址。如果公共地址匹配,然后尝试直接连接。