Плекс через двойной NAT
Я пытаюсь обойти своих провайдеров NAT операторского класса и все еще иметь доступ к моему серверу плекса извне.
Я нашел два руководства:
http://www.donaldsimpson.co.uk/2016/10/24/tunneling-out-of-carrier-grade-nat-cgnat-with-ssh-and-aws/
https://amoss.me/2017/05/port-forwarding-behind-a-carrier-grade-nat/
Для реализации у меня есть виртуальная машина Ubuntu 16.04, размещенная на digitalocean, которая имеет публичный IP. Я могу SSH с моего сервера Plex (также Ubuntu 16.04) на удаленный цифровой сервер Ocean.
На моем сервере Plex я запускаю следующую команду:
ssh -nNTv -R 32400:localhost:32400 root@<public IP of remote host>
И оставить это на экране.
Туннель успешен. С удаленного хоста здесь есть netstat и nc -v для интерфейса обратной связи:
root@Ubuntu1604:~/.ssh# nc -v 127.0.0.1 32400
Connection to 127.0.0.1 32400 port [tcp/*] succeeded!
root@Ubuntu1604:~/.ssh# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:32400 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 ::1:32400 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
root@Ubuntu1604:~/.ssh#
Но, как вы можете видеть, он не прослушивает общедоступный IP-адрес. Единственным другим активным интерфейсом, кроме loopback, является eth0, которому назначен общедоступный IP-адрес. Так что, если я попытаюсь получить доступ remote server public IP
:32400 Я ничего не получаю.
Как заставить мой удаленный сервер прослушивать 32400 eth0, при этом перенаправляя его на мой локальный сервер:32400?
2 ответа
У меня уже был пустой адрес привязки, проблема была в том, что мне нужно было указать привязку ко всем адресам, например так:
ssh -nNTv -R 0.0.0.0:32400:localhost:32400 root@<public IP of remote host>
От man 1 ssh
:
-R [bind_address:]port:host:hostport
[...]
По умолчанию прослушивающий сокет на сервере будет связан только с интерфейсом обратной связи. Это может быть отменено указанием
bind_address
, Пустойbind_address
или адрес*
, указывает, что удаленный сокет должен прослушивать все интерфейсы. Задание удаленного bind_address будет успешным, только если серверGatewayPorts
опция включена (см.sshd_config(5)
).
Поэтому сначала проще всего указать пустое bind_address
:
-R :32400:localhost:32400
Обратите внимание на начальный :
, это имеет значение.