Я использую туннель SSH от работы для обхождения различных idotic брандмауэров (она устраивает моего босса :)). Проблема, через некоторое время соединение SSH обычно зависает, и туннель повреждается.
Если я мог бы, по крайней мере, контролировать туннель автоматически, я мог бы перезапустить туннель, когда он зависает, но я даже не изобразил способ сделать это.
Бонусные очки для того, который может сказать мне, как препятствовать тому, чтобы мое соединение SSH зависло, конечно!
Кажется, что Вам нужен autossh. Это будет контролировать туннель ssh и перезапускать его по мере необходимости. Мы использовали его в течение нескольких лет, и это, кажется, работает хорошо.
autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
Больше деталей о-M параметре здесь
в то время как существуют инструменты как autossh, который помогает перезапустить ssh сессию..., что я нахожу, чтобы быть действительно полезным, должен выполнить 'экранную' команду. Это позволяет Вам ВОЗОБНОВЛЯТЬ свои ssh сессии даже после разъединения. Особенно полезный, если Ваше соединение не так надежно, как это должно быть.
... не забывайте отмечать, это - 'корректный' ответ, если он помогает Вам k!;-)
У меня была потребность поддержать долгосрочный SSH-туннель. Мое решение работало с сервера Linux, и это - просто маленькая программа C, которая повторно порождает ssh использование основанной на ключе аутентификации.
Я не уверен в зависании, но у меня были туннели, умирают из-за тайм-аутов.
Я хотел бы предоставить код для respawner, но я, может казаться, не нахожу его прямо сейчас.
Я использовал следующий сценарий Bash, чтобы продолжать порождать новые туннели ssh, когда предыдущий умирает. Используя сценарий удобно, когда Вы не хотите или не можете установить дополнительные пакеты или использовать компилятор.
while true
do
ssh <ssh_options> [user@]hostname
sleep 15
done
Обратите внимание, что это требует, чтобы файл ключей установил соединение автоматически, но это имеет место с autossh, также.
У меня были подобные проблемы с моим предыдущим ISP. Для меня это было то же с любым соединением TCP, посещая веб-сайты или отправляя почту.
Решение состояло в том, чтобы настроить соединение VPN по UDP (я использовал OpenVPN). Это соединение было более терпимым к любому вызванному разъединения. Затем можно выполнить любой сервис посредством этого соединения.
Могут все еще быть проблемы с соединением, но так как туннель будет более терпимым, любая ssh сессия будет чувствовать короткую задержку вместо того, чтобы быть разъединенным.
Чтобы сделать это, Вам будет нужен сервис VPN онлайн, который можно установить на собственном сервере.
Все брандмауэры с сохранением информации забывают о соединении после не наблюдения пакета для того соединения в течение некоторого времени (чтобы препятствовать тому, чтобы таблицы состояния стали полными соединений, где оба конца умерли, не закрывая соединение). Большинство реализаций TCP отправит пакет проверки активности после долгого времени, не получая известие от другой стороны (2 часа общая ценность). Если, однако, будет брандмауэр с сохранением информации, который забывает о соединении, прежде чем пакеты проверки активности смогут быть отправлены, то долговечное, но неактивное соединение умрет.
Если это так, решение состоит в том, чтобы препятствовать тому, чтобы соединение стало неактивным. OpenSSH имеет опцию под названием ServerAliveInterval, который может использоваться, чтобы препятствовать тому, чтобы соединение было неактивно слишком долго (в качестве награды, он обнаружит, когда одноранговый узел умер раньше, даже если соединение неактивно).
На Вашем собственном Mac или Linux машина настраивает Ваш ssh, сохраняют сервер ssh живым каждые 3 минуты. Откройте терминал и пойдите Ваш Ваш невидимый .ssh в Вашем доме:
cd ~/.ssh/
затем создайте 1 файл конфигурации строки с:
echo "ServerAliveInterval 180" >> config
необходимо также добавить:
ServerAliveCountMax xxxx (high number)
значение по умолчанию равняется 3, таким образом, ServerAliveInterval 180 прекратит отправлять после 9 минут (3 из 3-минутного интервала, указанного ServerAliveInterval).