Ответ
При зависании 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для автоматического переподключения