Перейти до основного вмісту

Посібники / Виправити: посібники для помилок, з якими стикаються насправді

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

Служба, що впала, чи випадкове правило брандмауера зазвичай спершу проявляються як відмова у з'єднанні, а не сповіщення від самого сервера, оскільки процес, що не запущений, не може повідомити про власний збій. Регулярний моніторинг порту ловить це протягом хвилин, з'єднуючись ззовні мережі так само, як це зробив би відвідувач, і надсилає сповіщення електронною поштою, 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 локацій і повідомляє вас електронною поштою, SMS, у Slack, Telegram та інших каналах.

Можливості HostTracker

Ще в цьому розділі: Виправити: посібники для помилок, з якими стикаються насправді