Як я можу захистити мої сеанси SSH від заморожування?


66

У мене є, ServerAliveIntervalі якщо у кількох машинах також ClientAliveIntervalвстановлено 540 у файлах конфігурації SSH клієнт / сервер (я вважаю, що встановити його більше, ніж це не було б гарною ідеєю). Я працюю з багатьма сесіями SSH, які в даний час заморожуються через кілька хвилин.

Як я можу це виправити? Мені потрібно, щоб сеанс взагалі не заморожувався, так що, якщо я відкрию сеанс о 8 і не використовую його протягом 4 годин, наприклад, все одно використовувати його ще раз о 12, не ввійшовши знову .


Як довго ви можете залишатись увійти (якщо це не пов’язано з відключенням мережі)? TCPKeepAlive yes?
Ійрін

Я не впевнений, але 10 хв. щонайбільше Що стосується TCPKeepAlive yes- залежить від машини.
синтагма

11
Просто використовувати mosh ?
Ві.

1
Або ви можете скористатися autossh...
ThoriumBR

Я б сказав, що залишати з'єднання відкритим на 4 години - це питання безпеки, і вам слід скористатися ним screen. Але я все ще відповідаю на ваше запитання, тому що я відчуваю те саме питання лише через хвилину-дві.
Дейл Андерсон

Відповіді:


80

Зміни, внесені в /etc/ssh/ssh_configі /etc/ssh/sshd_configправильні , але по - , як і раніше не мають ніякого ефекту.

Щоб ваша конфігурація працювала, зробіть ці зміни конфігурації на клієнті:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

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

Пакет NULL сервер надсилає клієнту. Той же пакет відправляється клієнтом на сервер. Пакет TCP NULL не містить жодного контрольного прапора, як SYN, ACK, FIN тощо, оскільки сервер не вимагає відповіді від клієнта. Пакет NULL описаний тут: https://tools.ietf.org/html/rfc6592

Потім налаштуйте sshd частину на сервері.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Сервер буде чекати 60 секунд, перш ніж відправити клієнту нульовий пакет, щоб зберегти з'єднання живим

TCPKeepAlive Чи є для того, щоб певні брандмауери не перестали працювати в режимі очікування.

Сервер ClientAliveCountMax надсилатиме клієнту живі повідомлення, навіть якщо він не отримав жодного повідомлення від клієнта.

Нарешті перезапустіть ssh server

service ssh restart або service sshd restartзалежно від того, на якій системі ви працюєте.


Я думаю, що ServerAliveCountMaxтакож потрібен високий рівень , щоб це було максимально надійним. І якщо і те, ServerAliveIntervalі інше ClientAliveIntervalвстановлено досить низько, я не думаю, що в цьому буде потреби TCPKeepAlive. Крім того, якщо є середні скриньки, вони все ще можуть втратити стан, навіть якщо всі згадані раніше налаштування точно налаштовані правильно. Це може допомогти використовувати MPTCP (якщо і клієнт, і сервер підтримують його).
kasperd

Спочатку незрозуміло, чи маєте ви на увазі конфігурацію на стороні клієнта чи на сервері (врешті-решт я підсумую, що на стороні клієнта). Потім в описі ServerAliveInterval ви говорите "клієнт надішле ... на сервер", але в наступному пункті " NULL пакет відправляється сервером клієнтові". Я вважаю це трохи заплутаним.
Крейг МакКуїн

1
Після додавання на сервер я отримую: / etc / ssh / ssh_config: рядок 57: Неправильний параметр конфігурації: clientaliveinterval / etc / ssh / ssh_config: рядок 59: Неправильний параметр конфігурації: clientalivecountmax
Anders

2
@Anders Ви отримуєте помилку, тому що ClientAliveIntervalі ClientAliveCountMaxє ssh-сервером, таким чином, призначеним для, sshd_configа неssh_config
Valentin Bajrami

1
@chandresh вам не доведеться. Після зміни ssh_configнових сеансів прочитає цей файл. /etc/environmentФайл інша річ , яка має формат VAR="value" без пробілів , таким чином , VAR = "value"будуть вважатися недійсними. Додавання /etc/ssh/ssh_configтакого способу буде тобто читати: Port 22або Host * яке трактуватиме це як команди
Валентин Байрамі

13

Особиста пропозиція: використовувати screenна віддаленому хості; йому вдасться зберегти ваше з'єднання живим до тих пір, поки він залишатиметься активним в терміналі.

Ось що я зазвичай додаю /etc/screenrcдля швидкої ідентифікації моїх сеансів на екрані:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

EDIT: Підказки.

hardstatusРядок покаже нижній рядок стану , такі як цей: Приклад сеансу екрана з трьома відкритими вкладками

Буфер прокрутки також розширюється на 8192 рядки замість звичайних 1000-1500 (залежно від розподілу).


Дякую, два запитання: 1. Чи можете ви пояснити варіанти у вашому screenrcфайлі? Як налаштувати систему запуску / tmux системи відразу після входу?
синтагма

8
Просто для уточнення, screenне підтримує ваш ssh-зв’язок живим. Він запускає процеси у віртуальному терміналі, незалежному від користувальницького терміналу, до якого ви підключаєтесь, щоб sshпроцес не покладався на ваше з'єднання. Ви все одно втратите sshзв’язок, поки це не буде вирішено.
Ійрін

1
Під " збереженням живого з'єднання " я, по суті, маю на увазі " запобігає простою з'єднання ", що має той же результат. Якщо протягом 4 годин немає входу, SSH перестане працювати в режимі очікування та врешті-решт закриє з'єднання, всі дочірні процеси теж пішли.

2
Наскільки я любив screen, я раджу новим користувачам починати tmux.
dotancohen

2

З OpenSSH:

Вам потрібно включити

TCPKeepAlive yes

як у вашому клієнті ssh_config (наприклад, /etc/ssh/ssh_configабо в ~/.ssh/config), так і у вашому кінцевому сервері SSH, на якому працює OpenSSH (наприклад, / etc / ssh / sshd_config).

Тож кожен раз, коли ваше з'єднання простоює, OpenSSH надсилає якийсь манекеновий пакет своєму хосту призначення ...


Це також може призвести до того, що з'єднання зійде на The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. linux.die.net/man/5/sshd_config
iyrin

Чесно кажучи, але "[…] network goes down […] client host crashes […] route is down […]"це серйозні помилки, жодна конфігурація SSH не може наздогнати. Головною проблемою тут є непрацюючі сеанси SSH, а не збої в мережі. Тому підсумовуючи це: - включення і TCPKeepAlive yesв сервері, і в клієнті. - встановити ClientAliveInterval на сервері - встановити IdleTimeoutна сервері - встановити ClientAliveCountMax Це повинно зробити трюк ...
Мартін Аллерт

2

Якщо проблема полягає в сплячому ноутбуці або мережевому підключенні, яке не є префектом, я б рекомендував використовувати moshякий перебігає sshі дозволяє автоматично підключитися.

З веб-сайту :

Mosh (мобільна оболонка)

Застосування віддаленого терміналу, що дозволяє виконувати роумінг, підтримує переривчасте підключення та забезпечує інтелектуальне локальне відлуння та редагування рядків натискань користувача.

Mosh - це заміна SSH. Це більш надійний та чуйний, особливо через Wi-Fi, стільникові та міжміські зв’язки.

Mosh - безкоштовне програмне забезпечення, доступне для GNU / Linux, BSD, macOS, Solaris, Android, Chrome та iOS.

У поєднанні з tmux(або старішою screen) це дозволяє мені підключитися sshдо сервера зі свого ноутбука та залишатися на зв’язку цілими днями, навіть коли змінюються підключення Wi-Fi та виживають мобільні дані, що випадають.


Ось посилання на mosh.org та на mosh на Github
joeytwiddle

1

Перевірте конфігурацію Sshd на хост - машині /etc/sshd_configдля IdleTimeoutустановки .

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.