У меня есть несколько уникальная ситуация, когда мне требуется возможность пробивать NAT для многоузлового однорангового приложения; где все узлы должны ссылаться друг на друга с общедоступных IP-адресов, даже если некоторые из этих узлов могут находиться на локальном сервере su bnet.
. Я смог успешно сопоставить порты с помощью этого вопроса ( Реализация пробивки дырок UDP ) с использованием 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);
Однако, когда я пытаюсь подключиться к тому же паблику c ip address из local su bnet соединение не будет установлено с ' Невозможно установить соединение, поскольку целевой компьютер активно отказал в этом? '.
Я использовал wireshark, чтобы увидеть, попадают ли какие-либо пакеты на целевой компьютер и кажется, что они этого не делают.
Очевидно, очевидно, что маршрутизатору, вероятно, не удается правильно переадресовать / маршрутизировать соединения на локальном сервере su bnet, , поэтому я пытаюсь понять, что если это известное ограничение протокола UPnP или спецификация c для моего маршрутизатора ? Возможно, есть хитрость при создании пропущенных сопоставлений?
Замечу, что мой маршрутизатор использует MiniUPnP http://miniupnp.free.fr/ Версия 20160321
Я понимаю, что на этот вопрос сложно ответить, но надеюсь, что мы можем получить некоторые разъяснения о том, что UPnP должен делать в этой ситуации от эксперта.
РЕДАКТИРОВАТЬ:
Чуть больше контекст моего вопроса; позвольте мне объяснить, почему у меня такое требование. Я использую Akka. NET кластеров на мобильных устройствах через границы сети. Ключевым моментом, который следует помнить с кластерами Akka, является , чтобы успешно получить кластер Akka. NET для формирования всех Члены кластера должны быть биологически доступны друг другу .
Теперь рассмотрим ситуацию, подобную этой
Моя цель состоит в том, чтобы только назначить IP-адрес c для узла сервера и позволить всем узлам кластера беспрепятственно перемещаться и выходить за пределы сети. Идеальный способ добиться этого - назначить общедоступные адреса каждому узлу сети независимо от того, где он физически расположен.