Вопрос или проблема
Я использую ssh для доступа к удалённым серверам в течение многих месяцев, но недавно я не могу установить надёжное соединение. Иногда я не могу войти в систему и получаю сообщение “Connection reset by порт 22”, когда могу войти, появляется сообщение об ошибке “client_loop: send disconnect: Broken pipe” через несколько минут (даже если терминал не простаивает).
Мой файл ~/.ssh/config содержит:
Host *
ServerAliveInterval 300
ServerAliveCountMax 2
TCPKeepAlive yes
Мой файл /etc/ssh/sshd_config содержит:
#ClientAliveInterval 300
#ClientAliveCountMax 3
Недавно я обновил свой тарифный план xfinity на более высокую скорость, и проблема началась с тех пор. Но xfinity утверждает, что проблема на моей стороне. Заметьте, что у моего соседа по комнате также есть такая же проблема с ssh…
Мне чего-то не хватает с моей стороны? Любая помощь будет очень полезна!
(Я использую Mac)
Я решил ту же проблему, изменив файл ~/.ssh/config на:
Host *
ServerAliveInterval 20
TCPKeepAlive no
Мотивация:
TCPKeepAlive no
означает “не отправлять keepalive-сообщения на сервер.” Когда установлено противоположное, TCPKeepAlive yes, клиент отправляет keepalive-сообщения на сервер и требует ответа, чтобы поддерживать своё соединение. Это обнаружит, если сервер выйдет из строя, перезагрузится и т.д. Проблема в том, что если соединение между клиентом и сервером прерывается на короткое время (из-за нестабильного сетевого соединения), это приведет к сбою keepalive-сообщений, и клиент разорвет соединение с “broken pipe”.
Установка TCPKeepAlive no
говорит клиенту просто предполагать, что соединение все еще в порядке, пока не будет доказано обратное по запросу пользователя, то есть временные сбои соединения, пока ваша сессия ssh простаивает в фоновом режиме, не прервут соединение.
Ответ Дэвида хорош, но более комплексное решение объясняется ниже.
Эту проблему можно решить как на стороне клиента, так и на стороне сервера.
Как узнать, где это сделать?
-
Настройте это на своем устройстве, если вы подключаетесь по SSH к нескольким серверам.
-
Если вы системный администратор и несколько пользователей жалуются на частые разрывы SSH-соединений, вы можете настроить это на сервере.
Клиентская сторона
При подключении к серверу используйте опцию -o
:
ssh -o ServerAliveInterval=600 [email protected]
Значение 600
представляет 600 секунд, то есть 10 минут.
Альтернативно, добавьте это в ваш файл конфигурации ssh:
- Создайте файл конфигурации ssh (если он не существует):
touch ~/.ssh/config
- Установите разрешения:
chmod 600 ~/.ssh/config
- Установите параметр в файле конфигурации. Например:
echo "ServerAliveInterval 600" >> ~/.ssh/config
… или используйте редактор.
Серверная сторона
- Откройте файл конфигурации sshd, расположенный по пути
/etc/ssh/sshd_config
. - Установите параметры
ClientAliveInterval
иClientAliveCountMax
на желаемые значения.
Например, ClientAliveInterval=200
и ClientAliveCountMax=3
означает, что сервер отправит alive-сообщение через 200 секунд. Если клиент не ответит, он повторно отправит alive-сообщение через 400 секунд. Если клиент все еще не ответит, он отправит еще одно alive-сообщение через 600 секунд. Если ответа все равно не будет, SSH-соединение будет разорвано.
Источник: Исправление ошибки Broken Pipe с SSH-соединением в Linux Handbook.
У меня была эта проблема, когда я пытался подключиться по SSH к ноутбуку с Windows с моего Mac. Я пробовал вышеупомянутые решения касательно ServerAliveInterval
и TCPKeepAlive
, но безуспешно.
Я не совсем уверен, почему это сработало, но я решил проблему, удалив свой открытый ключ SSH из файла ~/.ssh/authorized_keys
на удалённом ноутбуке. Это было особенно странно, потому что, согласно моему логу ssh -v
, мой открытый ключ, казалось, работал для аутентификации нормально:
debug1: Authentication succeeded (publickey).
Authenticated to 192.168.1.21 ([192.168.1.21]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: filesystem full
client_loop: send disconnect: Broken pipe
В любом случае, удаление ключа помогло мне обойти ошибку client_loop: send disconnect: Broken pipe
, и теперь я могу войти в систему.
У меня была точно такая же ошибка только для одного конкретного пользователя, так скажем: X. После того как я попробовал всё, что было описано здесь, я понял, что добавил пользователю X группу пользователя Y. Но пользователю Y не разрешено входить через ssh. После удаления X из группы Y я смог снова войти в систему.
Надеюсь, это тоже кому-то поможет.
Вы можете решить эту проблему, если используете подсистему, тогда вам нужно убедиться, что владельцем этих данных должен быть root, а также права должны быть ограничены
У меня также была эта проблема
Client_loop: send disconnect: broken pipe
Потому что я дал все права всем другим пользователям, это и создавало проблему
И посмотрев в /var/log/auth.log
, я обнаружил ошибку, что я дал полные права всем пользователям, и это было причиной проблемы.
После изменения прав я успешно подключился. Я был удивлен, что это из-за излишних прав
sudo chown root:root /rooted/Environment
sudo chmod 755 /rooted/Environment
Я столкнулся с этой проблемой, когда пытался подключиться к Windows SSH серверу из Linux-скрипта (для автоматизации).
Оказалось, что OpenSSH на Windows очень плохо определяет, какую оболочку запускать. Эта команда завершилась с ошибкой:
echo "dir" | ssh -T user@windows-host
Но явная спецификация cmd.exe
как оболочки сработала:
echo "dir" | ssh -T user@windows-host cmd.exe
В основном оставляю это здесь как подсказку для самого себя в будущем.
Еще одна возможная причина неясного сообщения об ошибке: Неправильное владение каталогом при использовании ChrootDirectory
.
Если SSH требует /home/USERNAME в качестве chroot, он должен быть в собственности root
и должен иметь строгие права. Если пользователь, вошедший в систему, владеет chroot-директорией, подключения по SSH и SFTP будут завершаться ошибкой.
Вы можете проверить эти настройки в /etc/ssh/sshd_config
или файле в /etc/ssh/sshd_config.d/*.conf
.
Match User USERNAME
ForceCommand internal-sftp
PasswordAuthentication yes
PubkeyAuthentication yes
ChrootDirectory /home/USERNAME
В моем случае, пользователь был настроен для доступа только к SFTP, а chroot оставлял его в пределах нужной области. Разрешения на их домашний каталог были случайно сброшены. Когда я вернул владельца обратно на root
, всё стало нормально.
.
Ответ или решение
Ошибка при попытке подключения через SSH, такая как "client_loop: send disconnect: Broken pipe" или "Connection reset by
Теория
SSH (Secure Shell) — это общий протокол для удаленного управления серверами. Он позволяет безопасно переправлять команды на удаленный хост, используя шифрование для защиты данных. Сообщения об ошибках "broken pipe" и "connection reset" обычно связаны с проблемами сетевого подключения или конфигурации клиента и сервера SSH.
Возможные причины:
- Проблемы с сетью: Внезапное разъединение может произойти из-за изменений в сети, например, перегрузка маршрутизатора или нестабильность интернет-соединения.
- Конфигурация клиента и сервера: Неправильные параметры в конфигурационных файлах могут привести к неожиданному разрыву соединения.
- Параметры KeepAlive: Недостаточная частота отправки keepalive-пакетов может привести к разъединению, если соединение временно неактивно.
- SSH-сервер на стороне клиента или сервера: Некорректные разрешения или проблемные настройки могут вызвать сбои.
- Аутентификация и права доступа: Ошибки могут возникнуть из-за неправильных настроек аутентификации или разрешений на сервере или клиенте.
Примеры
Рассмотрим, как могут проявляться эти проблемы:
-
Конфигурация клиента:
- Конфигурация в файле
~/.ssh/config
с параметрамиServerAliveInterval
иTCPKeepAlive
влияет на стабильность соединения. - Изменение параметра
TCPKeepAlive
наno
позволяет клиенту не разрывать соединение, если сервер временно недоступен.
- Конфигурация в файле
-
Конфигурация сервера:
- В файле
/etc/ssh/sshd_config
параметрыClientAliveInterval
иClientAliveCountMax
управляют отправкой keepalive-сообщений сервером. Если эти параметры не заданы или заданы неправильно, соединение может прерваться.
- В файле
-
Изменения в сети:
- Увеличение скорости интернета или замена оборудования (например, маршрутизатора), может приводить к изменению сетевых характеристик, что иногда требует перенастройки SSH-параметров.
Применение
Для решения указанных проблем можно предпринять следующие шаги:
На стороне клиента:
-
Изменение конфигурационных параметров:
- Измените
ServerAliveInterval
в~/.ssh/config
на более короткий интервал, например, 20 секунд. Это заставит клиента чаще отправлять keepalive-сообщения и проверять доступность сервера. - Убедитесь, что
TCPKeepAlive
установлен вno
, чтобы временные сетевые сбои не приводили к разрыву соединения.
- Измените
-
Утилита командной строки:
- Используйте флаг
-o ServerAliveInterval
при запуске ssh-команды для временного изменения этого параметра без изменения конфигурационного файла.ssh -o ServerAliveInterval=60 [email protected]
- Используйте флаг
На стороне сервера:
-
Конфигурация sshd:
- Откройте и измените
/etc/ssh/sshd_config
, задавClientAliveInterval
иClientAliveCountMax
для улучшения стабильности соединения. Например:ClientAliveInterval 200 ClientAliveCountMax 3
- Проверьте и исправьте права доступа к пользовательским директориям, особенно если используется
ChrootDirectory
.
- Откройте и измените
-
Аутентификация:
- Проверьте файл
~/.ssh/authorized_keys
. Убедитесь, что все ключи и разрешения указаны корректно.
- Проверьте файл
-
Сетевая среда:
- Убедитесь, что ваша сеть стабильна и не перегружена. Контроль за качеством интернет-соединения может помочь выявить проблемы на уровне оборудования.
Дополнительные действия:
-
Логирование ошибок:
- Анализируйте логи SSH как на клиенте (с помощью
ssh -v
) так и на сервере (/var/log/auth.log
в Unix-системах) для получения более детальной информации об ошибках.
- Анализируйте логи SSH как на клиенте (с помощью
-
Обратная проверка:
- Проверьте другие возможные причины, например, конфликты с группами пользователей, как в приведенном примере, или ошибки в настройке прав доступа, которые могут также вызывать разрывы соединения.
Используя вышеперечисленные методы, вы сможете диагностировать и устранить проблемы с SSH, обеспечив более стабильное и надежное соединение. Эти подходы важны для администраторов IT-систем и пользователей, которые зависят от удаленного доступа к серверам.