Решает задачу, когда 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-сервера.
Комментарии
0Нашли ошибку или хотите дополнить материал?