Перейти к основному содержимому

Руководства / Починка: руководства по ошибкам, которые встречаются на практике

ERR_CONNECTION_REFUSED: что означает и как исправить

ERR_CONNECTION_REFUSED означает, что целевая машина активно отклонила TCP-соединение пакетом сброса, обычно потому что на этом порту никто не слушает. Сеть отработала нормально и доставила ответ, просто не тот, которого ждал ваш браузер.

Что означает ERR_CONNECTION_REFUSED

TCP-соединение начинается с рукопожатия: клиент отправляет пакет SYN, и сервер отвечает SYN-ACK, если к этому порту привязан какой-либо процесс. Когда никто не слушает, сетевой стек операционной системы вместо этого отправляет обратно пакет RST, сразу закрывая попытку. Именно этот RST порождает ERR_CONNECTION_REFUSED в Chrome и его эквиваленты в других браузерах. Соединение дошло до целевой машины и получило четкое "нет", что отличает эту ошибку от таймаута, где вообще никто не отвечает.

Ответ RST приходит от TCP-стека ядра, а не от какого-либо кода приложения, поэтому он прибывает за несколько миллисекунд вместо нескольких секунд ожидания. Это также означает, что сама машина работает и отвечает на сетевой трафик; просто к конкретному порту, на который был нацелен запрос, ничего не привязано. Это различие важно при выборе, куда смотреть в первую очередь: отказанное соединение указывает на порт и процесс за ним, а не на питание сервера или его сетевое подключение.

Как проявляется ошибка

Chrome показывает простую страницу "This site can't be reached ... ERR_CONNECTION_REFUSED" без дальнейших подробностей. Firefox сообщает "Unable to connect" и называет хост и порт, к которому пытался обратиться. Командная строка дает более точную картину:

curl -v https://example.com:8443/
* Trying 203.0.113.10:8443...
* connect to 203.0.113.10 port 8443 failed: Connection refused
* Failed to connect to example.com port 8443 after 2 ms: Connection refused

Сообщение называет точный порт, к которому обращался curl, и сообщает об отказе за пару миллисекунд - достаточно быстро, чтобы исключить таймаут. telnet host port или nc -zv host port возвращают ту же строку "Connection refused".

Что вызывает ERR_CONNECTION_REFUSED

  • На этом порту никто не слушает. Веб-сервер, приложение или прокси, которые должны быть привязаны к порту, не запущены.
  • Сервис остановился или упал. Процесс, который завершился, был убит за чрезмерное потребление памяти, либо был остановлен на обслуживание, оставляет порт непривязанным.
  • Правило файрвола прямо отклоняет соединение. Правило REJECT отправляет обратно тот же RST, что и закрытый порт, так что снаружи это выглядит идентично отсутствию чего-либо там.
  • В URL указан неверный порт. Опечатка, старая закладка со времен до смены порта, либо сервис, переехавший на другой порт, - все это дает такую ошибку против старого порта.
  • Локальный сервер разработки не запущен. Отказ на localhost:3000 почти всегда означает, что dev-сервер был остановлен или никогда не запускался в этой сессии терминала.
  • Прокси или VPN настроены неверно. Прокси, указывающий на упавший бэкенд, либо VPN-клиент, переписывающий запросы на порт, который никто не обслуживает, отказывает в соединении от собственного имени.
  • Проброс портов контейнера не совпадает с приложением внутри него. Сервис Docker или Kubernetes, у которого опубликованный порт отличается от порта, на который на самом деле привязано приложение, дает эту ошибку, даже если сам процесс запущен и здоров.

Как понять, кто виноват

Если сайт сейчас загружается для других людей, или загружался для вас минуту назад, проблема, скорее всего, локальна: VPN, настройка прокси или правило файрвола на вашей собственной машине или в сети. Если он падает так же с телефона на мобильном интернете, серверная сторона отказывает в соединении для всех. Запуск HTTP-проверки или проверки порта из нескольких мест одновременно решает этот вопрос за один запрос; если контрольные точки в нескольких странах все сообщают об отказе в соединении, причина - в сервере или его файрволе, а не в вашей сети.

Как исправить ERR_CONNECTION_REFUSED

Если вы посетитель

  1. Проверьте URL и порт. Ищите опечатку, старую закладку либо ссылку, все еще указывающую на выведенный из обращения порт.
  2. Отключите VPN или прокси и перезагрузите страницу. Если после этого сайт загружается, причина в настройке VPN или прокси; проверьте ее настройки или обратитесь к тому, кто ей управляет.
  3. Попробуйте другую сеть, например мобильный интернет вместо Wi-Fi, чтобы исключить локальный файрвол или правило маршрутизатора.
  4. Подождите и повторите попытку. Если владелец сайта в процессе деплоя или перезапуска сервиса, порт может быть непривязан всего несколько секунд.

Если вы администрируете сайт

  1. Убедитесь, что процесс запущен и привязан к ожидаемому порту:
    ss -ltnp | grep :443
    netstat -tlnp | grep :443
    Пустой результат означает, что никто не слушает; запустите сервис или исправьте настроенный для него порт.
  2. Проверьте статус и логи сервиса:
    systemctl status nginx
    journalctl -u nginx -n 50
    Упавший или неудавшийся юнит появится здесь, часто с причиной, по которой он завершился.
  3. Проверьте файрвол на предмет правила REJECT для этого порта:
    iptables -L -n | grep REJECT
    ufw status verbose
    Правило REJECT снаружи выглядит идентично закрытому порту, поэтому этот шаг легко пропустить.
  4. Убедитесь, что сервис слушает на правильном интерфейсе. Сервер, привязанный к 127.0.0.1 вместо 0.0.0.0, отказывает в любом соединении, пришедшем извне машины, даже работая нормально из локальной оболочки.
  5. Перезапустите сервис после исправления конфигурации и убедитесь той же командой ss, что порт снова привязан, прежде чем считать проблему решенной.

Как предотвратить ERR_CONNECTION_REFUSED

Упавший сервис или случайное правило файрвола обычно проявляются сначала как отказы в соединении, а не как оповещение от самого сервера, поскольку не работающий процесс не может сообщить о собственном сбое. Регулярный мониторинг портов ловит это в течение минут, подключаясь снаружи сети так же, как это сделал бы посетитель, и отправляет оповещение по email, SMS, голосовым звонком, через Slack, Telegram и другие каналы в момент провала проверки.

Похожие ошибки

  • ERR_CONNECTION_TIMED_OUT случается, когда на попытку соединения вообще никто не отвечает, а не активно отказывает в ней.
  • ERR_CONNECTION_RESET случается, когда соединение было принято, а затем оборвано на полпути.
  • This site can't be reached охватывает весь набор ошибок соединения, которые Chrome группирует под одним заголовком.

Часто задаваемые вопросы

Означает ли ERR_CONNECTION_REFUSED то же самое, что меня блокирует файрвол?

Может быть и так. Правило файрвола REJECT дает тот же ответ RST, что и закрытый порт, так что со стороны браузера они выглядят одинаково. Правило DROP ведет себя иначе и вместо этого дает таймаут.

Почему это происходит только на localhost?

Почти всегда потому, что локальный dev-сервер не запущен в этом терминале, был остановлен, либо упал при запуске из-за ошибки в коде или конфигурации. Проверьте терминал, где вы его обычно запускаете, на предмет сообщения об ошибке.

Может ли VPN вызвать ERR_CONNECTION_REFUSED?

Да. VPN, направляющий трафик через прокси или шлюз, может отказать в соединении от имени шлюза, если его собственный бэкенд недоступен, даже если реальный сервер назначения здоров.

Означает ли ERR_CONNECTION_REFUSED, что сайт лежит для всех?

Не обязательно. Прежде чем делать такой вывод, проверьте из другой сети или запустите проверку из нескольких мест. Одно неправильно настроенное правило файрвола или локальный VPN могут давать ту же ошибку, пока сайт нормально работает для всех остальных.

В чем разница между отказом и сбросом?

Отказ означает, что попытка соединения так и не завершилась; цель отклонила ее немедленно. Сброс означает, что соединение было установлено и работало, а затем оборвано на полпути, обычно чем-то дальше по пути следования.

Как узнать, какой процесс должен слушать?

Проверьте собственные логи запуска приложения и его конфигурацию на предмет того, к какому порту оно должно привязываться. Если процесс запущен, но привязан к порту, отличному от того, что используется в URL, обновите либо URL, либо конфигурацию, чтобы они совпадали, а затем подтвердите командой ss -ltnp, что порт теперь привязан как ожидается.

Проверить сейчас

Запустите бесплатную проверку своего сайта - аккаунт не нужен.

Port check

Следить за этим постоянно

Получайте оповещение в момент сбоя: HostTracker проверяет более чем из 300 локаций и уведомляет по email, SMS, в Slack, Telegram и не только.

Возможности HostTracker

Ещё в этом разделе: Починка: руководства по ошибкам, которые встречаются на практике