it-swarm-ru.tech

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

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

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

177
M. Tibbits

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.

227
Barthelemy

Это объясняется в sshd_config руководство (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 означает, что он отключен. Поэтому вы должны установить эти значения достаточно высоко, чтобы избежать ошибки Broken pipe.

29
kenorb

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

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

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

20
3h4x

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

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

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

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

16
grifferz

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

например.

$ Nohup tar -xzf some_huge.tar.gz &

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

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

5
Buttle Butkus

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

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

1
user180529