Два компьютера:

  1. Настольный-Ubuntu; фиксированный локальный IP, подключенный к модему с открытым портом 22 и переадресацией на него. Из-за динамического IP у меня нет учетной записи ip. Поэтому domain-Desktop-Ubuntu.com пересылает входящие запросы на этот компьютер.
  2. Удаленный 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-туннель.

Что случилось? Как заставить туннель работать надежно?

0