Як працює tcp-keepalive в ssh?


84

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

Що я знайшов поки що:

  • TCPKeepAlive так / ні для ssh та sshd
  • ClientAliveCountMax для sshd
  • ClientAliveInterval для sshd
  • ServerAliveCountMax для ssh
  • ServerAliveInterval для ssh

Щоб змінити "ClientAliveCountMax", я повинен був би змінити sshd_config на кожній цільовій машині (ця опція відключена за замовчуванням).

Отже, моє запитання - чи можу я використовувати "TCPKeepAlive" і для своїх цілей (не змінюючи нічого іншого на джерелах / цільових машинах)?

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


Ці параметри призначені для ситуацій, коли брандмауер або посередницький пристрій уздовж з'єднання припиняють з'єднання. Ці параметри призначені для надсилання періодичних даних для збереження живого зв'язку, а також для вимкнення з'єднання, коли є X непогашених відповідей. Чи можете ви надати трохи детальніше, що ви робите? Ви використовуєте ControlMasterопцію та використовуєте підлеглий зв'язок?
Патрік

Я просто хочу створити засіб, щоб визначити, чи інший вузол "вниз", використовуючи кілька з'єднань ssh-мережі з кількома фізичними лініями. Я роблю це, просто відкриваючи ssh-сеанс (що більш-менш робить нескінченний цикл). Я хочу, щоб сеанс припинився, якщо з'єднання розриваються. Мені цікаво, що таке інтервал / кількість для TCPKeepalive.
Нілс

Відповіді:


103

Напевно, ви хочете використовувати для цього налаштування ServerAlive. Вони не потребують будь-якої конфігурації на сервері, і їх можна встановити в командному рядку, якщо бажаєте.

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

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

Критична різниця між ServerAliveIntervalі TCPKeepAliveявляє собою шар , вони працюють на.

  • TCPKeepAliveпрацює на шарі TCP. Він надсилає порожній пакет TCP ACK. Брандмауери можуть бути налаштовані ігнорувати ці пакети, тому якщо ви проходите через брандмауер, який перестає працювати в режимі очікування, вони можуть не підтримувати з'єднання.
  • ServerAliveIntervalпрацює на шарі ssh. Він фактично надсилатиме дані через ssh, тому пакет TCP має зашифровані дані, і брандмауер не може визначити, чи є його збереження або законний пакет, тому вони працюють краще.

1
Я думаю, що це правильний напрямок. Початкові тести показали, що це спрацює - воно припинить надсилання та отримання підпроцесів ssh / sshd останні 5 секунд після того, як з'єднання перестане. Я маю на увазі, що TCPKeepalive просто використовує параметри за замовчуванням TCP-stack - тому і важче налаштувати.
Нілс

Це також вирішує проблему-привид. Я вважаю, що це також можна зробити в налаштуваннях PuTTY , змінивши Seconds between keepalivesдо 1800 у розділі Налаштування | З'єднання.
Боб Штейн

7

Цей TCPKeepAliveваріант насправді є зовсім іншим способом збереження зв’язків живими з параметрів, подібних ClientAlive або ServerAlive.

На сторінці посібника з BSD SSH ми можемо прочитати:

Повідомлення в реальному часі клієнта надсилаються через зашифрований канал і тому не підлягають підробці. Параметр TCP keepalive, увімкнений функцією, TCPKeepAliveможна підключити. Механізм оживлення клієнта є цінним, коли клієнт або сервер залежать від того, коли відомо, коли з'єднання стало неактивним.

TCPKeepAliveПереконатися , чи повинна система посилати TCP залишайся в живих повідомлення на іншу сторону. Параметр за замовчуванням завжди включений.

Якщо ви користуєтесь ClientAliveInterval, ви можете відключити TCPKeepAlive. Цей параметр надішле повідомлення через зашифрований канал, щоб вимагати відповіді від клієнта (за замовчуванням - 0, тому повідомлення не надсилаються клієнту) та ClientAliveCountMaxвстановлює кількість активних повідомлень клієнта, перш ніж sshd відключить клієнта, припинивши сесія.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.