Как установить соединение между двумя компьютерами, находящимися за NAT?

У меня есть два компьютера (compA и compB), каждый из которых находится за NAT на серых IP-адресах. Мне необходимо установить проброс TCP порта так, чтобы, выполняя команду "telnet 127.0.0.1 8000" на компьютере A, я получал ответ от программы, слушающей порт 8000 на компьютере B. 

У меня есть возможность развернуть промежуточный сервер C с белым IP-адресом. В теории, сервер C будет выполнять функцию, на которой запустится программа, а на компах A и B будут работать клиенты, которые смогут взаимодействовать друг с другом. Они могли бы обмениваться трафиком через сервер C или напрямую (это не критично, так как трафика немного).

Какой open-source программный продукт вы могли бы рекомендовать для решения этой задачи? Я уже рассматривал ngrok и его альтернативы, но, похоже, они не предназначены для работы с устройствами на серых адресах. Разные STUN-серверы также изучал, но они, судя по всему, больше ориентированы на UDP. 

Технически, я понимаю, что можно использовать openvpn, но поднимать интерфейсы кажется излишним для проброса всего лишь одного порта.
  • 12 февраля 2025 г. 11:44
Ответы на вопрос 2
Для вашей задачи можно рассмотреть несколько подходов. Если вам нужно установить соединение между компьютерами A и B, находящимися за NAT, и у вас есть сервер C с белым IP-адресом, вы можете использовать следующие решения:

1. **SSH-туннелирование**:
   Если на сервере C запущен SSH-сервер, вы можете использовать SSH-туннелирование для создания защищенного канала между компами A и B. Например:

   - На компе A вы настраиваете туннель:
     ```bash
     ssh -L 8000:localhost:8000 user@serverC
     ```

   - На компе B вы также настраиваете туннель:
     ```bash
     ssh -R 8000:localhost:8000 user@serverC
     ```

   После этого, при попытке подключения к `localhost:8000` на компе A, запрос будет перенаправлен на сервер C, который затем перенаправит его на комп B.

2. **Socat**:
   `socat` — это мощная утилита для проксирования сетевых соединений. Вы можете настроить её как на сервере C, так и на компах A и B для проброса порта. Пример:

   - На компе A (выводит на сервер C):
     ```bash
     socat TCP-LISTEN:8000,fork TCP:serverC:8001
     ```

   - На компе B (выводит на сервер C):
     ```bash
     socat TCP-LISTEN:8001,fork TCP:localhost:8000
     ```

   - На сервере C:
     ```bash
     socat TCP-LISTEN:8000,fork TCP:localhost:8001
     ```

3. **Tailscale**:
   Tailscale – это более современное решение, которое создает VPN-сеть на основе WireGuard. Оно позволяет соединять устройства в одной сети, даже если они находятся за NAT. Tailscale автоматически обрабатывает NAT и предоставляет простой доступ к ресурсам. Для вашего случая просто установите Tailscale на все три устройства, и они смогут общаться друг с другом по назначенному IP-адресу.

4. **ZeroTier**:
   ZeroTier — ещё один вариант, работающий подобным образом. Он создает виртуальные сети между устройствами, что позволяет им взаимодействовать, даже если они находятся за NAT. Просто установите ZeroTier на ваши устройства, создайте сеть и добавьте устройства в эту сеть.

5. **Ngrok**:
   Вы уже упомянули `ngrok`. Хотя он не предназначен для работы непосредственно с приватными IP-адресами, его можно использовать для проброса портов, однако это требует дополнительных настроек на сервере и клиентских машинах.

Эти решения имеют свои плюсы и минусы, но все они позволяют выполнить требуемую задачу с пробросом TCP-портов и обеспечивают взаимодействие между устройствами, находящимися за NAT.
Обычный ssh и его тунелей будет достаточно. 
Один коннектится на vps и делает remote порты.
Второй коннектится на vps и пробрасывает порты как local
Похожие вопросы