Юсуке пробивает дыру прямо в твоем NAT
Отказ от ответственности : это не готовое к использованию приложение для чата. Хотя он создает зашифрованные соединения AES client <-> client
и client <-> server
, этот код не проверялся и не тестировался какими-либо специалистами по безопасности. Это просто упражнение для меня, чтобы узнать больше о P2P-сетях и технологиях, а также предоставить некоторые примеры используемых технологий другим, кто заинтересован в обучении. Кроме того, клиент udp не реализует протокол, обеспечивающий успешную доставку сообщений, поэтому некоторые из них будут потеряны из-за нестабильных соединений.
Нажмите на изображение выше, чтобы посмотреть на YouTube видео о приложении чата в действии. Терминал в верхнем правом углу подключен по SSH к VPS, на котором работает сервер встречи. Терминал в правом нижнем углу — это пользовательский интерфейс терминала. Веб-приложение слева — это графический интерфейс.
go get github.com/wilfreddenton/udp-hole-punching
Основной пакет — сервер рандеву. Найдите VPS или что-то еще для его размещения. Вы можете запускать все локально, но на самом деле это не будет проверять, работает ли перфорация, потому что она находится на той же машине. Убедитесь, что на сервере есть порты TCP и UDP, открытые для входящего трафика с номеров 0–65535.
Чтобы запустить его:
go install
Существует два пользовательских интерфейса, которые вы можете использовать: gui
: веб-интерфейс и term-ui
, пользовательский интерфейс терминала. Вы можете использовать любую комбинацию пользовательских интерфейсов.
Прежде чем использовать его, вам следует открыть файл main.go
и переключить константы serverTCPIP
и serverUDPIP
на IP-адрес вашего сервера встречи (без порта).
Запуск веб-интерфейса
cd gui/ui
npm install
npm run build
cd ..
go install
gui
, если ваш сервер встречи работает локально, или gui -serverIP=<server IP here>
localhost:8000
Чтобы отключиться и начать новый чат, просто обновите чат.
Запуск пользовательского интерфейса терминала
cd term-ui
go install
term-ui
, если ваш сервер встречи работает локально term-ui -serverIP=<server IP here>
Чтобы отключиться и начать новый чат, ctrl-c
чтобы выйти из программы и запустить ее снова.
Если вы не друг, получите доступ к компьютеру за другим маршрутизатором и настройте там клиент.
Запустите клиенты и предоставьте PeerID одного клиента другому клиенту, и если топология сети позволяет пробивать дыры, вы установите зашифрованное соединение между клиентами.
ID
узла, с которым он хотел бы общаться.Чтобы немного упростить реализацию дырокола, клиенты не должны пытаться подключиться к частным IP-адресам друг друга. Клиенты, находящиеся за тем же NAT, по-прежнему смогут подключаться, но они будут делать это с общедоступными IP-адресами, а не с частными. Маршрутизаторы, которые я тестировал, похоже, понимали, что одноранговые узлы находятся в их локальной сети, и облегчали подключение без выхода во внешний Интернет.