Я хочу получить доступ к Raspberry Pi Zero W в локальной сети через Обход NAT. Я следил это руководство (на китайском языке), но у меня возникла проблема, описанная ниже.
Идея состоит в том, чтобы перенаправить порт SSH на локальном Raspberry Pi на удаленную машину с общедоступным IP-адресом, а затем получить оттуда доступ к Pi. В целях безопасности я заменил настоящие значения на nalzok@remote-ip
.
pi@nalzoks-pi:~ $ autossh -M 30000 -o "StrictHostKeyChecking=false" -o "ServerAliveInterval 10" -o "ServerAliveCountMax 3" -NR 20000:localhost:22 nalzok@remote-ip
У меня нет проблем с подключением к Pi с удаленного сервера
nalzok@iZuf68c45z6sk19lln4zvsZ:~$ ssh -p20000 pi@localhost
Linux nalzoks-pi 4.19.66+ #1253 Thu Aug 15 11:37:30 BST 2019 armv6l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Sep 8 10:12:30 2019 from ::1
pi@nalzoks-pi:~ $
Однако я не могу получить к нему доступ прямо со своего компьютера.
$ ssh -p20000 pi@remote-ip
ssh: connect to host remote-ip port 20000: Connection refused
Я почти уверен, что брандмауэр открыт для портов 20000 и 30000 на удаленном сервере. Пытаясь самостоятельно устранить неполадки, я понял, что эти порты доступны только для локального доступа.
nalzok@iZuf68c45z6sk19lln4zvsZ:~$ sudo lsof -i -P -n | grep LISTEN
[sudo] password for nalzok:
sshd 601 root 3u IPv4 13223 0t0 TCP *:22 (LISTEN)
sshd 12503 root 8u IPv4 879255 0t0 TCP 127.0.0.1:1234 (LISTEN)
sshd 13026 nalzok 9u IPv4 885817 0t0 TCP 127.0.0.1:30000 (LISTEN)
sshd 13026 nalzok 10u IPv4 885818 0t0 TCP 127.0.0.1:20000 (LISTEN)
Как открыть порт 20000 для публичного доступа?
Это поведение удаленной пересылки явно задокументировано в страница руководства SSH:
По умолчанию прослушивающие сокеты TCP на сервере будут привязаны только к интерфейсу обратной связи. Это можно изменить, указав bind_address. Пустой bind_address или адрес «*» указывает, что удаленный сокет должен прослушивать все интерфейсы. Указание удаленного bind_address будет успешным только в том случае, если включена опция сервера GatewayPorts (см. Sshd_config (5)).
Если GatewayPorts
вариант включен на сервере, вы должны указать удаленную переадресацию следующим образом, чтобы воспользоваться ею:
-R *:20000:localhost:22