я использую 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 не завершается правильно.