ERR_CONNECTION_CLOSED значит, что соединение с сервером закрыли раньше, чем браузер получил ответ. Chrome пишет: «Не удаётся получить доступ к сайту. Сайт неожиданно разорвал соединение». Мы собрали стенд, на котором закрывали соединение в разные моменты, и выяснили две вещи. Этот код появляется, только когда соединение закрыто до конца TLS-рукопожатия. А прокси и VPN превращают в него другую ошибку — сброс соединения.
Ответ своего сайта снаружи можно посмотреть проверкой доступности: наш сервер запрашивает страницу и показывает код ответа, время отклика и дату окончания сертификата.
Что означает ошибка: перевод и код
Дословно — «соединение закрыто». В исходниках Chromium у ошибки номер −100 и пояснение:
A connection was closed (corresponding to a TCP FIN).
То есть закрыто штатным сигналом FIN. Соседний код −101, ERR_CONNECTION_RESET, означает сброс сигналом RST. Для сравнения: −324, ERR_EMPTY_RESPONSE, — «сервер закрыл соединение, ничего не отправив».
Полный текст на русском в Chromium 149:
Не удаётся получить доступ к сайту. Сайт 127.0.0.1 неожиданно разорвал соединение. Попробуйте сделать следующее: проверьте подключение к интернету, проверьте настройки прокси-сервера и брандмауэра.
В части статей из выдачи написано, что CLOSED — это сброс TCP RST. По исходнику и по нашему стенду это не так.
Стенд: когда браузер показывает CLOSED
Мы подняли на одном компьютере серверы, которые закрывают соединение в разные моменты, и открыли каждый в Chromium 149 три раза.
| Что делает сервер | Что показал браузер |
|---|---|
| http, закрыл после запроса | ERR_EMPTY_RESPONSE |
| https, закрыл сразу после подключения | CLOSED |
| https, закрыл после приветствия браузера (ClientHello) | CLOSED |
| https, оборвал свой ответ на середине рукопожатия | CLOSED |
| https, рукопожатие прошло, закрыл после запроса | ERR_EMPTY_RESPONSE |
| то же, но с уведомлением TLS о закрытии | ERR_EMPTY_RESPONSE |
| https, закрывает только для одного имени в SNI | CLOSED для этого имени, другое открылось |
Все ошибки приходили за 0,01–0,06 секунды, обрыв посреди рукопожатия — за 0,42. Браузер не ждёт таймаута: закрытие он видит сразу.
Последняя строка таблицы — важная. Сервер или фильтр видит имя сайта в приветствии браузера ещё до шифрования. Поэтому можно закрывать соединения выборочно: к одному имени пускать, к другому нет. Именно так выглядит ошибка, когда фильтр режет конкретный адрес, а остальные на том же сервере работают.
Прокси превращает RESET в CLOSED
Самая полезная находка. Мы взяли сервер, который на приветствие браузера отвечает сбросом RST. Напрямую Chromium показывает ERR_CONNECTION_RESET. Потом поставили между ними простой ретранслятор, как это делает любой прокси: при обрыве с той стороны он закрывает соединение с браузером штатно. Код сменился на ERR_CONNECTION_CLOSED — три раза из трёх.
На живом сайте то же самое. effecto-mebel.ru, который в нашем замере сбросов стабильно сбрасывал соединение:
| Откуда открывали | Результат | Время |
|---|---|---|
| Напрямую из Германии | ERR_CONNECTION_RESET, 3 из 3 | 0,22–0,38 с |
| Через прокси на российском сервере | ERR_CONNECTION_CLOSED, 3 из 3 | 0,62–1,09 с |
Ещё у двух сайтов из нашего списка из Германии https зависал на 30 секунд, а через российский прокси Chromium в двух попытках из трёх показал CLOSED, в одной — тоже таймаут.
Вывод: если вы сидите через VPN или прокси, код ошибки не говорит, что на самом деле сделал сервер. Чтобы узнать, отключите VPN и откройте страницу снова.
Причины ошибки
Между вами и сервером:
- VPN или прокси, у которого оборвалось соединение с сервером;
- антивирус или файрвол, который проверяет HTTPS и рвёт соединение;
- фильтр провайдера или корпоративной сети, который закрывает соединения к отдельным адресам по имени в SNI;
- роутер с зависшей таблицей соединений.
На сервере:
- TLS настроен с ошибкой, и сервер закрывает соединение после приветствия браузера;
- сервер не находит настроек для имени сайта и обрывает рукопожатие;
- защита от ботов или файрвол режет часть адресов или стран;
- перегрузка: сервер принимает соединение и тут же закрывает.
Блокировки в России мы не измерили. Через наш российский сервер в дата-центре заблокированные соцсети и трекеры открылись: в этой сети фильтра нет. Как ошибка выглядит в домашней сети провайдера, мы не проверяли.
Как исправить ошибку пользователю
Сначала определите, где проблема, потом исправляйте.
- Сравните две сети. Откройте страницу с телефона через мобильный интернет. Ошибка повторилась — дело в сервере, дальше ждать или писать владельцу. Пропала — причина в вашей сети или устройстве.
- Отключите VPN и прокси. Это первое подозрение: как показал стенд, через прокси любой обрыв выглядит как CLOSED. В Windows проверьте «Параметры» → «Сеть и Интернет» → «Прокси».
- Приостановите проверку HTTPS в антивирусе на минуту. Программы безопасности могут использовать собственный прокси, и тогда любой обрыв выглядит как закрытие. Помогло — добавьте адрес в исключения и включите защиту обратно.
- Откройте страницу в режиме инкогнито или другом браузере. Если там работает, отключите расширения по одному, а подозрительные удалите. Данные браузера при этом не трогайте: кэш хранит страницы, а не соединения.
- Перезагрузите роутер. Выключите его на 30 секунд.
- Смените DNS на публичный, например 77.88.8.8 или 8.8.8.8, если провайдер подменяет ответы.
- Сбросьте сетевые настройки — только если ошибка на всех сайтах и ничего выше не помогло. В Windows: «Параметры» → «Сеть и Интернет» → «Дополнительные сетевые параметры» → «Сброс сети».
На Android и iPhone: переключитесь между Wi-Fi и мобильной сетью, отключите VPN и режим экономии трафика в браузере, обновите браузер. Если страница не открывается только в одном приложении, проверьте системные настройки VPN и частного DNS: после установки некоторых приложений там остаётся их профиль.
Встроенные инструменты Chrome
Если способы выше не помогли, у браузера есть служебные страницы. Введите адрес в адресную строку и нажмите Enter.
- chrome://net-internals/#sockets — кнопка «Flush socket pools» закрывает все открытые соединения браузера. Помогает, когда ошибка возникает после смены сети или выхода из сна, а перезапускать браузер не хочется.
- chrome://net-internals/#dns — «Clear host cache» сбрасывает кэш адресов.
- chrome://net-export — запись сетевого журнала. Включите запись, повторите ошибку и сохраните файл: в нём видно, на каком шаге закрыто соединение. Его можно отправить администратору сети или владельцу ресурса.
QUIC. Некоторые инструкции советуют временно отключить протокол QUIC на странице chrome://flags. ERR_CONNECTION_CLOSED — ошибка TCP, и QUIC к ней отношения не имеет. Сбои самого QUIC браузер показывает другим кодом — мы разобрали его на стенде в статье ERR_QUIC_PROTOCOL_ERROR.
Если сайт открылся, но падают отдельные запросы, а в консоли стоит net::ERR_HTTP2_PROTOCOL_ERROR, сервер рвёт уже не соединение, а поток HTTP/2. Эту ошибку мы тоже проверили на стенде: ERR_HTTP2_PROTOCOL_ERROR.
Проверка из командной строки
Откройте командную строку и выполните curl -v https://адрес/. Сообщение
SSL_ERROR_SYSCALL сразу после строки Client hello значит, что
соединение закрыли до ответа — так curl показывал наши живые примеры.
Connection reset by peer — это сброс, а не закрытие. Если ответ curl
получен без ошибок, а браузер — нет, причина связана с браузером: его
расширениями, данными или функциями защиты.
Смежные ошибки соединения
| Код | Что произошло |
|---|---|
| ERR_CONNECTION_CLOSED | закрыто сигналом FIN до ответа |
| ERR_CONNECTION_RESET | сброшено сигналом RST |
| ERR_CONNECTION_ABORTED | прервано на устройстве посетителя |
| ERR_EMPTY_RESPONSE | закрыто после запроса, ответа нет |
| ERR_CONNECTION_REFUSED | порт закрыт, подключение отклонено |
| ERR_CONNECTION_TIMED_OUT | сервер не ответил на подключение |
| ERR_SSL_PROTOCOL_ERROR | сервер ответил, но не по правилам TLS |
Как исправить на своём сайте
Если ошибку видят все посетители, рукопожатие ломается на сервере.
-
Проверьте рукопожатие снаружи:
openssl s_client -connect ваш-сайт.ru:443 -servername ваш-сайт.ruСтрока
SSL_ERROR_SYSCALLили обрыв сразу послеClient helloзначит, что сервер закрыл соединение, не ответив. -
Проверьте сертификат для этого имени. Если для домена на сервере нет своего блока настроек и сертификата, рукопожатие может оборваться. Как выпустить сертификат — в статье про SSL-сертификат сайта.
-
Посмотрите журнал ошибок веб-сервера в момент запроса. Многие сбои рукопожатия nginx пишет только на уровне info, поэтому на время поиска поднимите подробность
error_log. -
Проверьте файрвол и защиту от ботов. Если ошибка только из отдельных стран или сетей, их режет правило, а не сервер.
-
Проверьте нагрузку. Если ошибки появляются в часы пик, серверу не хватает воркеров или лимит соединений слишком мал.
-
Проверьте из другой страны. Мы видели сайты, которые из Германии зависают на 30 секунд, а через российский прокси обрываются за секунду: поведение зависит от адреса посетителя.
Когда сайт снова открывается, посмотрите, что ещё мешает ему в поиске. Движок разбирает одну страницу: метатеги, заголовки, canonical, robots.txt, карту сайта. Без регистрации.
Границы замера
- Chromium 149 на Linux, стенд на одном компьютере, по три прогона.
- Живые сайты проверяли из Германии напрямую и через прокси на российском сервере в дата-центре, а не из домашней сети.
- QUIC и HTTP/3 мы не проверяли.
Коротко
- ERR_CONNECTION_CLOSED — соединение закрыто сигналом FIN раньше, чем пришёл ответ.
- На стенде этот код появлялся, только когда соединение закрыто до конца TLS-рукопожатия; после него та же ситуация даёт EMPTY_RESPONSE.
- Прокси и VPN превращают сброс RESET в CLOSED: так было и на стенде, и на живом сайте.
- Пользователю — сравнить сети, отключить VPN, прокси и проверку HTTPS в антивирусе.
- Владельцу — проверить рукопожатие через openssl, сертификат и правила файрвола.
