Как надежно сохранить туннель SSH открытым?

Я использую туннель SSH от работы для обхождения различных idotic брандмауэров (она устраивает моего босса :)). Проблема, через некоторое время соединение SSH обычно зависает, и туннель повреждается.

Если я мог бы, по крайней мере, контролировать туннель автоматически, я мог бы перезапустить туннель, когда он зависает, но я даже не изобразил способ сделать это.

Бонусные очки для того, который может сказать мне, как препятствовать тому, чтобы мое соединение SSH зависло, конечно!

238
задан 08.09.2009, 16:04

7 ответов

Кажется, что Вам нужен autossh. Это будет контролировать туннель ssh и перезапускать его по мере необходимости. Мы использовали его в течение нескольких лет, и это, кажется, работает хорошо.

autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C

Больше деталей о-M параметре здесь

287
ответ дан 07.12.2019, 07:40
  • 1
    +1 для autossh, это делает то, что он говорит относительно олова. Я полагаю, что часть его функциональности также должна отправить активные пакеты стиля для предотвращения любого вида тайм-аута. – akent 08.09.2009, 16:55

в то время как существуют инструменты как autossh, который помогает перезапустить ssh сессию..., что я нахожу, чтобы быть действительно полезным, должен выполнить 'экранную' команду. Это позволяет Вам ВОЗОБНОВЛЯТЬ свои ssh сессии даже после разъединения. Особенно полезный, если Ваше соединение не так надежно, как это должно быть.

... не забывайте отмечать, это - 'корректный' ответ, если он помогает Вам k!;-)

1
ответ дан 07.12.2019, 07:40
  • 1
    ..., но вопрос был о том, как сохранить туннели SSH открытыми, не только терминальный сеанс. Экран ЯВЛЯЕТСЯ большим хотя! – akent 08.09.2009, 17:15
  • 2
    я уже использую экран, но он не решает мою проблему :-/ Спасибо за Ваш ответ, все же. – Peltier 08.09.2009, 17:15

У меня была потребность поддержать долгосрочный SSH-туннель. Мое решение работало с сервера Linux, и это - просто маленькая программа C, которая повторно порождает ssh использование основанной на ключе аутентификации.

Я не уверен в зависании, но у меня были туннели, умирают из-за тайм-аутов.

Я хотел бы предоставить код для respawner, но я, может казаться, не нахожу его прямо сейчас.

1
ответ дан 07.12.2019, 07:40

Я использовал следующий сценарий Bash, чтобы продолжать порождать новые туннели ssh, когда предыдущий умирает. Используя сценарий удобно, когда Вы не хотите или не можете установить дополнительные пакеты или использовать компилятор.

while true
do
  ssh <ssh_options> [user@]hostname
  sleep 15
done

Обратите внимание, что это требует, чтобы файл ключей установил соединение автоматически, но это имеет место с autossh, также.

23
ответ дан 07.12.2019, 07:40

У меня были подобные проблемы с моим предыдущим ISP. Для меня это было то же с любым соединением TCP, посещая веб-сайты или отправляя почту.

Решение состояло в том, чтобы настроить соединение VPN по UDP (я использовал OpenVPN). Это соединение было более терпимым к любому вызванному разъединения. Затем можно выполнить любой сервис посредством этого соединения.

Могут все еще быть проблемы с соединением, но так как туннель будет более терпимым, любая ssh сессия будет чувствовать короткую задержку вместо того, чтобы быть разъединенным.

Чтобы сделать это, Вам будет нужен сервис VPN онлайн, который можно установить на собственном сервере.

0
ответ дан 07.12.2019, 07:40

Все брандмауэры с сохранением информации забывают о соединении после не наблюдения пакета для того соединения в течение некоторого времени (чтобы препятствовать тому, чтобы таблицы состояния стали полными соединений, где оба конца умерли, не закрывая соединение). Большинство реализаций TCP отправит пакет проверки активности после долгого времени, не получая известие от другой стороны (2 часа общая ценность). Если, однако, будет брандмауэр с сохранением информации, который забывает о соединении, прежде чем пакеты проверки активности смогут быть отправлены, то долговечное, но неактивное соединение умрет.

Если это так, решение состоит в том, чтобы препятствовать тому, чтобы соединение стало неактивным. OpenSSH имеет опцию под названием ServerAliveInterval, который может использоваться, чтобы препятствовать тому, чтобы соединение было неактивно слишком долго (в качестве награды, он обнаружит, когда одноранговый узел умер раньше, даже если соединение неактивно).

40
ответ дан 07.12.2019, 07:40

На Вашем собственном Mac или Linux машина настраивает Ваш ssh, сохраняют сервер ssh живым каждые 3 минуты. Откройте терминал и пойдите Ваш Ваш невидимый .ssh в Вашем доме:

cd ~/.ssh/ 

затем создайте 1 файл конфигурации строки с:

echo "ServerAliveInterval 180" >> config

необходимо также добавить:

ServerAliveCountMax xxxx (high number)

значение по умолчанию равняется 3, таким образом, ServerAliveInterval 180 прекратит отправлять после 9 минут (3 из 3-минутного интервала, указанного ServerAliveInterval).

24
ответ дан 07.12.2019, 07:40

Теги

Похожие вопросы