Как я могу сохранить мои сессии SSH от замерзания?

66

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

Как я могу это исправить? Я хочу, чтобы сеанс вообще не зависал, чтобы, если я открываю сеанс в 8 и не использую его в течение 4 часов, например, чтобы он все еще использовался в 12 без необходимости повторного входа в систему ,

синтагма
источник
Как долго вы можете оставаться в системе (если это не связано с отключением от сети)? TCPKeepAlive yes?
Айрин
Я не уверен, но 10 мин. в большинстве. Что касается TCPKeepAlive yes- зависит от машины.
синтагма
11
Просто использовать Мош ?
Ви.
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 (если и клиент, и сервер поддерживают его).
Касперд
С самого начала неясно, имеете ли вы в виду config на стороне клиента или на стороне сервера (в конце концов, я делаю вывод, на стороне клиента). Затем в описании ServerAliveInterval вы говорите «клиент отправит ... на сервер», но в следующем абзаце « NULL-пакет отправляется сервером клиенту». Я нахожу это немного запутанным.
Крейг МакКуин
1
После добавления на сервер я получаю: / etc / ssh / ssh_config: строка 57: неверный параметр конфигурации: clientaliveinterval / etc / ssh / ssh_config: строка 59: неверный параметр конфигурации: clientalivecountmax
Андерс
2
@Anders Вы получаете ошибку, потому что ClientAliveIntervalи ClientAliveCountMaxопции ssh-сервера, таким образом, предназначены для, sshd_configа не дляssh_config
Valentin
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

РЕДАКТИРОВАТЬ: Подсказки.

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. разрыву
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.
iyrin
источник