Коды ошибок curl при работе через прокси

curl завершается с числовым кодом и коротким текстом. Через прокси чаще всего встречаются шесть кодов, и по номеру видно, на каком шаге остановился запрос.

Обновлено · Редакция Prokso

Коротко
  • Коды 5, 7 и 28 означают, что запрос не дошёл до прокси: имя хоста, соединение или тайм-аут
  • Коды 56 и 97 чаще всего означают, что протокол не совпадает с портом или логин не принят
  • Повторите команду с ключом -v и сверьте хост gw.prokso.com, порт и схему адреса

Что означает ошибка

Число в скобках в строке curl: (N) — код завершения, тот же, что и код ошибки libcurl. Документация libcurl описывает их так: (5) CURLE_COULDNT_RESOLVE_PROXY — не удалось определить адрес прокси по имени хоста; (7) CURLE_COULDNT_CONNECT — не удалось соединиться с хостом или прокси; (28) CURLE_OPERATION_TIMEDOUT — истёк заданный тайм-аут.

(35) CURLE_SSL_CONNECT_ERROR — сбой где-то во время рукопожатия SSL/TLS; (56) CURLE_RECV_ERROR — сбой при получении данных из сети; (97) CURLE_PROXY — ошибка рукопожатия с прокси. Для кода 97 libcurl отдельно сообщает, что именно пошло не так.

Коды 5, 7 и 28 обычно означают, что до прокси запрос не дошёл. Коды 56 и 97 — что соединение есть, но программа и прокси не договорились. Код 35 чаще всего касается шифрования между вами и сайтом, а не самого прокси.

Причины

  • (5) — имя шлюза не превращается в адрес. Ошибка в имени хоста, лишний символ в строке или не работает DNS в вашей сети. Правильный хост — gw.prokso.com.
  • (7) — соединение отклонено. Шлюз или сеть на вашей стороне отказали в соединении: например, корпоративный файрвол закрывает выход на нестандартные порты.
  • (28) — ответ не пришёл вовремя. На портах вне 823, 824 и 10000–20000 шлюз не отвечает вовсе, поэтому curl ждёт до тайм-аута. Так же заканчивается слишком короткий лимит в ключах -m или --connect-timeout.
  • (35) — сбой TLS с сайтом. Рукопожатие TLS с самим сайтом не удалось. Чаще всего антивирус или корпоративная сеть перехватывает шифрованные соединения и подставляет свой сертификат.
  • (56) и (97) — протокол не совпадает с портом или логин не принят. Кодом 56 curl завершается, когда HTTP-запрос идёт на порт 824 (SOCKS5), когда адрес прокси начинается с https:// вместо http:// и когда шлюз ответил 407. Неправильный логин на SOCKS5 даёт код 97 с текстом User was rejected by the SOCKS5 server.

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

  1. Повторите команду с ключом -v и найдите последнюю нормальную строку. Пошаговый разбор вывода — на странице «Прокси не работает: проверка».
  2. Для (5) проверьте хост: nslookup gw.prokso.com должен вернуть адреса. Если не возвращает, дело в DNS вашей сети или в опечатке.
  3. Для (7) и (28) сверьте порт: 823 — HTTP, 824 — SOCKS5, 10000–20000 — фиксированный IP. Если порт правильный, попробуйте другую сеть, например мобильный интернет. О долгих запросах — на странице тайм-аут прокси.
  4. Для (35) временно отключите проверку HTTPS в антивирусе или попробуйте из сети без перехвата трафика. Подробнее — ошибки SSL-сертификата.
  5. Для (56) и (97) согласуйте схему с портом: http:// (не https://) для HTTP, socks5h:// для 824 или фиксированных портов в режиме SOCKS5. Логин и пароль скопируйте из личного кабинета заново; синтаксис параметров — в справочнике шлюза.

Как проверить, что всё заработало

Выполните curl -x http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:10000 https://prokso.com/ip. Если пришёл JSON с IP и страной, прокси работает, а код завершения равен 0. Код последней команды показывает echo $? в Linux и macOS или $LASTEXITCODE в PowerShell. Примеры для разных задач — в инструкции curl.

Диагностика за 2 минуты

Сначала вставьте строку в проверку прокси. Если там прокси работает, причина в программе или её настройках. Если нет — проверьте строку из терминала:

curl -v -x "http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823" https://api.ipify.org
  • Строка < HTTP/1.1 407 сразу после CONNECT — отвечает прокси. Название после кода, например NO_USER, подсказывает причину.
  • Прокси ответил на CONNECT кодом 200, а дальше пришёл другой код — прокси работает, этот ответ дал сайт.
  • Никакого ответа, только тайм-аут — соединение не дошло до прокси: проверьте хост, порт и сеть.

Инструкции, где встречается эта ошибка

Вопросы и ответы

Чем код (5) отличается от (6)?

Код 6 (CURLE_COULDNT_RESOLVE_HOST) означает, что не удалось определить адрес самого сайта, а 5 — адрес прокси. С прокси код 6 бывает, когда curl сам ищет адрес сайта, например со схемой socks5:// вместо socks5h://, или когда прокси вообще не применился.

Что, если шлюз ответил 407?

Сам curl тогда завершается кодом (56), а причину видно только с ключом -v, например 407 NO_USER или 407 TRAFFIC_EXHAUSTED. Причины разобраны на странице <a href="/ru/errors/407-proxy-authentication-required">407 Proxy Authentication Required</a>.

Как узнать более точную причину?

Ключ -v показывает каждый этап, а текст после номера в строке curl: (N) уточняет сбой. Для кода 97 libcurl отдельно передаёт подробности о рукопожатии с прокси.

Как проверить прокси без терминала?

Вставьте строку в <a href="/ru/tools/proxy-checker">проверку прокси</a>: она покажет, работает ли прокси, протокол, внешний IP и страну.

Резидентские $1.59, мобильные $2.50, серверные $0.65 за 1 ГБ

Регистрация за минуту, доступы сразу после оплаты.

Создать аккаунт