Как общаться между двумя узлами за NAT? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть несколько узлов. Каждый узел принадлежит другой сети. Каждый узел имеет частный IP-адрес, такой как 192.168.0.2 , и остается за NAT.

Есть ли возможность связи между узлами? На самом деле мне нужно передавать файлы между этими независимыми узлами.

Я пытаюсь использовать этот проект - https://github.com/libp2p/go-libp2p. Но libp2p имеет некоторые ограничения:

  1. Оба узла имеют частный IP-адрес (одна и та же сеть)
  2. Как минимум один из них имеет публичный IP-адрес.

Но у меня есть узлы с частным IP-адресом, и они принадлежат другой сети.


Update.

Есть такие решения:

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Идея состоит в том, что у вас есть сервер рандеву, к которому подключаются узлы 1 и 2.Для этого они должны знать IP-адрес сервера рандеву.

Это происходит следующим образом: 1) 1 и 2 оба отправляют пакеты UDP на RS.N1 (блок NAT узла 1) и N2 создают запись в таблице трансляции, которая отображает IP узлов на IP / порт RS.2) RS передает (EIP1, EP1) узлу 2. Это Tulpe, содержащий общедоступный IP-адрес блока NAT и общедоступный порт.RS отправляет (EIP2, EP2) узлу 1. 3) Узел 1 создает отображение в таблице трансляции: (IP1, EP1, EIP2, EP2).4) Узел 2 делает то же самое, но с (IP2, EP2, EIP1, EP1).

Примечание: шаги 3 и 4 выполняются, потому что каждый узел отправляет пакет UDP только что принятому кортежу (IP, порт)и, следовательно, поле NAT добавляет новую запись.В худшем случае эти сообщения должны отправляться более одного раза.

Этот прием позволяет обоим узлам захватывать общедоступные IP-адреса и иметь правильные порты.

Это обеспечивает хороший способустановления одноранговых соединений, например, для Skype.

Надеюсь, это поможет.

0 голосов
/ 26 сентября 2018

Libp2p не имеет таких ограничений.

Пример чата, который вы цитировали, запрограммирован таким образом, что он не может поддерживать частные IP-адреса за NAT НО Libp2p поддерживает такие методы обхода NAT, как Hole Punching, STUN, TURN и протокол начальной загрузки, а также загрузку с использованиемточка свидания с помощью DHT на данный момент.Это то, что вам нужно.

Вам могут пригодиться следующие примеры:

  1. chat-with-rendezvous: https://github.com/libp2p/go-libp2p-examples/tree/master/chat-with-rendezvous
  2. chat-with-tor:https://github.com/libp2p/go-libp2p-examples/pull/1
0 голосов
/ 24 июня 2018

Макс, я делаю это ответом на твой вопрос.

Какие компьютеры, к которым вы можете подключиться, настроены в сети или недоступны, не могут быть переопределены программным обеспечением на компьютере. Это было бы нарушением безопасности и могло бы стать причиной конфликтов адресов, потому что в разных NAT-зонах могут использоваться одни и те же IP-адреса.

Итак, вы не можете видеть компьютеры за маршрутизатором, если этот маршрутизатор использует NAT. Маршрутизатор не объявляет эти адреса.

Цель NAT - создать специальный остров IP-адресов, который никто не может видеть за пределами раздела NAT. Таким образом, компания может использовать меньше уникальных IP-адресов, чтобы иметь хорошо работающую сеть. Другая цель - безопасность. Маршрутизатор также скрывает MAC-адреса компьютеров внутри области NAT. Маршрутизатор может скрывать многие вещи.

Компьютеры внутри NAT-области могут инициировать контакт с компьютерами вне NAT ((если разрешено), маршрутизатор запомнит компьютер и сохранит для него преобразование адреса), но компьютер вне NAT не может адресовать компьютер внутри NAT. Он может отвечать только на компьютер изнутри. Он делает это, отвечая на маршрутизатор, и маршрутизатор узнает, какому компьютеру в области NAT переслать ответ.

Go не предоставляет библиотеки, которые могут решить эти внешние ограничения. Живи с этим. Вы ничего не можете сделать.

Как объясняет JBuchel, модель Skype может работать, если есть некоторые дополнительные условия, такие как открытые порты UDP, дополнительный сервер / компьютер и т. Д. Это на самом деле перестановка конфигурации сети, что невозможно сделать без помощи системные / сетевые администраторы.

Но если есть поддержка на этом уровне, решение будет намного проще, просто отключите компьютер от NAT и дайте ему IP-адрес, который виден для другого компьютера.

...