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

SSH не может отключиться после прерывания

У меня есть набор проблем, которые объединяются в одну неприятную проблему.

Предыстория: у меня есть сервер за обратным туннелированием межсетевого экрана с использованием внешнего VPS (мы назовем сервер «сервером», а VPS, который он подключается к «туннельной машине»). Туннель SSH умрет случайным образом. У меня есть сценарий на сервере для повторного подключения, но, к сожалению, демон SSHD на туннельной машине (под управлением CentOS 6.5) часто НЕ выключается. Он просто остается открытым, что означает, что обратный туннель не может связываться с портами.

Я установил ClientAliveInterval на 15 и ClientAliveCountMax на 2 на туннельной машине, чтобы заставить сервер прекратить прослушивание, если прошло более 30 секунд. Иногда это работает ... иногда нет. Во многих случаях он будет просто сидеть и вечно слушать порты в поисках соединения, которого больше нет, и, поскольку он не откажется от портов, ssh не сможет к ним привязаться.

У меня тоже две второстепенные проблемы. Когда я неизбежно получаю Write failed: Broken pipe по команде ssh на сервере, он не пытается переподключиться. SSH просто сидит и ждет ввода. Аналогично сообщение Connection to xxx.xxx.xxx.xxx timed out while waiting to write иногда всплывает. На клиенте у меня ServerAliveInterval на 15 и ServerAliveCountMax на 4, поэтому он ждет 1 минуту перед попыткой повторного подключения. Тем не менее, этого недостаточно, поскольку это сообщение может привести к зависанию SSH на неопределенное время. Для предупреждений об ошибках удаленной переадресации портов я использую -o ExitOnForwardFailure=yes чтобы убедиться, что SSH умирает, если он получает одно из этих предупреждений, чтобы мой сценарий знал об ошибке и мог повторить попытку. Но для Write failed: Broken pipe и других я не могу найти такой вариант, и каждый раз, когда возникает одна из этих ошибок, SSH никогда не умирает и не перезагружается.

Во-первых, что случилось с процессом sshd, который не завершается при потере соединения, и, во-вторых, как я могу гарантировать, что КАЖДОЕ отключение или предупреждение приводит к завершению SSH, чтобы гарантировать, что он может попытаться восстановить соединение?

Кроме того, да, прежде чем кто-либо упомянет об этом: я пробовал autossh, и он страдает теми же недостатками.