SSH: keep-alive: чтобы подключение не отваливалось

Решает задачу, когда SSH-сессия постоянно отваливается при простое: терминал открыт, пару минут ничего не вводите — и подключение уже мёртвое. Часто такое бывает из-за NAT, VPN, мобильного интернета, роутера, фаервола или агрессивных сетевых таймаутов.

Коротко: чаще всего достаточно настроить keep-alive на стороне SSH-клиента в файле ~/.ssh/config.

Host *
	ServerAliveInterval 30
	ServerAliveCountMax 120

Важно: это не “таймер бездействия пользователя”. Расчёт 30 × 120 означает, сколько времени SSH-клиент будет ждать ответа от сервера на keep-alive-сообщения, если сервер перестал отвечать.

Что решаем

Нужно сделать так, чтобы SSH-подключение не разрывалось слишком быстро, когда в терминале нет активности.

Способ подходит для обычной админской работы: правка конфигов, просмотр логов, деплой, обслуживание сервера, работа с файлами и проверка сервисов.

Когда способ не подходит: если на сервере запускается долгая команда, которую нельзя потерять при обрыве соединения. Для таких задач лучше использовать tmux, screen или отдельный systemd-сервис. Keep-alive помогает держать SSH-соединение живым, но не делает его бессмертным.

Общее правило

В SSH есть две стороны: клиент и сервер.

  • Клиент — это место, откуда запускается команда ssh: ваш компьютер, ноутбук, рабочая машина или другой сервер.
  • Сервер — это место, куда вы подключаетесь по SSH: VPS, выделенный сервер, контейнер или внутренняя машина.

Главное правило: параметры ServerAlive* настраиваются на стороне SSH-клиента, а параметры ClientAlive* — на стороне SSH-сервера.

Если настраиваем параметры ServerAliveInterval и ServerAliveCountMax, меняем конфиг SSH-клиента:

~/.ssh/config

Если настраиваем параметры ClientAliveInterval и ClientAliveCountMax, меняем конфиг SSH-сервера:

/etc/ssh/sshd_config

В большинстве случаев начинать лучше с клиентской настройки. Она проще, безопаснее и не требует менять конфигурацию сервера.

Готовое решение: настройка SSH-клиента

Откройте или создайте файл ~/.ssh/config:

nano ~/.ssh/config

Добавьте настройки:

Host *
	ServerAliveInterval 30
	ServerAliveCountMax 120

Что означают параметры:

  • ServerAliveInterval 30 — SSH-клиент отправляет служебный keep-alive-сигнал каждые 30 секунд, если по соединению нет данных от сервера.
  • ServerAliveCountMax 120 — SSH-клиент допускает 120 keep-alive-сообщений без ответа.

Расчёт:

30 секунд × 120 попыток = 3600 секунд
3600 секунд = примерно 60 минут ожидания ответа от сервера

Если сервер отвечает на keep-alive-сообщения, соединение может жить дольше. Если сервер перестал отвечать, клиент разорвёт подключение примерно через это время.

Настройка только для одного SSH-хоста

Если не нужно применять keep-alive ко всем SSH-подключениям, настройте конкретный хост:

Host my-server
	HostName 123.123.123.123
	User root
	ServerAliveInterval 30
	ServerAliveCountMax 120

После этого подключение выполняется короткой командой:

ssh my-server

Вместо my-server лучше указать понятный алиас: production, backup-server, client-site-1 или другое имя, которое легко вспомнить.

Нужно ли добавлять TCPKeepAlive

Иногда в примерах добавляют ещё один параметр:

TCPKeepAlive yes

Для большинства задач основную работу делают именно ServerAliveInterval и ServerAliveCountMax. Они работают на уровне SSH и отправляют сообщения внутри зашифрованного канала.

TCPKeepAlive работает ниже, на уровне TCP. Его можно оставить включённым, но не стоит считать его главным решением проблемы с SSH-сессиями.

Полный вариант клиентского конфига может выглядеть так:

Host *
	ServerAliveInterval 30
	ServerAliveCountMax 120
	TCPKeepAlive yes

Если SSH ругается на права файла

На Linux, macOS и в Git Bash SSH может отказаться читать файл ~/.ssh/config, если у него слишком широкие права.

Исправьте права:

chmod 600 ~/.ssh/config

Дополнительно: настройка SSH-сервера

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

Откройте конфиг SSH-сервера:

sudo nano /etc/ssh/sshd_config

Добавьте или измените параметры:

ClientAliveInterval 60
ClientAliveCountMax 60

Что означают параметры:

  • ClientAliveInterval 60 — SSH-сервер раз в 60 секунд проверяет, отвечает ли клиент.
  • ClientAliveCountMax 60 — сервер допускает 60 проверок без ответа.

Расчёт:

60 секунд × 60 попыток = 3600 секунд
3600 секунд = примерно 60 минут ожидания ответа от клиента

Это серверная настройка. Она влияет на входящие SSH-сессии и применяется для пользователей, которые подключаются к этому серверу.

Проверка и применение серверных настроек

Перед применением настроек обязательно проверьте конфигурацию SSH-сервера:

sudo sshd -t

Если команда ничего не вывела — синтаксис в порядке.

Если есть ошибка, не перезагружайте SSH, пока не исправите конфиг.

Для AlmaLinux, CentOS, Rocky Linux и RHEL:

sudo systemctl reload sshd

Для Ubuntu и Debian:

sudo systemctl reload ssh

Текущую SSH-сессию лучше не закрывать, пока вход не проверен во второй вкладке. Это простая привычка, которая иногда спасает от неприятного квеста “как теперь попасть на сервер”.

Пример использования

Обычный сценарий:

  • открыть файл ~/.ssh/config на стороне SSH-клиента;
  • добавить блок Host * с keep-alive-настройками;
  • сохранить файл;
  • переподключиться к серверу;
  • оставить SSH-сессию без ввода на 10–15 минут;
  • проверить, что соединение не разорвалось.

Минимальный рабочий вариант:

Host *
	ServerAliveInterval 30
	ServerAliveCountMax 120

Более полный вариант:

Host *
	ServerAliveInterval 30
	ServerAliveCountMax 120
	TCPKeepAlive yes

Краевые случаи

  • Если ноутбук ушёл в сон, SSH-сессия почти всегда оборвётся.
  • Если сменился IP-адрес клиента, старое SSH-соединение обычно восстановить нельзя.
  • Если VPN полностью разорвал туннель, keep-alive не спасёт уже существующую сессию.
  • Если роутер или провайдер жёстко убивает соединение, может понадобиться дополнительная настройка сети или VPN.
  • Если на сервере выполняется долгая команда без tmux, screen или фонового запуска, она может завершиться вместе с SSH-сессией.
  • Если используется нестандартный SSH-клиент, он может не читать файл ~/.ssh/config.

Безопасность

Keep-alive не открывает новые порты и не выдаёт дополнительных прав. Это только служебные сообщения внутри уже установленного SSH-подключения.

Но слишком большие таймауты могут быть нежелательны. Если оставить открытую SSH-сессию на чужом или общем компьютере, она будет жить дольше. Поэтому не стоит бездумно ставить огромные значения.

Плохой пример:

ServerAliveInterval 5
ServerAliveCountMax 999999

Для повседневной работы обычно достаточно 30–60 минут ожидания неотвечающей стороны.

Производительность

Keep-alive-сообщения маленькие и почти не создают нагрузки. Для обычного сервера разница незаметна.

Если к серверу одновременно подключаются сотни или тысячи SSH-клиентов, слишком частые проверки могут создавать лишний шум. В таком случае не стоит ставить интервал в 1–5 секунд без необходимости.

Практичный вариант:

ServerAliveInterval 30
ServerAliveCountMax 120

Более спокойный вариант:

ServerAliveInterval 60
ServerAliveCountMax 60

Совместимость

  • ServerAliveInterval и ServerAliveCountMax настраиваются на стороне SSH-клиента.
  • ClientAliveInterval и ClientAliveCountMax настраиваются на стороне SSH-сервера.
  • Настройки актуальны для OpenSSH на Linux, macOS, AlmaLinux, CentOS, Rocky Linux, Ubuntu и Debian.
  • На Windows настройки работают в Git Bash и OpenSSH-клиенте Windows, если используется файл ~/.ssh/config.

Тест / проверка

Проверить, какие параметры SSH-клиент применит для конкретного подключения:

ssh -G my-server | grep -i alive

Пример ожидаемого вывода:

serveraliveinterval 30
serveralivecountmax 120
tcpkeepalive yes

Если проверяется серверная конфигурация:

sudo sshd -t

После применения серверных настроек лучше открыть новую SSH-сессию во второй вкладке и убедиться, что вход работает.

Альтернативы

  • tmux — лучший вариант для долгих команд на сервере. Если SSH отвалится, процесс останется внутри tmux-сессии.
  • screen — старый, но рабочий аналог tmux.
  • systemd service — правильный вариант, если задача должна работать как постоянный фоновый сервис.
  • nohup — простой способ разово запустить команду независимо от терминала, но контролировать её менее удобно.
  • Mosh — удобен при нестабильной сети, но требует отдельной установки и UDP-доступа.

Итоговая шпаргалка

Обычно достаточно клиентской настройки:

Host *
	ServerAliveInterval 30
	ServerAliveCountMax 120

Если нужно настроить поведение на стороне SSH-сервера:

ClientAliveInterval 60
ClientAliveCountMax 60

Для повседневной работы лучше начинать с ~/.ssh/config. Это быстрее, безопаснее и не требует менять конфигурацию SSH-сервера.

Просмотров: 245
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram