Последующие действия: похоже, что быстрые серии отключений, совпадающие с несколькими месяцами работы каждого сервера, вероятно, случайны и служат только для выявления реальной проблемы. Причина, по которой ему не удалось восстановить соединение, почти наверняка связана со значениями AliveInterval (ответ Касперда). Использование параметра ExitOnForwardFailure должно позволить истечь тайм-аут перед повторным подключением, что должно решить проблему в большинстве случаев. Предложение MadHatter (сценарий уничтожения), вероятно, является лучшим способом убедиться, что туннель может повторно подключиться, даже если все остальное терпит неудачу.
У меня есть сервер (A) за брандмауэром, который инициирует обратный туннель на нескольких портах к небольшому VPS (B) DigitalOcean, чтобы я мог подключиться к A через IP-адрес B. Туннель непрерывно работал в течение примерно 3 месяцев, но неожиданно четыре раза за последние 24 часа произошел сбой. То же самое произошло некоторое время назад с другим провайдером VPS - месяцы безупречной работы, а затем внезапные множественные быстрые сбои.
У меня есть сценарий на компьютере A, который автоматически выполняет команду туннеля ( ssh -R *:X:localhost:X address_of_B
для каждого порта X), но когда он выполняется, он говорит Warning: remote port forwarding failed for listen port X
.
Зайдя в sshd /var/log/secure
на сервере, вы увидите следующие ошибки:
bind: Address already in use
error: bind: Address already in use
error: channel_setup_fwd_listener: cannot listen to port: X
Решение требует перезагрузки VPS. До этого все попытки переподключения дают сообщение «Переадресация удаленного порта» и не будут работать. Теперь дело доходит до того, что туннель длится всего около 4 часов до остановки.
На VPS ничего не изменилось, и это одноразовый однопользовательский компьютер, который служит только конечной точкой обратного туннеля. Это работает OpenSSH_5.3p1 на CentOS 6.5. Кажется, что sshd не закрывает порты на своем конце, когда соединение потеряно. Я затрудняюсь объяснить, почему или почему это внезапно произойдет сейчас после месяцев почти идеальной работы.
Чтобы уточнить, мне сначала нужно выяснить, почему sshd отказывается прослушивать порты после сбоя туннеля, что, по-видимому, вызвано тем, что sshd оставляет порты открытыми и никогда не закрывает их. Это, кажется, главная проблема. Я просто не уверен, что заставило бы его вести себя таким образом после нескольких месяцев поведения, как я ожидаю (то есть закрытие портов сразу и повторное подключение скрипта).