Какие опции `ServerAliveInterval` и` ClientAliveInterval` в sshd_config точно делают?

161

Я нашел этот вопрос , но извините, я не совсем понимаю настройки двух переменных ServerAliveIntervalи ClientAliveIntervalупоминается в принятом ответе. Если у моего локального сервера истекло время ожидания, должен ли я установить это значение на ноль? Это тогда никогда не истечет? Должен ли я вместо этого установить его на 300 секунд или что-то?

Мой вопрос прост: некоторые из моих подключений Write failed: Broken pipeперестают работать, когда я приостанавливаю, а затем отстраняю свой ноутбук с ответом, а некоторые нет. Как я могу правильно настроить локальный sshd, чтобы они не перестали работать со сломанным каналом?

М. Тиббитс
источник

Ответы:

203

ServerAliveInterval : количество секунд, которое клиент будет ожидать перед отправкой нулевого пакета на сервер (чтобы поддерживать соединение в активном состоянии).

ClientAliveInterval : количество секунд, в течение которых сервер будет ожидать, прежде чем отправлять нулевой пакет клиенту (чтобы поддерживать соединение в активном состоянии).

Установка значения 0 (по умолчанию) отключит эти функции, поэтому ваше соединение может разорваться, если оно простаивает слишком долго.

ServerAliveInterval, по-видимому, является наиболее распространенной стратегией поддержания соединения. Чтобы предотвратить проблему со сломанным каналом, вот конфигурация ssh, которую я использую в своем файле .ssh / config:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

Вышеуказанная настройка будет работать следующим образом,

  1. Клиент будет бездействовать в течение 60 секунд (время ServerAliveInterval) и отправить серверу «пустой пакет» и ожидать ответа. Если ответ не приходит, он будет пытаться выполнить описанный выше процесс до 10 раз (ServerAliveCountMax) (600 секунд). Если сервер по-прежнему не отвечает, клиент отключает соединение ssh.

ClientAliveCountMax на стороне сервера также может помочь. Это предел того, как долго клиент может оставаться без ответа до отключения. Значение по умолчанию равно 3, как в трех ClientAliveInterval.

Бартелеми
источник
Итак, я бы интерпретировал ноль секунд, чтобы подразумевать «не поддерживать жизнь», поэтому он не опрашивает клиент / сервер?
М. Тиббитс
3
yup 0 = не отправлять пустой пакет. Другое отличие состоит в том, что ServerAliveInterval установлен в конфигурации клиента, тогда как ClientAliveInternal установлен в конфигурации сервера.
Бартелеми
8
Это хороший совет для предотвращения простоя, вызывающего тайм-ауты, но я не понимаю, как это связано с вопросом OP о предотвращении разрыва труб, когда клиент приостанавливается. Когда клиент спит, он не сможет отправить пустой пакет, так что этот параметр является спорным?
Sparhawk
Часть ServerAlive, безусловно, есть. ClientAliveInterval / ClientAliveCountMax - то, что могло бы помочь здесь.
javawizard
1
Оглядываясь назад на этот старый ответ, я думаю, что ответил на вопрос в заголовке, а не на вопрос во втором абзаце, поэтому комментарии о ServerAliveInternal не помогли приостановить, с чем я согласен. @JonasWielicki ClientAliveInterval может быть плохим в случае приостановки, потому что приостановленный клиент не будет отвечать на сервер, и сервер в конечном итоге отключит клиент после ClientAliveCountMax.
Бартелеми
18

Это объясняется в sshd_configmanual ( man sshd_config):

ClientAliveInterval

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

ClientAliveCountMax

Значение по умолчанию - 3. Если ClientAliveInterval(см. Ниже) установлено значение 15 и ClientAliveCountMaxоставлено по умолчанию, неотвечающие клиенты SSH будут отключены примерно через 45 секунд. Эта опция применяется только к версии протокола 2.

Параметры клиента см. В объяснении man ssh_config:

ServerAliveInterval

Устанавливает интервал ожидания в секундах, после которого, если данные не были получены от сервера, sshотправит сообщение по зашифрованному каналу для запроса ответа от сервера. По умолчанию 0, что означает, что эти сообщения не будут отправлены на сервер. Эта опция применяется только к версии протокола 2.

ServerAliveCountMax

Значение по умолчанию - 3. Если, например, ServerAliveIntervalустановлено значение 15 и ServerAliveCountMaxоставлено значение по умолчанию, если сервер перестает отвечать на запросы, sshотключится примерно через 45 секунд. Эта опция применяется только к версии протокола 2.

На основании выше, 0 означает, что он отключен. Поэтому вы должны установить эти значения достаточно высоко, чтобы избежать ошибки сломанной трубы .

kenorb
источник
Полезный пост. Но я так расстроен этим. Я устанавливаю большие интервалы повсюду, и мое соединение все еще прерывается через несколько минут. (используя openssh в Ubuntu, не уверен, что это актуально)
Шридхар Сарнобат
1
@ user7000 Настройте клиент (ssh) и сервер (sshd). Это может помочь: Как исправить проблемы с «Соединение SSH было неожиданно закрыто удаленным концом» .
Кенорб
Я думаю, что я получаю куда-то. Возможно, я раньше не указывал пробел ServerAliveIntervalв своем конфигурационном файле.
Шридхар Сарнобат
16

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

Для ssh нет такой конфигурации, которая бы поддерживала такое соединение. SSH использует TCP, для начала вам нужно трехстороннее рукопожатие, а затем поддерживать его после некоторого простоя. Когда вы выключаете / переводите в спящий режим все ваши TCP-соединения закрываются с помощью FIN. Нет способа преодолеть это.

Для грязного обходного пути вы можете использовать VPS или другую онлайн-коробку с экраном, чтобы сохранить соединение. Мой совет не делайте этого по соображениям безопасности.

3h4x
источник
1
На самом деле это единственный ответ на вопрос.
Calimo
1
На самом деле это ужасное решение для безопасности, никогда не делайте этого.
Яричи
14

Поскольку вы не можете гарантировать, что SSH-соединение (то есть TCP) останется живым, как только один конец перестанет отправлять ACK на полученные пакеты, я лично использую http://www.harding.motd.ca/autossh/, чтобы перезапустить все мои SSH-соединения почти сразу же, как я приостановил.

Поскольку GNU Screen будет использоваться на стороне сервера, повторное подключение приведет меня туда, где я был раньше.

Вы можете прослушивать дополнительные порты, чтобы он постоянно проверял, что соединения все еще живы, но лично я считаю, что он достаточно хорошо работает с отключенным и полагается только на собственный SSH ServerAliveInterval/ ServerAliveCountMax.

Другой вариант - http://mosh.mit.edu/, который использует UDP и без проблем восстанавливается после длительного отсутствия соединения.

grifferz
источник
5

Вы также можете запускать команды, nohupесли хотите, чтобы они выполнялись независимо от вашего SSH-соединения.

например

$ nohup tar -xzf some_huge.tar.gz &

&Есть, я думаю, не стоит, но это удобно , так как это делает процесс работать в фоновом режиме , так что вы можете сделать другие вещи.

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

Баттл Буткус
источник
Примечание nohup на Zsh не работает должным образом!
Шридхар Сарнобат
@ user7000 что в этом плохого?
Баттл Буткус
Я не помню, я думаю, что это в основном не поддерживало процесс после того, как клиент был отключен. Это было несколько лет назад, и я перестал использовать nohup и вместо этого использовал disown.
Шридхар Сарнобат
2
Я думаю, что zshпользователи должны придерживаться disown -hвместо nohup, если только проблема не была исправлена ​​с тех пор.
Баттл Буткус
0

Поместите ваш длительный сеанс в экран. Смотрите screen -h для деталей

Таким образом, вы можете переподключиться к машине с помощью ssh и подключиться к экранной сессии

user180529
источник
Интересно, какой процент людей, которые предлагают экран, используют его сами?
Шридхар Сарнобат
Я думаю, что tmux - лучшее предложение, проверьте дату изменения кода github.com/tmux/tmux против git.savannah.gnu.org/cgit/screen.git/log
Suhaib