Вопрос или проблема
Мой рабочий Wi-Fi часто отключается на несколько секунд. Это приводит к тому, что SSH-сессии, которые я не использую активно, отключаются. Есть ли способ поддерживать соединение даже при кратковременных отключениях Wi-Fi?
У меня была такая же проблема. Запуск сессий tmux
на рабочих серверах, а затем повторное подключение к ним после восстановления соединения позволило мне продолжать с того места, где я остановился, с минимальным количеством неудобств.
Одно из возможных решений, в зависимости от назначения ваших SSH-сессий и прав, которые у вас есть, – иметь другой интерфейс поверх него, который не будет отключаться.
Вы можете добиться этого с помощью VPN. Либо полноценного VPN (openvpn, wireguard, коммерческого), либо построенного на ssh
и tun
, например.
Конец ответа
Теперь перейдем к тому, как я это настроил (существует много других способов):
В моем случае интерфейс теперь просто отключается, он появляется с другим общим IP-адресом каждые несколько часов. Сессии, которые меня интересуют, относятся к хостам в одной сети, поэтому моим решением является туннель, с устройством tun
с моей стороны и другим на сети, к которой я хочу подключиться.
Просто один раз, например, при загрузке, создайте устройства с каждой стороны (вам нужно быть root):
ip tuntap add dev tun5 mode tun user youruser group yourgrup
ip address add 10.0.0.1/32 peer 10.0.0.2/32 dev tun5
(инвертируйте адреса на другой стороне)
Затем используйте параметр -w local_tun[:remote_tun]
(в этом случае -w 5:5
), чтобы подключиться с вашего хоста к другому хосту. Вам больше не нужны специальные разрешения, потому что вы создали устройства tun
для этого пользователя/группы.
В это время вы можете пинговать между вашими хостами по альтернативным адресам 10.0.0.x, и вы можете настроить политики, NAT, маршрутизацию и все остальное на ваших устройствах tun5
, как для любого другого сетевого устройства.
Итак, что происходит, когда ваша связь отключается? В это время сессия ssh
, связывающая два устройства tun
, завершается, но сами устройства tun
не отключаются, они просто буферизуют данные, и как только вы снова подключаетесь, трафик возобновляется.
Перезапуск связующей сессии ssh
будет утомительным, и именно здесь на помощь приходит autossh
. Он перезапустит эту сессию, когда это будет необходимо.
Вам просто нужно убедиться, что процессы, которые вы хотите, чтобы выжили после отключения, используют этот интерфейс (будь то IP или маршрут, NAT…). Вся настройка может показаться излишней, но она работает даже с клиентами DDNS. После того как DNS догонит изменения, сессия восстанавливается, и клиенты, использующие устройства tun
, продолжат работу.
В общем, TCP-соединения стабильны при коротких отключениях – в зависимости от настроек, но я думаю, по умолчанию, TCP должен выжить как минимум 60 секунд.
Но это предполагает, что ваш IP-адрес (/ адрес NAT’ирующего маршрутизатора) не меняется. Если это не так, то TCP с этим не справится.
Для таких ненадежных соединений есть удобный инструмент под названием mosh
, который отлично справляется с поддержанием SSH-соединения в рабочем состоянии через частые переподключения, изменения IP-адресов и другие помехи.
Он делает это, используя другой протокол управления потоком, чем TCP, поверх UDP и открывая UDP-сокет на сервере. Таким образом, это требует, чтобы ваш удаленный хост мог открыть UDP-порт, что обычно не является серьезным ограничением.
Вы можете попробовать настроить файл ~/.ssh/config
Host *
ServerAliveInterval 10
ServerAliveCountMax 60
Хорошее объяснение о том, что означает каждый параметр, можно найти здесь
Я также страдаю от потери SSH-сессий.
И мне не очень нравятся tmux и screen, которые ломают мои привычки.
Поэтому я написал инструмент реле для OpenSSH.
Даже если вы переключаете Wi-Fi или спите несколько часов.
сессия SSH все еще восстанавливается.
Вот он
https://github.com/yurenchen000/ssh-keep
Если вы не переключаете Wi-Fi (и маршрутизатор не убивает TCP-сессии)
Я думаю, что конфигурации клиента SSH достаточно
Host *
ServerAliveCountMax 99
ServerAliveInterval 0
TCPKeepAlive no
Ответ или решение
Для поддержания активного SSH-соединения даже при кратковременных отключениях Wi-Fi можно использовать несколько подходов, которые позволяют минимизировать риск разрыва сеанса и повысить его устойчивость. Приведем несколько детальных решений, основываясь на изложенных в вашем вопросе методах.
1. Использование tmux
или screen
Одним из наиболее простых и распространенных способов сохранения текущего сеанса является использование терминальных мультиплексоров, таких как tmux
или screen
. Эти инструменты позволяют вам создавать сессии, которые продолжают работать независимо от состояния SSH-подключения. После восстановления соединения вы можете просто повторно подключиться к уже существующей сессии и продолжить работу без потери прогресса.
Пример использования tmux
:
- Подключитесь к серверу через SSH.
- Запустите
tmux
:tmux
- Работайте в сессии
tmux
. - Если соединение разорвется, снова подключитесь к серверу и введите:
tmux attach
Это восстановит вашу сессию.
2. Настройка SSH конфигурации
Для уменьшения вероятности разрыва соединения можно настроить параметры SSH-клиента. Добавьте следующие строки в ваш конфигурационный файл ~/.ssh/config
:
Host *
ServerAliveInterval 10
ServerAliveCountMax 60
- ServerAliveInterval: определяет интервал в секундах, через который клиент будет отправлять пустые сообщения серверу, чтобы поддерживать соединение активным.
- ServerAliveCountMax: определяет, сколько попыток отправки сообщений клиент будет пытаться выполнить перед отключением.
Эти параметры помогут сохранить соединение активным даже при кратковременных разрывах.
3. Использование autossh
Для автоматического восстановления разорванных SSH-соединений можно использовать утилиту autossh
. Она будет следить за состоянием вашего соединения и автоматически повторно подключаться в случае разрыва. Установите autossh
, затем используйте его для подключения:
autossh -M 0 -f -N -L локальный_порт:удаленный_адрес:удаленный_порт имя_пользователя@сервер
Параметры:
-M 0
: отключает мониторинг, посколькуautossh
будет автоматически управлять состоянием соединения.-f -N
: отправляетautossh
в фоновый режим, не выполняя команд на сервере, и не создает интерактивную сессию.
4. Использование mosh
Если ваша работа подразумевает частые разрывы и изменения IP-адресов, рекомендуется рассмотреть альтернативу SSH — mosh
(Mobile Shell). Эта утилита использует протокол UDP, который обеспечивает большую устойчивость к разрывам соединения и более быстрое восстановление связи. Установите mosh
на сервере и клиенте и используйте его вместо SSH для более надежных соединений.
5. Установка VPN
Если вы имеете доступ к настройкам сети, использование VPN может быть хорошим вариантом. Виртуальные частные сети могут обеспечить устойчивое соединение, маскируя изменения IP-адресов и минимизируя разрывы в соединении. Вы можете использовать такие инструменты, как OpenVPN или WireGuard для создания надежного туннеля между вашим клиентом и сервером.
Заключение
Каждый из вышеперечисленных методов поможет вам минимизировать проблемы с разрывами SSH-соединений из-за кратковременных отключений Wi-Fi. В зависимости от вашего рабочего процесса и доступных ресурсов, выберите наиболее подходящее решение. Надеюсь, эти рекомендации помогут вам повысить стабильность и продуктивность работы с удаленными серверами.