Два комп’ютери:
- Desktop-Ubuntu; фіксований локальний IP, підключений до модему з відкритим портом 22 та переадресацією до нього. Через динамічний IP я не маю облікового запису. Тож domain-Desktop-Ubuntu.com пересилає вхідні запити на цей комп'ютер.
- Віддалений Raspberry Pi 3 підключений до стільникової мережі, в якій всі вхідні запити закриті провайдером.
Мені потрібен SSH доступ з Desktop-Ubuntu до RPi. Тому що це неможливо безпосередньо, я збудував тунель. Зрештою, сортування або намагається змусити його працювати наполегливо ( autossh
наприклад), це моя схема:
У RPi :
sshd_config
:
ClientAliveInterval 120
ClientAliveCountMax 720
Crontab кожні 5 хвилин, щоб перевірити, чи не 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
працюю, і:
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
Після повтору: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.
Що не так? Як змусити тунель працювати надійно?
ServerAliveInterval
та ServerAliveCountMax
(вони призначені для ssh
, а не для sshd
).
ExitOnForwardFailure=yes
було ключовим
ClientAliveInterval
і т.д. питання на сервері. Ваш RPI є клієнтом, коли він намагається встановити тунель. Ціни для цієї мети, я думаю, дуже високі. Перевірте це питання . З'єднання, яке намагається встановити тунель, повинно бути невдалим, якщо переадресація порту не вдалася. Перевірте це питання та використовуйтеExitOnForwardFailure=yes
. Якщо мої два посилання допомогли, будь ласка, підсиліть мою відповідь (-и) там і напишіть тут свою (можливо, посилання). Якщо вони не допомогли, дайте відгуки.