Что означает ошибка "SSH Connection refused"
Ошибка ssh: connect to host <IP> port 22: Connection refused — это сообщение от клиента SSH, которое означает, что сервер активно отклонил попытку TCP-соединения на порту 22 (или другом указанном порту). В отличие от Connection timed out (где пакеты просто теряются), refused — это прямой ответ от ядра операционной системы сервера: "служба на этом порту не доступна".
Симптомы:
- Команда
ssh user@server_ipзавершается с ошибкойConnection refusedпрактически мгновенно. - Утилита
telnet server_ip 22также показываетConnection refused. - Пинг (
ping) до сервера, как правило, проходит успешно, так как проблема на транспортном (TCP) уровне, а не сетевом (ICMP).
Причины возникновения
Ошибка возникает на стороне сервера. Основные причины:
- Служба SSH (
sshd) не запущена. Это самая частая причина. Демон просто не слушает никакие порты. - SSH-демон слушает только локальный интерфейс (
127.0.0.1). В конфигурации может быть указанListenAddress 127.0.0.1, что разрешает подключения только с самого сервера. - Фаервол (брандмауэр) блокирует порт. Правило фаервола может быть настроено на
REJECT(активный отказ) для порта 22 с вашего IP или для всех. - Другой процесс уже использует порт 22. Реже, но возможно, что другой сервис (например, старый
sshdили другой демон) занял порт 22, и новыйsshdне может его занять. - Конфигурационные ограничения в
sshd_config. ДирективыAllowUsers,DenyUsers,AllowGroups,DenyGroupsилиMatch-блоки могут запрещать подключение для вашего пользователя или IP-адреса, что может приводить к отказу после установки соединения, но иногда и на этапе handshake. - Проблемы с SELinux/AppArmor. Системы mandatory access control могут запрещать
sshdслушать сетевой порт или принимать соединения. - Сервер за NAT/ балансировщиком, а проброс портов не настроен. Клиент пытается подключиться к публичному IP, но пакеты не доходят до внутреннего сервера, а маршрутизатор сам отвечает
RST(reset) илиICMP port unreachable.
Способ 1: Проверка и запуск службы SSH
Первым делом убедитесь, что служба работает.
- Проверьте статус службы:
sudo systemctl status sshd- Если статус
active (running)— служба работает, переходите к следующему способу. - Если статус
inactive (dead)илиfailed— служба не запущена.
- Если статус
- Запустите службу:
sudo systemctl start sshd - Включите автозагрузку (чтобы служба запускалась после перезагрузки):
sudo systemctl enable sshd - Попробуйте подключиться снова. Если ошибка осталась, проверьте, на каком порту служит служба (Способ 2).
Способ 2: Проверка, на каком порту и интерфейсе служит SSH
Узнайте, какие порты и сетевые интерфейсы слушает sshd.
- Используйте
ssилиnetstat:sudo ss -tlnp | grep sshd # или sudo netstat -tlnp | grep sshd
Пример вывода для корректной настройки:tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=4))0.0.0.0:22— слушает на всех IPv4-интерфейсах.[::]:22— слушает на всех IPv6-интерфейсах.127.0.0.1:22— слушает только локальный интерфейс (loopback). В этом случае внешние подключения невозможны.
- Если слушает только
127.0.0.1, исправьте конфигурацию:- Откройте файл конфигурации SSH-сервера:
sudo nano /etc/ssh/sshd_config- Найдите строку
#ListenAddress 0.0.0.0(илиListenAddress ::). Раскомментируйте её (удалите#) или добавьте, если её нет. Убедитесь, что нет строкListenAddress 127.0.0.1. - Сохраните файл и перезапустите службу:
sudo systemctl restart sshd- Проверьте вывод
ssснова — теперь должны быть0.0.0.0:22и/или[::]:22.
Способ 3: Проверка и настройка фаервола
Фаервол может блокировать входящие соединения на порт 22.
Для ufw (Ubuntu/Debian по умолчанию)
sudo ufw status verbose
- Если статус
Status: active, проверьте, есть ли правило для22/tcp(илиssh). Если нет, добавьте:sudo ufw allow ssh # или явно по порту sudo ufw allow 22/tcp - Если правило есть, но с ограничением по IP (
22/tcp ALLOW IN 192.168.1.100), убедитесь, что ваш IP входит в список. - Перезагрузите фаервол:
sudo ufw reload.
Для firewalld (RHEL/CentOS/Rocky/Fedora)
sudo firewall-cmd --list-all
- В разделе
services:илиports:должно бытьsshили22/tcp. - Если нет, добавьте правило на постоянной основе:
sudo firewall-cmd --permanent --add-service=ssh # или sudo firewall-cmd --permanent --add-port=22/tcp - Примените изменения:
sudo firewall-cmd --reload.
Для iptables/nftables (базовый стек)
Просмотрите цепочку INPUT:
sudo iptables -L INPUT -n -v | grep 22
- Ищите правило с
REJECTилиDROPдля порта 22. Если такое правило есть выше правилаACCEPT, оно блокирует трафик. - Чтобы добавить правило разрешения в начало цепочки:
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT - Сохраните правила (иначе они сбросятся после перезагрузки):
- Для
iptables:sudo iptables-save | sudo tee /etc/iptables/rules.v4 - Для
nftables: убедитесь, что конфиг в/etc/nftables.confкорректен и выполнитеsudo nft -f /etc/nftables.conf.
- Для
Способ 4: Проверка конфигурации SSH-сервера (sshd_config)
Неправильные настройки в /etc/ssh/sshd_config могут блокировать доступ.
- Откройте файл конфигурации:
sudo nano /etc/ssh/sshd_config - Проверьте ключевые директивы:
Port 22— убедитесь, что порт указан корректно (если используете нестандартный, проверьте фаервол и подключение по-p).ListenAddress— если эта директива присутствует, она должна быть0.0.0.0(для IPv4) или::(для IPv6), а не127.0.0.1.PermitRootLogin— если вы пытаетесь подключиться под root, убедитесь, что значениеyesилиprohibit-password(если используете ключ).PasswordAuthentication— если используете пароль, проверьте, чтоyes.AllowUsers/AllowGroups— если эти директивы есть, убедитесь, что ваш пользователь (или группа) перечислен в них.DenyUsers/DenyGroups— убедитесь, что ваш пользователь не указан здесь.
- После внесения изменений перезапустите службу:
sudo systemctl restart sshd- Важно: Не закрывайте текущую активную SSH-сессию (если она есть) до проверки новой конфигурации! Используйте
sudo sshd -tдля проверки синтаксиса файла перед перезапуском.
- Важно: Не закрывайте текущую активную SSH-сессию (если она есть) до проверки новой конфигурации! Используйте
Способ 5: Проверка сетевых правил, SELinux/AppArmor и балансировщиков
Проверка SELinux (RHEL/CentOS/Rocky)
SELinux может запрещать sshd слушать порт.
sudo ausearch -m avc -ts recent | grep sshd
Если есть записи об отказе, попробуйте восстановить контекст по умолчанию для порта 22:
sudo semanage port -a -t ssh_port_t -p tcp 22
(Установите policycoreutils-python-utils, если semanage нет).
Проверка AppArmor (Ubuntu/Debian)
sudo aa-status | grep sshd
Если профиль sshd находится в режиме enforce, попробуйте перевести его в complain (для диагностики) или убедитесь, что профиль корректен:
sudo aa-complain /etc/apparmor.d/usr.sbin.sshd
sudo systemctl restart sshd
Проверка балансировщика/роутера
Если сервер находится за NAT (например, в облаке или дата-центре):
- Убедитесь, что на роутере/в облачной панели (AWS Security Group, GCP Firewall, Yandex Cloud Security Group и т.д.) открыт порт 22 (или ваш кастомный порт) для вашего IP-адреса или диапазона.
- Проверьте, что правило имеет приоритет выше правил "отклонить всё".
- Если используете балансировщик нагрузки (ELB, HAProxy), убедитесь, что он настроен на проброс TCP-трафика на порт 22 к вашему бэкенду.
Профилактика
- Всегда включайте автозагрузку критичных служб:
sudo systemctl enable sshd. - Настраивайте фаервол сразу после развёртывания сервера и добавляйте правило для SSH до того, как включите его в продакшен.
- Используйте нестандартный порт для SSH (например, 2222). Это не панацея от атак, но уменьшает количество автоматических сканирований. Не забудьте обновить фаервол и клиентскую команду (
ssh -p 2222 user@host). - Регулярно проверяйте конфигурацию на наличие устаревших или конфликтующих директив (
sshd_config, правила iptables/nftables). - Мониторьте логи SSH:
sudo journalctl -u sshd -fв реальном времени илиsudo cat /var/log/auth.log(Ubuntu/Debian) /sudo cat /var/log/secure(RHEL) для отслеживания попыток подключения и ошибок.
Дополнительная диагностика
Если ни один из способов не помог, соберите информацию для дальнейшего анализа:
- Логи
sshd:sudo journalctl -u sshd --since "5 min ago" | tail -50
Ищите строки сConnection closedилиrefused. - Сетевой трафик (если есть доступ к серверу через консоль/KVM):
sudo tcpdump -i any port 22 -nn
Попробуйте подключиться с клиента. Если вы видите пакетыSYNот клиента, но нет пакетовSYN-ACKот сервера — проблема на стороне сервера (служба/фаервол). Если пакетыSYNне приходят — проблема на сети или балансировщике. - Проверка на наличие конфликтующего процесса:
sudo lsof -i :22
Убедитесь, что процесс — этоsshd. - Проверка целостности пакетов:
sudo apt update && sudo apt install --reinstall openssh-server # Debian/Ubuntu sudo yum reinstall openssh-server # RHEL/CentOS
Внимание: После каждого значимого изменения конфигурации (фаервол, sshd_config) перезапускайте соответствующую службу (sudo systemctl restart sshd или sudo systemctl restart firewalld/ufw) и тестируйте подключение с клиента. Не закрывайте работающую консольную сессию до подтверждения работоспособности SSH.