Что означает ошибка Connection timed out
Ошибка Connection timed out (часто отображается как системный код ETIMEDOUT или ошибка 110) появляется, когда ваша система отправляет пакет инициализации соединения, но не получает отклика от удалённого сервера в течение установленного периода. В отличие от Connection refused, где сервер явно отклоняет запрос, здесь ответ просто не доходит до клиента. Вы можете встретить это сообщение при использовании curl, wget, ssh, в логах веб-серверов или при работе с пакетными менеджерами apt и dnf.
Пример полного текста в терминале:
curl: (28) Connection timed out after 30001 milliseconds
Причины возникновения
Проблема редко связана с повреждением системных файлов. В большинстве случаев дело в сетевой логике или конфигурации:
- Блокировка исходящего трафика фаерволом. Встроенные
ufw,firewalldили корпоративные шлюзы могут отбрасывать пакеты без отправки ICMP-ответов. - Некорректные настройки DNS. Система не может резолвить доменное имя, либо использует недоступный кэширующий сервер.
- Проблемы маршрутизации на уровне провайдера. Пакеты застревают на промежуточном узле, который не пересылает их дальше или не возвращает TTL-ошибку.
- Неверно указанный порт или IP. Сервер работает, но не на том порту, который вы запрашиваете, а NAT или фаервол молча отклоняет трафик.
- Слишком строгие параметры ядра Linux. Значения
net.ipv4.tcp_retries2илиtcp_syn_retriesзанижены для нестабильных или перегруженных сетей.
Способы решения
Способ 1: Проверка маршрута и доступности хоста
Начните с диагностики, чтобы локализовать разрыв связи. Откройте терминал и выполните последовательную проверку:
- Проверьте базовый отклик:
ping -c 4 example.com. Если вывод показывает100% packet loss, проблема на уровне маршрутизации или IP-адреса. - Отследите путь следования пакетов. Установите утилиту
mtr(или используйтеtraceroute):
Если обрыв происходит на хопе вашего провайдера, обратитесь в поддержку. Если пакеты доходят до целевого сервера, но не возвращаются — переходите к проверке портов и фаервола.sudo mtr --report example.com
Способ 2: Диагностика локального фаервола
Часто системный брандмауэр молча отбрасывает исходящие соединения. Временно отключите его для теста:
- Для Ubuntu/Debian:
sudo ufw disable - Для RHEL/Fedora:
sudo systemctl stop firewalld
Попробуйте выполнить команду, вызывавшую ошибку. Если соединение установилось, добавьте разрешающее правило вместо полного отключения:
sudo ufw allow out 443/tcp
sudo ufw reload
💡 Совет: После теста обязательно включите фаервол обратно командой
sudo ufw enableилиsudo systemctl start firewalld, чтобы не оставлять систему уязвимой.
Способ 3: Сброс DNS и замена резолвера
Если проблема возникает только при обращении по доменному имени, а по прямому IP работает, виноват DNS. Отредактируйте конфигурацию:
- Откройте файл
/etc/resolv.confв текстовом редакторе:
Замените текущие строкиsudo nano /etc/resolv.confnameserverна публичные:nameserver 1.1.1.1 nameserver 8.8.8.8 - Если в системе активен
systemd-resolved, перезапустите службу для корректного применения изменений:sudo systemctl restart systemd-resolved
Проверьте работу через curl -I https://example.com.
Способ 4: Коррекция таймаутов на уровне ОС
В нестабильных сетях или при высокой нагрузке стандартное ожидание ответа SYN-пакетов может быть недостаточным. Увеличьте лимиты через sysctl:
# Просмотр текущего значения повторных попыток
sysctl net.ipv4.tcp_retries2
# Установка более длительного ожидания (по умолчанию обычно 15)
sudo sysctl -w net.ipv4.tcp_retries2=20
sudo sysctl -w net.ipv4.tcp_syn_retries=6
Для сохранения параметров после перезагрузки добавьте эти строки в файл /etc/sysctl.conf и выполните sudo sysctl -p.
Профилактика
Чтобы ошибка не возвращалась, настройте мониторинг сетевых интерфейсов с помощью netstat -tuln или ss -tuln для отслеживания состояний ESTABLISHED и TIME_WAIT. Регулярно обновляйте пакеты безопасности ядра и nftables/iptables, так как в них часто исправляют утечки дескрипторов соединений. Если вы работаете с внешними API, всегда задавайте явные таймауты в клиентских библиотеках (например, timeout=10 в Python requests), чтобы не зависеть от глобальных параметров системы и получать понятные исключения вместо зависаний.