Два компьютера:
- Настольный-Ubuntu; фиксированный локальный IP, подключенный к модему с открытым портом 22 и переадресацией на него. Из-за динамического IP у меня нет учетной записи ip. Поэтому domain-Desktop-Ubuntu.com пересылает входящие запросы на этот компьютер.
- Удаленный Raspberry Pi 3 подключен к сотовой сети, в которой все входящие запросы закрыты интернет-провайдером.
Мне нужен SSH-доступ из Desktop-Ubuntu в RPi. Потому что это невозможно напрямую, я построил туннель. После всех сортировок или попыток заставить его работать постоянно (например, autossh
), это моя схема:
На RPi:
sshd_config
:
ClientAliveInterval 120
ClientAliveCountMax 720
Crontab каждые 5 минут, чтобы проверить, если ID процесса ssh
не является нулевым.
screen
используется для хранения вывода ssh
в отдельном окне оболочки.
*/5 * * * * /bin/sh /path-to/check-ssh-tunnel.sh
check-ssh-tunnel.sh
:
COMMAND="/usr/bin/screen -dmS ssh-Ubuntu /usr/bin/ssh -R 2255:localhost:22 user@domain-Desktop-Ubuntu.com -g"
COMMAND_SSH="/usr/bin/ssh -R 2255:localhost:22 domain-Desktop-Ubuntu.com -g"
PID=$(/usr/bin/pgrep -f -x "$COMMAND_SSH")
if [ "$PID" = "" ]
then
$COMMAND
fi
Вот связанный ps aux | grep ssh
я получаю через 3 часа после перезагрузки:
pi 2128 0.0 0.2 5396 2252 ? Ss 08:25 0:00 /usr/bin/SCREEN -dmS ssh-Desktop-Ubuntu /usr/bin/ssh -R 2255:localhost:22 user@domain-Desktop-Ubuntu.com -g
pi 2130 0.0 0.5 9132 4748 pts/0 Ss+ **08:25** 0:00 /usr/bin/ssh -R 2255:localhost:22 user@domain-Desktop-Ubuntu.com -g
Если я kill 2128
cron работает и:
pi 4755 0.0 0.2 5396 2092 ? Ss 11:25 0:00 /usr/bin/SCREEN -dmS ssh-Desktop-Ubuntu /usr/bin/ssh -R 2255:localhost:22 user@domain-Desktop-Ubuntu.com -g
pi 4756 0.0 0.5 9132 4840 pts/0 Ss+ **11:25** 0:00 /usr/bin/ssh -R 2255:localhost:22 user@domain-Desktop-Ubuntu.com -g
Чтобы получить доступ к RPi из Desktop-Ubuntu:
ssh -p 2255 pi@localhost
Моя проблема в том, что это соединение действует случайным образом:
- иногда спрашивают пароль и я подключаюсь
- иногда
ssh: connect to host localhost port 2255: Connection refused
- иногда для окончательного вывода
ssh_exchange_identification: read: Connection reset by peer
требуется много времени : read: сброс соединения по одноранговому узлу. После повторной попытки:Connection refused
.
Вернуться к RPi, кажется, ничего не изменилось:
$ screen -r # to get the ssh window
user@domain-Desktop-Ubuntu.com~$ ssh -p 2255 pi@localhost
ssh: connect to host localhost port 2255: Connection refused
В настоящее время и для всех этих тестов я удаленно управляю RPi с помощью Teamviewer. По некоторым причинам я не хочу использовать это в будущем, если это не было бы абсолютно необходимо. Вот почему мне нужен SSH-туннель.
Что случилось? Как заставить туннель работать надежно?