Как работает tcp-keepalive в ssh?

85

Я пытаюсь закодировать shell-скрипт, который использует ssh-соединение для выполнения "heartbeats". Я хочу прекратить клиентское и серверное соединение после определенного тайм-аута (после разрыва соединения).

Что я нашел до сих пор:

  • TCPKeepAlive да / нет для ssh и sshd
  • ClientAliveCountMax для sshd
  • ClientAliveInterval для sshd
  • ServerAliveCountMax для SSH
  • ServerAliveInterval для SSH

Чтобы изменить «ClientAliveCountMax», мне нужно изменить sshd_config на каждой целевой машине (эта опция по умолчанию отключена).

Итак, мой вопрос - могу ли я использовать «TCPKeepAlive» также для своих целей (не изменяя что-либо еще на исходных / целевых машинах)?

Целевой операционной системой является SLES11 SP2 - но я не думаю, что это уместно здесь.

Nils
источник
Все эти параметры предназначены для ситуаций, когда брандмауэр или промежуточное устройство по соединению прервет соединение. Эти параметры предназначены для периодической отправки данных, чтобы поддерживать соединение в активном состоянии, а также для отключения соединения при наличии X ожидающих ответов. Можете ли вы предоставить немного больше информации о том, что вы делаете? Вы используете ControlMasterопцию и используете подчиненные соединения?
Патрик
Я просто хочу создать средство для определения, не работает ли другой узел, используя несколько соединений ssh-сети с несколькими физическими линиями. Я делаю это, просто открывая ssh-сессию (это более или менее делает бесконечный цикл). Я хочу, чтобы этот сеанс завершился, если разрывается соединение. Мне интересно, каков интервал / количество для TCPKeepalive.
Нильс

Ответы:

104

Вы, вероятно, хотите использовать настройки ServerAlive для этого. Они не требуют какой-либо настройки на сервере и могут быть установлены в командной строке, если хотите.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Это будет отправлять сообщение ssh keepalive каждые 5 секунд, и если придет время отправить еще один keepalive, но ответ на последний ответ не был получен, то соединение разрывается.

Критическая разница между ServerAliveIntervalи TCPKeepAliveпредставляет собой слой , они работают на.

  • TCPKeepAliveработает на уровне TCP. Он отправляет пустой пакет TCP ACK. Межсетевые экраны можно настроить так, чтобы они игнорировали эти пакеты, поэтому, если вы проходите через межсетевой экран, который сбрасывает незанятые соединения, они могут не поддерживать соединение живым.
  • ServerAliveIntervalработает на слое ssh. На самом деле он будет отправлять данные через ssh, поэтому TCP-пакет содержит зашифрованные данные, и брандмауэр не может определить, является ли он активным или легитимным пакетом, поэтому они работают лучше.
Патрик
источник
1
Я думаю, что это правильное направление. Первоначальные тесты показали, что это будет работать - оно прекратит отправку и получение подпроцессов ssh / sshd не позднее, чем через 5 секунд после разрыва соединения. Я догадываюсь, что TCPKeepalive просто использует значения по умолчанию для TCP-стека, поэтому его также сложнее настроить.
Нильс
Это также решает проблему пользователя-призрака. Я полагаю, что это также можно сделать в настройках PuTTY , изменив Seconds between keepalivesна 1800 в Настройки | Подключение.
Боб Стейн
7

Эта TCPKeepAliveопция на самом деле является совершенно другим методом поддержания соединений по сравнению с параметрами ClientAlive или ServerAlive.

На странице руководства BSD SSH , мы можем прочитать, что:

Живые сообщения клиента отправляются через зашифрованный канал и, следовательно, не могут быть подделаны. Опция keepalive протокола TCP, включенная TCPKeepAliveподделкой. Механизм «живой клиент» полезен, когда клиент или сервер зависят от того, когда соединение стало неактивным.

TCPKeepAliveУбедиться , должна ли система посылать TCP оставайся в живых сообщения на другую сторону. Опция по умолчанию всегда включена.

Если вы используете ClientAliveInterval, вы можете отключить TCPKeepAlive. Эта опция отправляет сообщение через зашифрованный канал для запроса ответа от клиента (по умолчанию 0, поэтому сообщения не отправляются клиенту) и ClientAliveCountMaxустанавливает количество живых сообщений клиента до того, как sshd отключит клиент, завершив сессия.

kenorb
источник