Какие параметры `ServerAliveInterval` и` ClientAliveInterval` в sshd_config точно выполняются?

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

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

131 голос | спросил M. Tibbits 12 +04002010-10-12T20:11:52+04:00312010bEurope/MoscowTue, 12 Oct 2010 20:11:52 +0400 2010, 20:11:52

6 ответов


158

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.

ответил Barthelemy 12 +04002010-10-12T20:29:46+04:00312010bEurope/MoscowTue, 12 Oct 2010 20:29:46 +0400 2010, 20:29:46
14

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

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

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

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

ответил grifferz 26 J000000Saturday14 2014, 23:32:39
9

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

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

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

ответил 3h4x 21 MarpmFri, 21 Mar 2014 12:42:02 +04002014-03-21T12:42:02+04:0012 2014, 12:42:02
9

Это объясняется в руководстве sshd_config ( man sshd_config):

  

man sshd_config

     

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

     

ClientAliveInterval

     

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

Для параметров клиента см. объяснение в ClientAliveCountMax:

  

man ssh_config

     

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

     

ssh

     

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

Исходя из вышеизложенного, 0 означает, что он отключен. Поэтому вы должны установить эти значения достаточно высокими, чтобы избежать ошибки Broken pipe .

ответил kenorb 2 FriEurope/Moscow2016-12-02T23:17:20+03:00Europe/Moscow12bEurope/MoscowFri, 02 Dec 2016 23:17:20 +0300 2016, 23:17:20
4

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

например.

$ nohup tar -xzf some_huge.tar.gz &

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

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

ответил Buttle Butkus 28 AMpSun, 28 Apr 2013 08:50:50 +040050Sunday 2013, 08:50:50
0

Поместите свой длинный сеанс внутри экрана Подробнее см. Экран -h

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

ответил user180529 20 J000000Wednesday16 2016, 07:51:06

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132