Что делать, если зависает SSH-соединение?

«Что делать, если зависает SSH-соединение?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При зависании SSH-сессии я действую по следующему алгоритму диагностики и устранения:

1. Базовая проверка сети и сервера:

# Проверяю доступность хоста и сетевые задержки
ping -c 4 <server_ip>

# Проверяю, слушает ли сервер порт 22
nc -zv <server_ip> 22

# Смотрю нагрузку на сервер (если есть доступ через другие каналы)
ssh alternate@server 'top -bn1 | head -5'

2. Подключение с параметрами для устойчивости:

# Увеличиваю интервалы keepalive и добавляю сжатие трафика
ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o Compression=yes user@host

3. Постоянные настройки в ~/.ssh/config:

Host *
    ServerAliveInterval 30
    ServerAliveCountMax 3
    TCPKeepAlive yes
    Compression yes
    # Для проблемных сетей можно уменьшить MTU
    # IPQoS throughput

4. Глубокая диагностика при повторных проблемах:

  • Проверяю MTU пути (ping -M do -s 1472 <server> для проверки фрагментации)
  • Анализирую логи на стороне сервера: sudo tail -f /var/log/auth.log | grep sshd
  • Проверяю правила фаервола (iptables -L -n, ufw status)
  • Тестирую с отключенным ControlMaster, если он используется

5. Альтернативные решения:

  • Использование mosh (Mobile Shell) для нестабильных соединений
  • Настройка VPN-туннеля поверх SSH для агрегации пакетов
  • Применение autossh для автоматического переподключения