Для вашей задачи можно рассмотреть несколько подходов. Если вам нужно установить соединение между компьютерами 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.