Які параметри `ServerAliveInterval` та` ClientAliveInterval` у sshd_config точно роблять?


161

Я знайшов це питання , але вибачте, що я не дуже розумію налаштування двох змінних ServerAliveIntervalі ClientAliveIntervalзгаданий у прийнятій відповіді. Якщо мій локальний сервер закінчується, я повинен встановити це значення на нуль? Чи тоді це ніколи не вичерпується? Чи слід замість цього встановити його на 300 секунд чи щось таке?

Моє запитання полягає в тому, що деякі з моїх з'єднань вичерпуються, коли я призупиняю & потім відмовляю ноутбук у відповіді, Write failed: Broken pipeа деякі ні. Як я можу правильно налаштувати локальний sshd, щоб вони не виходили з ламаної труби?

Відповіді:


202

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

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

Якщо встановити значення 0 (за замовчуванням), вимкніть ці функції, щоб ваше з'єднання могло перепасти, якщо воно буде занадто довго простоювати.

ServerAliveInterval, здається, є найпоширенішою стратегією збереження зв'язку. Щоб запобігти порушенню проблеми з трубою, ось ssh config, який я використовую у своєму .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
Це здається гарною порадою, щоб запобігти неробству, викликаному таймаутам, але я не розумію, як це стосується питання ОП щодо запобігання поломці труб, коли клієнт зупиняється. Під час сну клієнт не зможе надіслати нульовий пакет, тож напевно цей параметр є суперечним?
Sparhawk

Звичайно, частина ServerAlive. Тут допоможе ClientAliveInterval / ClientAliveCountMax.
javawizard

1
Озираючись на цю стару відповідь, я вважаю, що відповів на запитання в заголовку, а не на запитання у другому абзаці, отже коментарі щодо ServerAliveInternal не корисні для призупинення, з чим я згоден. @JonasWielicki ClientAliveInterval може бути поганим у випадку призупинення, оскільки призупинений клієнт не відповість на сервер, а сервер згодом відключить клієнта після ClientAliveCountMax.
Бартелемі

18

Це пояснено в 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 означає, що він відключений. Тому слід встановити ці значення досить високо, щоб уникнути помилки труби .


Корисна публікація. Але я так засмучений цим. Я встановлюю великі інтервали повсюди, і мій зв’язок все-таки розривається через декілька хвилин. (використовуючи openssh на Ubuntu, не впевнений, що це актуально)
Шрідар Шарнобат

1
@ user7000 Налаштуйте і клієнта (ssh), і сервера (sshd). Це може допомогти: Як виправити неполадки за допомогою "Відключення SSH несподівано було закрито віддаленим кінцем" .
kenorb

Я думаю, що кудись дістаюся. Можливо, я раніше не ставив пробіл ServerAliveIntervalу своєму конфігураційному файлі.
Шрідхар Сарнобат

15

Відповідь від Бартелемі класний, але насправді не доходить до коріння проблеми. Ви призупиняєте свою машину і хочете, щоб сеанс SSH залишався живим під час завантаження комп'ютера.

Для ssh немає такої конфігурації, яка б підтримувала таке з'єднання живим. SSH використовує TCP, для початку вам потрібно тривимірне рукостискання, а потім продовжуйте жити через деякий час простою. При відключенні / сплячому режимі всі ваші TCP-з'єднання закриваються FIN. Ніякого способу цього не подолати.

Для брудного вирішення проблеми ви можете використовувати VPS або інший онлайн-вікно з екраном, щоб зберегти з'єднання. Мої поради цього не робіть з міркувань безпеки.


1
Це насправді єдина і єдина відповідь на питання.
Калімо

1
Це насправді жахливе рішення щодо безпеки, ніколи цього не робіть.
jahrichie

14

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

Оскільки GNU Screen буде використовуватися на стороні сервера, повторне приєднання переводить мене туди, де я був раніше.

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

Інший варіант - http://mosh.mit.edu/, який використовує UDP і безперешкодно відновлюється після тривалої відсутності підключення.


5

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

напр

$ nohup tar -xzf some_huge.tar.gz &

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

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


Зауважте, nohup на zsh не працює належним чином!
Шрідхар Сарнобат

@ user7000, що в цьому неправильно?
Buttle Butkus

Я не пам'ятаю, я думаю, що це в основному не підтримувало процес після відключення клієнта. Це було кілька років тому, і я перестав використовувати ногуп і замість цього відмовився.
Шрідхар Сарнобат

2
Я думаю, що zshкористувачі повинні дотримуватися disown -hзамість цього nohup, якщо тільки з цього часу проблема не виправлена.
Buttle Butkus

0

Помістіть тривалий сеанс всередині екрана. Детальніше див. На екрані -h

Таким чином ви зможете знову підключитися до машини за допомогою ssh та повторно приєднатись до екранного сеансу


Цікаво, який відсоток людей, які пропонують екран, насправді користуються ним самим.
Шрідхар Сарнобат

Я думаю, що tmux є кращою пропозицією, перевірити дату зміни коду github.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.