#Как распознать проблему и где применимы действия
Соединение по SSH не проходит из отдельной сети. Нужно отличить блокировку локального брандмауэра сервера, маршрутизатора, облачной группы безопасности и ошибку адреса. Перед выполнением определите название программы, редакцию Linux и управляющий сервис. Значения примеров в командах не являются готовой конфигурацией вашего устройства.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет слушающего sshd | На сервере ss не показывает порт SSH | Диагностировать службу и реальный Port |
| Фильтр на сервере | Пакеты приходят к серверу, но политика nftables/firewalld запрещает вход | Проверить правила безопасно, не отключая весь фильтр |
| Блокировка по пути | Из локальной сети доступ есть, извне нет | Проверить NAT, внешний IP, группы безопасности и сеть провайдера |
#Пошаговая диагностика и исправление
- Шаг 1. Зафиксируйте ошибку со стороны клиентаОткройте терминал на устройстве с проблемой. Refused значит отказ TCP, timeout — отсутствие своевременного ответа. Замените user и адрес; перед тестом убедитесь, что это ваш сервер.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
ssh -v -o ConnectTimeout=7 -p 22 пользователь@server.example.org
- Шаг 2. Проверьте порт на самом сервереЧерез рабочий сеанс или консоль хостинга выполните ss. Если порт 22 не указан, проверьте реальный Port у sshd; брандмауэр здесь ещё не главная гипотеза. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo ss -ltnp | grep -E '(:22[[:space:]]|sshd)'
- Шаг 3. Проверьте активность демонаНазвание службы различается: ssh.service в Debian-подобных или sshd.service в RHEL-подобных. Если обе команды показывают Unit not found, установите фактическое имя службы через list-unit-files.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
systemctl status ssh.service sshd.service --no-pager
- Шаг 4. Узнайте правила nftables без измененийНа сервере прочитайте правила и найдите цепочки input, dport 22, drop/reject. Вывод может содержать адреса внутренних сетей: не публикуйте его без очистки. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo nft list ruleset | grep -En 'hook input|dport 22|drop|reject'
- Шаг 5. Проверьте маршрут к клиентуКоманда на сервере использует реальный публичный IP клиента (не демонстрационную строку); она показывает используемые интерфейс и исходящий адрес. Если маршрут некорректен, исправляйте сеть, а не разрешайте всё подряд.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
ip route get 198.51.100.25
- Шаг 6. Сопоставьте с внешним периметромЕсли слушатель есть, локальный фильтр допускает соединение, а из другой сети по-прежнему timeout, проверьте в кабинете хостинга разрешение входящего TCP 22 и NAT-перенаправление маршрутизатора. Изменения проверяйте с запасным сеансом. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo journalctl -b -u ssh.service -u sshd.service -n 70 --no-pager
#Как проверить, что проблема действительно устранена
После адресного разрешающего правила повторите соединение из исходной клиентской сети. Не отключайте ufw, firewalld или nftables целиком; при отсутствии доступа используйте консоль управления сервером.
#Если результат не получен
Вернитесь к самому раннему отличающемуся результату диагностики и проверьте точный текст ошибки, текущую загрузку и фактическую версию программы. Не повторяйте опасную команду с другими правами наугад. Если это рабочий сервер, передайте администратору обезличенные отрывки журнала за момент сбоя и уже выполненные действия.