curl с прокси: синтаксис -x, аутентификация, SOCKS5 и рецепты отладки

Один флаг направляет curl через любой прокси — затем аутентификация, туннели CONNECT, DNS SOCKS5 и переменные окружения решают, будет ли это работать. Все необходимые рецепты, готовые для вставки.

Использование curl с прокси — это один флаг: -x. Но между этим флагом и рабочей командой скрапинга находятся пять деталей, которые генерируют большую часть трафика на Stack Overflow по этой теме — синтаксис учетных данных, туннели CONNECT, поведение DNS SOCKS5, переменные окружения, которые тихо перехватывают запросы, и коды ошибок, которые выглядят одинаково, пока вы не прочтете подробный вывод. Это полная справка для копирования и вставки: каждый вариант синтаксиса, каждый метод аутентификации и рецепты, которые вы действительно будете использовать.

Флаг -x: синтаксис прокси curl

# route one request through an HTTP proxy
curl -x http://gate.quantumproxies.io:8000 https://ifconfig.me

# identical, long form
curl --proxy http://gate.quantumproxies.io:8000 https://ifconfig.me

Два значения по умолчанию, которые стоит знать, прямо из документации curl: если вы опустите схему, curl предполагает HTTP-прокси, а если вы опустите порт, он предполагает 1080 — чисто исторический выбор, который почти не соответствует реальным прокси, поэтому всегда указывайте порт явно. Префикс схемы выбирает протокол прокси: http:// для стандартного HTTP-прокси, https:// для шифрования перехода к самому прокси, socks5:// или socks5h:// для SOCKS.

curl proxy authentication: три способа отправки учетных данных

# 1) credentials inline in the proxy URL
curl -x http://USER:PASS@gate.quantumproxies.io:8000 https://ifconfig.me

# 2) separate flag -- keeps the URL readable
curl -x http://gate.quantumproxies.io:8000 -U USER:PASS https://ifconfig.me

# 3) special characters must be percent-encoded (p@ss! -> p%40ss%21)
curl -x "http://USER:p%40ss%21@gate.quantumproxies.io:8000" https://ifconfig.me

-U (заглавная) — это аутентификация прокси; строчная -u аутентифицируется на целевом сайте — путаница между ними является классической ошибкой. 407 Proxy Authentication Required всегда означает, что прокси отклонил ваши учетные данные, никогда не целевой сайт. Проверьте наличие опечаток, не закодированных символов или провайдера, ожидающего аутентификацию по IP-белому списку вместо user:pass. С резидентными прокси QuantumProxies работают оба режима — добавьте IP вашей машины в белый список и полностью откажитесь от учетных данных или встроите user:pass в URL. Полный список проверки 407 находится в нашем руководстве по устранению неполадок 407.

Диаграмма потока curl -x, устанавливающая туннель CONNECT через прокси к HTTPS-цели
Для HTTPS-целей curl запрашивает у прокси туннель CONNECT, затем выполняет TLS от конца до конца внутри него — прокси передает байты, которые он не может прочитать.

HTTPS-цели и туннель CONNECT

Когда целевой URL — https://, curl не просит прокси получить страницу. Он отправляет запрос CONNECT host:443, прокси открывает необработанный TCP-туннель, и curl выполняет TLS-рукопожатие непосредственно с целью через него. Именно поэтому HTTP-прокси может передавать HTTPS-трафик, не нарушая шифрование — он пересылает шифрованный текст, который не может прочитать или изменить. В выводе -v вы увидите строку CONNECT, за которой следует 200 Connection established; все остальное на этом этапе — это ваша точка отказа. Для не-HTTP-протоколов через HTTP-прокси -p (--proxytunnel) заставляет вести себя так же, как туннель.

SOCKS5: один символ меняет, где происходит DNS

# SOCKS5, hostname resolved on YOUR machine
curl -x socks5://USER:PASS@gate.quantumproxies.io:1080 https://ifconfig.me

# SOCKS5h, hostname resolved BY THE PROXY -- use this for scraping
curl -x socks5h://USER:PASS@gate.quantumproxies.io:1080 https://ifconfig.me

# dedicated flag, same as socks5h
curl --socks5-hostname gate.quantumproxies.io:1080 -U USER:PASS https://ifconfig.me

С простым socks5:// ваша машина выполняет локальный DNS-запрос — целевое имя хоста утечет к вашему локальному резолверу, и вы можете получить IP, который географически не соответствует вашему выходу. socks5h:// передает разрешение прокси, так что DNS-ответы поступают из сети выхода. Каждый план QuantumProxies включает SOCKS5 наряду с HTTP на одном и том же шлюзе. Если вы не уверены, какой протокол нужен данному инструменту, наше сравнение SOCKS5 и HTTP объясняет это.

Сравнение схем прокси curl socks5 и socks5h, показывающее локальное и прокси-стороннее разрешение DNS
socks5h:// разрешает DNS на выходе — нет утечки локального имени хоста, нет географического несоответствия. Используйте его по умолчанию для скрапинга.

Переменные окружения и .curlrc

# proxy every curl (and most CLI tools) in this shell
export http_proxy="http://USER:PASS@gate.quantumproxies.io:8000"
export https_proxy="http://USER:PASS@gate.quantumproxies.io:8000"
export NO_PROXY="localhost,127.0.0.1,.internal.example"

curl https://ifconfig.me                 # proxied automatically
curl --noproxy "*" https://ifconfig.me   # bypass for one call

# permanent default: add to ~/.curlrc
# proxy = "http://USER:PASS@gate.quantumproxies.io:8000"

Одна особенность, задокументированная на странице руководства curl, в конечном итоге сбивает с толку всех: переменные могут быть в верхнем или нижнем регистре, и нижний регистр выигрывает, за исключением http_proxy, который curl учитывает только в нижнем регистре — HTTP_PROXY намеренно игнорируется по соображениям безопасности. В Windows синтаксис -x идентичен в cmd и PowerShell; установите переменные с помощью set http_proxy=... или $env:http_proxy="...", а файл конфигурации — %APPDATA%\_curlrc. Помните, что эти переменные также влияют на другие инструменты — забытый экспорт в CI является классическим источником загадочного трафика.

Отладка с помощью -v: читайте рукопожатие, а не гадание на кофейной гуще

Добавьте -v, и curl расскажет всю беседу с прокси. Сопоставьте то, что вы видите, с причиной:

Проверьте прокси, прежде чем доверять ему

Две проверки по тридцать секунд сэкономят часы путаной отладки позже. Во-первых, подтвердите анонимность: обратитесь к https://httpbin.org/headers через прокси и проверьте, что на самом деле получает цель — чистый шлюз не добавляет заголовки Via или X-Forwarded-For, которые рекламировали бы проксирование, в то время как дешевые или бесплатные прокси часто добавляют оба. Во-вторых, измерьте накладные расходы с помощью переменных времени -w (рецепт ниже): резидентный переход обычно добавляет несколько сотен миллисекунд по сравнению с прямым запросом, что нормально; многосекундные времена подключения означают перегруженный выход, от которого стоит отказаться. Включите обе проверки в CI для любого конвейера, который зависит от прокси, и вы поймаете неправильно настроенную конечную точку, прежде чем она тихо сожжет запуск скрапинга — или ваш бюджет на пропускную способность, поскольку счета за использование выставляются за гигабайт, независимо от того, были ли ответы полезными или нет.

Быстрые рецепты

# confirm the exit IP
curl -x http://USER:PASS@gate.quantumproxies.io:8000 https://ifconfig.me

# geo-target: choose the exit country in the username
curl -x "http://USER-country-de:PASS@gate.quantumproxies.io:8000" https://ifconfig.me

# sticky session: keep the same exit IP across calls
curl -x "http://USER-session-a1b2c3:PASS@gate.quantumproxies.io:8000" https://example.com

# POST JSON through the proxy
curl -x http://USER:PASS@gate.quantumproxies.io:8000 \
  -H "Content-Type: application/json" -d '{"q":"test"}' https://httpbin.org/post

# fetch a page: follow redirects, browser UA, save to file
curl -x http://USER:PASS@gate.quantumproxies.io:8000 -L -A "Mozilla/5.0" \
  -o page.html https://example.com

# measure the proxy overhead
curl -x http://USER:PASS@gate.quantumproxies.io:8000 -s -o /dev/null \
  -w "connect: %{time_connect}s  total: %{time_total}s\n" https://example.com

Трюки с суффиксом имени пользователя работают, потому что шлюз анализирует таргетинг из учетных данных: выбор страны из более чем 200 местоположений, ротация по запросу по умолчанию, липкие сессии, когда потоку нужна одна идентичность. Когда ваши однострочники превращаются в скрипт, та же конечная точка легко интегрируется в Python — наше руководство по прокси для Python Requests продолжает ровно там, где заканчивается curl.

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

Как использовать SOCKS5-прокси с curl?

Передайте его в -x с схемой SOCKS: curl -x socks5h://user:pass@host:port https://target. Предпочитайте socks5h:// вместо socks5://, чтобы DNS разрешался на прокси, а не на вашей машине. Старые флаги --socks5 и --socks5-hostname все еще работают и делают то же самое.

Как сделать так, чтобы curl игнорировал прокси?

Для одного запроса добавьте --noproxy "*". Для оболочки отмените установку http_proxy и https_proxy. Чтобы навсегда исключить определенные хосты, перечислите их в NO_PROXY в виде доменов, разделенных запятыми. Если curl использует прокси, когда вы его не просили, почти наверняка виновата переменная окружения или строка в ~/.curlrc.

Почему curl возвращает 407 Proxy Authentication Required?

Прокси отклонил ваши учетные данные. Проверьте пользователя и пароль, убедитесь, что вы использовали -U (не -u, который нацелен на сайт), и закодируйте специальные символы, такие как @ или !. Если ваш провайдер аутентифицирует по IP-белому списку, авторизуйте IP вашей машины в панели управления и не отправляйте никаких учетных данных вообще.

Работает ли синтаксис прокси curl на Windows?

Да — -x, -U и схемы SOCKS идентичны, так как curl поставляется с Windows 10 и позже. Различие только в окружении: установите переменные с помощью set в cmd или $env: в PowerShell, и используйте %APPDATA%\_curlrc вместо ~/.curlrc для постоянных настроек.

Как установить постоянный прокси для curl?

Добавьте строку proxy = "http://user:pass@host:port" в ~/.curlrc (или _curlrc на Windows), и каждый вызов curl будет его использовать. В качестве альтернативы, экспортируйте http_proxy и https_proxy из профиля вашей оболочки, чтобы охватить и другие инструменты. Командная строка -x всегда переопределяет оба, так что одноразовые исключения остаются простыми.

Это вся поверхность: -x плюс схема, правильно закодированные учетные данные, socks5h, когда вы используете SOCKS, переменные окружения, которые вы устанавливаете намеренно, и -v, когда что-то ведет себя неправильно. Команды выше работают как есть с любым шлюзом — сочетайте их с чистыми резидентными выходами, и curl станет действительно мощным инструментом для скрапинга.

Протестируйте эти рецепты на резидентных прокси QuantumProxies