Назад | Перейти на главную страницу

Надежный обратный туннель SSH

я использую autossh открыть обратный SSH-туннель с помощью закрытых ключей. Оболочка пользователя туннеля rssh и проверено как работающее.

Проблема, с которой я столкнулся, такова, независимо от ClientAliveInterval (15) и ClientAliveCountMax (3) ( sshd по умолчанию), на стороне клиента туннель открывается с помощью:

exec autossh -N                   \
  -o "ServerAliveInterval 60"     \
  -o "ServerAliveCountMax 3"      \
  -o "StrictHostKeyChecking no"   \
  -R ${tunnel_port}:localhost:22  \
  -i ./tunnel                     \
  -v                              \
  tunnel@directory.mytunnelhost.com

В ${tunnel_port} происходит из небольшого curl вызов, который ищет свободный порт на хосте туннеля, порт не меняется (он назначается на основе MAC-адреса запрашивающего поля)

Проблема в том, что когда TERMПри запуске туннельного клиента порты на хосте остаются занятыми, а процесс sshd продолжает работать:

Я также не могу войти в машины через туннель:

ubuntu@ip-10-252-138-233:~$ ssh -p 39777 pi@localhost
ssh: connect to host localhost port 39777: Connection refused

Мне интересно, что я могу сделать, чтобы сделать туннель более надежным, чтобы убедиться, что когда любой конец выходит из строя, он полностью мертв, разорван и не может войти в «сломанное» состояние.

Если бы я выполнял туннелирование через порт 80 или аналогичный, я мог бы написать check скрипт (этот демон запущен с runit), чтобы проверить, что какая-то HTML-страница была доступна из конца в конец через туннель, однако, когда она проходит через SSH и в качестве обратного туннеля, я не понимаю, как клиент может узнать, действительно ли туннель работает в отличие от просто бега?

Думаю, у вас есть два вопроса.

Во-первых, как убедиться, что процессы sshd на сервере завершаются, освобождая порты после отключения клиента. Если клиент отключается, я не знаю, почему серверные процессы будут зависать, если, возможно, у них нет дочерних процессов, но ваш снимок экрана показывает, что их нет. Если клиент не отключается, а просто перестает отвечать, то серверный процесс должен завершиться примерно через ClientAliveInterval * ClientAliveCountMax секунд спустя.

Во-вторых, как клиент может определить, работает ли туннель. Это то, что делает функция мониторинга портов autossh. Если вы добавите, например, -M 20000 на вызов autossh, он настроит переадресацию портов для отправки трафика на удаленный хост на порт 20000 и получит его обратно на порт 20001. Он будет пытаться отправлять трафик по циклу каждые AUTOSSH_POLL секунд (по умолчанию 600), и если он обнаруживает, что соединение перестало работать, разрывает его и запускает новое соединение ssh.

Добавление -M переключитесь на вызов autossh и, вероятно, установите AUTOSSH_POLL ниже, например 30, может помочь, если ssh не завершается правильно.