Перфорация UPnP не может использовать внешний IP для доступа к устройству в локальной подсети. - PullRequest
2 голосов
/ 06 февраля 2020

У меня есть несколько уникальная ситуация, когда мне требуется возможность пробивать 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));

Это успешно создает карту в моем роутере

enter image description here

Теперь я могу успешно подключиться к этому 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 для формирования всех Члены кластера должны быть биологически доступны друг другу .

Теперь рассмотрим ситуацию, подобную этой

enter image description here

Моя цель состоит в том, чтобы только назначить IP-адрес c для узла сервера и позволить всем узлам кластера беспрепятственно перемещаться и выходить за пределы сети. Идеальный способ добиться этого - назначить общедоступные адреса каждому узлу сети независимо от того, где он физически расположен.

1 Ответ

2 голосов
/ 10 февраля 2020

Это на самом деле не то, что вы можете исправить, и на самом деле не указано c до C#. Большинство маршрутизаторов будут соответствовать только NAT-пакетам, которые поступают на их интерфейс inte rnet. Если вы хотите разрешить нескольким узлам, работающим за одним и тем же NAT, подключаться напрямую друг к другу, вам нужно будет внедрить другое решение.

Например, вы можете совместно использовать адреса частных интерфейсов каждого узла. Затем попытайтесь подключиться напрямую, если адрес публикации c совпадает.

...