Вопрос или проблема
Я выполняю команду ssh с Ubuntu 18.04.3 LTS и mobaxterm
v21.5 и пытаюсь подключиться к плате Linux с ядром 4.9.
Я настроил в /etc/ssh/sshd_config
так
ClientAliveInterval 60
ClientAliveCountMax 0
на плате Linux.
Через 60 секунд отключение происходит только в версии openssh 8.0, но не отключается в версиях 8.2, 8.5, 8.7, 8.9. Это ошибка в версиях 8.2, 8.5, 8.7, 8.9?
Вman-странице для файла sshd_config
(Openssh v8.6p1) говорится в конце описания для ClientAliveCountMax
:
Установка нулевого ClientAliveCountMax отключает завершение соединения.
Ваша настройка ClientAliveCountMax 0
предотвращает отключения. Попробуйте значение по умолчанию 3
(как уже предлагал laur), или хотя бы 1
.
после указанного времени в ClientAliveInterval /etc/ssh/sshd_config
Какое значение вы настроили? man-страница sshd указывает следующее:
ClientAliveInterval
Устанавливает интервал времени ожидания в секундах, после которого, если данные от клиента не поступили, sshd(8) отправит сообщение через зашифрованный канал с просьбой о ответе от клиента. По умолчанию равно 0, что означает, что эти сообщения не будут отправляться клиенту.
Эта опция применяется только к версии протокола 2.
Если вы хотите, чтобы соединение завершалось, похоже, что значение по умолчанию – это правильный путь.
Обратите внимание, что поддержка сессии keepalive также настраивается на стороне подключающегося клиента в ~/.ssh/config
:
ServerAliveInterval
Устанавливает интервал времени ожидания в секундах, после которого, если данные от сервера не поступили, ssh(1) отправит сообщение через зашифрованный канал с просьбой о ответе от сервера. По умолчанию равно 0, что означает, что эти сообщения не будут отправляться серверу.
Эта опция применяется только к версии протокола 2.
Например, я не хочу, чтобы сессии ssh завершались, поэтому у меня следующее в ~/.ssh/config
:
Host *
ServerAliveInterval 15
ServerAliveCountMax 3
Возможно, вы можете просто использовать bash-скрипт, чтобы завершать неактивные ssh-соединения, и настроить этот bash-скрипт на выполнение в crontab каждую минуту. Просто измените значение ниже на предпочитаемое время неактивности для завершения ssh-соединения 1800 сек = 30 минут
#!/bin/bash
# Получить информацию о неактивности из команды "w"#
idle_info=$(w)
# Проходите по каждой строке информации о неактивности#
while IFS= read -r line; do
# Извлечь имя пользователя, терминал и время неактивности из строки
username=$(echo "$line" | awk '{print $1}')
terminal=$(echo "$line" | awk '{print $2}')
idle_time=$(echo "$line" | awk '{print $5}' | sed 's/[^0-9.]//g')
# Проверьте, является ли терминал сессией SSH, и превышает ли время неактивности 30 минут (1800 секунд)#
if [[ "$terminal" =~ ^pts/ ]] && (( $(echo "$idle_time > 1800" | bc -l) )); then
# Завершить сессию SSH#
sudo pkill -9 -t "$terminal"
echo "Завершена сессия SSH для пользователя $username на терминале $terminal (неактивен $idle_time секунд)"
fi
done <<< "$idle_info"
Ответ или решение
Устранение проблемы с таймаутом SSH в Ubuntu и MobaXterm
При использовании SSH для подключения к серверу или устройства, иногда возникает ситуация, когда подключение не разрывается после истечения времени ожидания. Вы описали свою ситуацию, в которой используете Ubuntu 18.04.3 LTS и MobaXterm версии 21.5 для подключения к Linux-оборудованию с ядром 4.9. Вы правильно настроили конфигурацию SSH на целевом устройстве, но столкнулись с тем, что отключение клиента происходит только на версии OpenSSH 8.0, но не происходит на версиях 8.2, 8.5, 8.7 и 8.9. Рассмотрим детали и возможные решения данной проблемы.
Понимание параметров конфигурации
В вашей конфигурации /etc/ssh/sshd_config
указаны следующие параметры:
ClientAliveInterval 60
ClientAliveCountMax 0
-
ClientAliveInterval – это интервал в секундах, по истечении которого сервер отправляет сообщения клиенту, чтобы проверить его доступность. В вашем случае, через 60 секунд вы ожидаете, что сервер уведомит клиента.
-
ClientAliveCountMax – это максимальное количество попыток отправки сообщений клиенту без получения ответа. У вас установлено значение 0, что, согласно документации, отключает разрыв соединения после истечения времени ожидания.
Решение проблемы
Согласно указанной настройке, значение ClientAliveCountMax 0
предотвращает отключение соединения. Чтобы корректно установить таймаут, вам следует рассмотреть возможность изменения этого параметра на 1 или 3. Это позволит серверу корректно завершать неактивные сессии. Например:
ClientAliveCountMax 3
Такое значение будет означать, что после трех неудачных попыток связи с клиентом (по истечению 180 секунд, если использовать ClientAliveInterval 60
), сервер разорвет соединение.
Дополнительные настройки на клиенте
Также стоит обратить внимание на настройки клиента. Если версия OpenSSH, используемая на клиенте (например, на MobaXterm), установлена с параметрами ServerAliveInterval
и ServerAliveCountMax
, это может влиять на поведение соединения.
Пример настройки в файле ~/.ssh/config
:
Host *
ServerAliveInterval 15
ServerAliveCountMax 3
Эта настройка заставит клиента отправлять запросы серверу каждые 15 секунд и завершит сессию, если не станет получать ответ.
Версии OpenSSH и возможные несоответствия
Вы отметили, что версия 8.0 ведет себя иначе, чем последующие версии (8.2, 8.5, 8.7, 8.9). Это может быть следствием изменений в реализации или поведении настроек между версиями OpenSSH. Однако, в случае использования параметра ClientAliveCountMax 0
, поведение разрыва соединения будет одинаковым, независимо от версии. Ваша проблема, вероятно, не является багом, а результатом неправильной конфигурации.
Альтернативные решения
Если по какой-то причине вам не удается настроить параметры SSH должным образом, можно рассмотреть возможность использования скрипта для ручного завершения неактивных SSH-сессий через cron. Скрипт может обеспечивать точный контроль за тем, когда сессии являются неактивными в течение определенного времени.
#!/bin/bash
idle_info=$(w)
while IFS= read -r line; do
username=$(echo "$line" | awk '{print $1}')
terminal=$(echo "$line" | awk '{print $2}')
idle_time=$(echo "$line" | awk '{print $5}' | sed 's/[^0-9.]//g')
if [[ "$terminal" =~ ^pts/ ]] && (( $(echo "$idle_time > 1800" | bc -l) )); then
sudo pkill -9 -t "$terminal"
echo "Killed SSH session for user $username on terminal $terminal (Idle for $idle_time seconds)"
fi
done <<< "$idle_info"
Этот скрипт будет искать неактивные SSH-сессии и завершать их, если они бездействуют дольше заданного времени (в данном случае 30 минут).
Заключение
Проблема с таймаутами при использовании SSH может быть легко решена путем корректной настройки параметров ClientAliveInterval
и ClientAliveCountMax
в sshd_config
. Не забывайте также конфигурировать настройки на клиенте. Если у вас есть дальнейшие вопросы или вам нужна помощь, не стесняйтесь обратиться за поддержкой.