Руководство
Прокси в cURL: примеры команд для HTTP, HTTPS и SOCKS5
В cURL прокси задаётся параметром -x, а учётные данные передаются в URL или через -U. HTTPS-запрос через HTTP-прокси, разница между socks5 и socks5h, переменные окружения и .curlrc, проверка выходного IP и замер времени, команды для Windows и частые ошибки прокси в cURL.
Коротко
- В cURL прокси передаётся параметром -x (--proxy): curl -x "http://USER:[email protected]:8989" https://api.ipify.org; учётные данные можно записать в URL или передать отдельно через -U "USER:PASSWORD".
- Даже если целевой сайт работает по HTTPS, адрес HTTP-прокси пишется с http://; cURL отправляет прокси CONNECT, и TLS устанавливается внутри туннеля. Схема https:// означает TLS и с самим прокси-сервером.
- В SOCKS5 схема socks5:// разрешает доменное имя локально, а socks5h:// — на стороне прокси; чтобы DNS-запросы не выходили из локальной сети, используют socks5h:// или --socks5-hostname.
- Для HTTP cURL читает только переменную http_proxy в нижнем регистре; поддерживаются также HTTPS_PROXY, ALL_PROXY и NO_PROXY. -x в командной строке перекрывает переменную окружения.
- В Windows PowerShell 5.1 curl — псевдоним Invoke-WebRequest; в командах с прокси пишут curl.exe, а в cmd.exe адрес берут в двойные кавычки.
Чтобы использовать прокси в cURL, добавьте к запросу параметр -x (полное имя --proxy) и адрес прокси: curl -x "http://USER:[email protected]:8989" https://api.ipify.org. Адрес HTTP-прокси записывается со схемой http://, SOCKS5-прокси — со схемой socks5h://; то, что целевой сайт работает по HTTPS, адрес прокси не меняет.
Команда одинаково работает в Linux, macOS и Windows. Если в ответ пришёл выходной IP прокси, значит, соединение, аутентификация и туннель настроены правильно. В примерах используется адрес шлюза WeProxy gw.weproxy.com.tr:8989; USER и PASSWORD — ваши данные из личного кабинета.
Как настроить прокси в cURL? Параметры -x и -U
Параметр -x принимает адрес прокси в виде [схема://][пользователь:пароль@]host[:port]. Учётные данные можно записать прямо в адрес или передать отдельно через -U (--proxy-user):
curl -x "http://USER:[email protected]:8989" https://api.ipify.org
curl -x "http://gw.weproxy.com.tr:8989" -U "USER:PASSWORD" https://api.ipify.org
Обе команды отправляют один и тот же запрос. Разница видна, когда в пароле есть спецсимволы. Если пароль внутри URL содержит @, :, # или %, его нужно записать процентным кодированием (@ → %40). -U делит значение по первому символу :, поэтому, пока в имени пользователя нет :, пароль можно писать как есть, без кодирования. Правила кодирования и другие форматы строк описаны в руководстве по форматам прокси.
Согласно документации cURL, если в значении -x нет схемы, адрес считается HTTP-прокси, а без порта подставляется 1080. Шлюз WeProxy слушает другой порт, поэтому указывайте порт явно в каждой команде. Если доступ к прокси открыт по IP whitelist, учётные данные не нужны, хватит curl -x "http://gw.weproxy.com.tr:8989" https://api.ipify.org. Какой способ поддерживает каждый продукт WeProxy, перечислено в руководстве по аутентификации прокси.
Пароль, набранный в командной строке, может попасть в историю оболочки и в список процессов системы. На общих серверах читайте пароль из переменной окружения:
export PROXY_PASS='PASSWORD'
curl -x "http://gw.weproxy.com.tr:8989" -U "USER:$PROXY_PASS" https://api.ipify.org
Как отправить HTTPS-запрос через HTTP-прокси в cURL?
Когда вы идёте на HTTPS-сайт через HTTP-прокси, адрес прокси всё равно пишется с http://. Сначала cURL отправляет прокси запрос CONNECT api.ipify.org:443. Если прокси отвечает 200, TLS-соединение устанавливается внутри этого туннеля напрямую с целевым сайтом. Сертификат цели и содержимое страницы прокси не видит, ему известны только хост и порт, к которым вы подключаетесь.
Если цель начинается с http://, cURL туннель не открывает. Он передаёт прокси запрос с полным URL, и прокси сам идёт к цели. Чтобы обычный HTTP-запрос тоже шёл через туннель, добавьте -p (--proxytunnel):
curl -p -x "http://USER:[email protected]:8989" http://example.com
Посмотреть, что именно отправляется, можно с -v. Строки с > — исходящие данные, строки с < — входящие. Сокращённый пример (детали зависят от версии cURL):
> CONNECT api.ipify.org:443 HTTP/1.1
> Proxy-Authorization: Basic ...
< HTTP/1.1 200 Connection established
* CONNECT tunnel established, response 200
> GET / HTTP/2
< HTTP/2 200
Первая строка с < — ответ прокси, следующие — ответ целевого сайта. Если на CONNECT пришёл 407, проблема в учётных данных. А когда туннель установлен с 200, но цель возвращает 403 или 429, прокси работает и отказывает сам сайт.
Адрес прокси с https:// означает, что cURL будет говорить по TLS и с самим прокси-сервером (HTTPS-прокси). Если прокси этого не поддерживает, рукопожатие сорвётся и вы получите curl: (35). Отдельный заголовок для прокси передаётся через --proxy-header: заголовок из -H уходит целевому сайту.
Как использовать SOCKS5-прокси в cURL? Разница между socks5 и socks5h
Для SOCKS5 меняется только схема. cURL знает две схемы:
curl -x "socks5://USER:[email protected]:8989" https://api.ipify.org
curl -x "socks5h://USER:[email protected]:8989" https://api.ipify.org
socks5:// разрешает доменное имя цели на вашем компьютере и отправляет прокси IP-адрес. socks5h:// передаёт доменное имя прокси как есть, и DNS-запрос выполняется на стороне прокси. Во втором случае ваши DNS-запросы не выходят из локальной сети, а цель разрешается так, как её видят в стране прокси. Если вы получаете контент по геолокации или хотите закрыть утечку DNS, используйте socks5h://. Как проверить утечку, рассказано в руководстве по утечкам DNS.
В старых командах встречаются отдельные параметры с тем же действием: --socks5 соответствует socks5:// с локальным разрешением, --socks5-hostname — socks5h://. С этими параметрами учётные данные передаются через -U:
curl --socks5-hostname "gw.weproxy.com.tr:8989" -U "USER:PASSWORD" https://api.ipify.org
Большинство продуктов WeProxy поддерживают HTTP и SOCKS5 одновременно. Мобильные прокси работают только по HTTP; если записать их со схемой socks5://, соединение не установится. Какой протокол подходит под какую задачу, сравнивается в статье HTTP vs SOCKS5.
Сравнение параметров прокси в cURL
| Параметр | Что делает | Пример |
|---|---|---|
-x, --proxy | Задаёт адрес и протокол прокси | -x "http://gw.weproxy.com.tr:8989" |
-U, --proxy-user | Имя пользователя и пароль прокси | -U "USER:PASSWORD" |
-p, --proxytunnel | Отправляет через туннель CONNECT и обычные HTTP-запросы | -p -x ... http://example.com |
--socks5-hostname | SOCKS5, DNS на стороне прокси (как socks5h://) | --socks5-hostname gw.weproxy.com.tr:8989 |
--socks5 | SOCKS5, DNS локально (как socks5://) | --socks5 gw.weproxy.com.tr:8989 |
--proxy-header | Заголовок, который получает только прокси | --proxy-header "X-Test: 1" |
--noproxy | Хосты, к которым запросы идут без прокси | --noproxy "localhost,127.0.0.1" |
--connect-timeout | Лимит времени на установку соединения (секунды) | --connect-timeout 10 |
-m, --max-time | Лимит времени на всю операцию (секунды) | -m 30 |
Если в одной команде указаны и -x, и --socks5, действует последний. Чтобы не путаться, выберите один способ; в скриптах удобнее всего читать -x с URL со схемой.
Постоянная настройка прокси через переменные окружения и .curlrc
Если не хотите писать -x в каждой команде, задайте переменные окружения, которые читает cURL:
export http_proxy="http://USER:[email protected]:8989"
export HTTPS_PROXY="http://USER:[email protected]:8989"
export NO_PROXY="localhost,127.0.0.1"
curl https://api.ipify.org
Для HTTP-запросов cURL читает только http_proxy в нижнем регистре; HTTP_PROXY в верхнем регистре игнорируется по соображениям безопасности. Для HTTPS подходит HTTPS_PROXY или https_proxy, для всех протоколов — ALL_PROXY. Запросы к хостам из списка NO_PROXY идут без прокси. -x в командной строке перекрывает переменную окружения, а --noproxy "*" полностью отключает прокси для этого запроса.
Ту же настройку можно записать в пользовательский файл конфигурации. В Linux и macOS это ~/.curlrc:
proxy = "http://gw.weproxy.com.tr:8989"
proxy-user = "USER:PASSWORD"
В Windows cURL ищет файл .curlrc или _curlrc в папке пользователя (%USERPROFILE% или %APPDATA%). Если передать -q первым аргументом команды, cURL этот файл не прочитает. Когда скрипт неожиданно выходит в сеть через прокси, первым делом проверьте переменные окружения и .curlrc.
Как проверить выходной IP прокси через cURL?
Самый быстрый тест — отправить через прокси запрос к сервису, который возвращает ваш IP-адрес обычным текстом:
curl -s -x "http://USER:[email protected]:8989" "https://api.ipify.org?format=json"
Если вернулся ваш собственный IP, запрос прошёл мимо прокси. Проверьте значение NO_PROXY, адрес в -x и убедитесь, что запускаете именно эту строку. Страну, город и сеть IP можно посмотреть, вставив адрес в инструмент IP lookup; выход вашего браузера через прокси показывает My IP.
Чтобы проверить, как меняются IP на ротационном шлюзе, запустите одну и ту же команду несколько раз подряд. Каждый вызов curl открывает новое соединение, поэтому в пуле с ротацией на каждый запрос вы увидите в каждой строке другой IP:
for i in 1 2 3 4 5; do
curl -s -x "http://USER:[email protected]:8989" https://api.ipify.org
echo
done
Если у вас есть список из личного кабинета в формате host:port:user:pass, короткий цикл на Bash проверит строки по одной и покажет, какие прокси работают:
while IFS=: read -r host port user pass; do
printf '%s:%s -> ' "$host" "$port"
curl -s -m 15 -x "http://$host:$port" -U "$user:$pass" https://api.ipify.org || printf 'ERROR'
echo
done < proxies.txt
read отдаёт последней переменной весь остаток строки, так что даже если в пароле есть :, он целиком попадёт в pass. Поскольку используется -U, процентное кодирование пароля тоже не нужно. -m 15 не даёт строке, которая не отвечает, заблокировать цикл.
Если нужно какое-то время сохранять один и тот же IP (вход в аккаунт, корзина, многошаговая форма), в резидентных и мобильных пулах WeProxy к имени пользователя добавляется идентификатор сессии. В резидентном пуле выходной IP можно закрепить на срок до 24 часов, в мобильном — до 60 минут. Точный формат имени пользователя зависит от продукта, поэтому скопируйте его из личного кабинета и проверьте циклом выше, что IP не меняется. Для каких задач нужен фиксированный IP, а для каких ротация, разобрано по сценариям в руководстве по sticky и rotating прокси.
Чтобы понять, на каком этапе соединение теряет время, выведите замеры времени через -w:
curl -s -o /dev/null -x "http://USER:[email protected]:8989" \
-w "connect=%{http_connect} http=%{http_code} tcp=%{time_connect}s tls=%{time_appconnect}s ttfb=%{time_starttransfer}s total=%{time_total}s\n" \
https://api.ipify.org
%{http_connect} показывает ответ прокси на CONNECT, %{http_code} — ответ целевого сайта. time_connect — момент, когда установлено TCP-соединение с прокси, time_appconnect — когда завершилось TLS-рукопожатие с целью. Если общее время большое, а time_connect маленькое, до прокси вы добираетесь быстро, а задержка возникает за туннелем или на целевом сайте. Отдельную строку можно проверить без кода в инструменте proxy checker.
Прокси в cURL на Windows
В Windows 10 и 11 curl.exe входит в систему. Но в Windows PowerShell 5.1 команда curl запускает не cURL, а Invoke-WebRequest с другими параметрами. В PowerShell всегда пишите curl.exe:
curl.exe -x "http://USER:[email protected]:8989" https://api.ipify.org
В командной строке (cmd.exe) одинарная кавычка не считается кавычкой, поэтому адрес берите в двойные кавычки. Символ переноса строки здесь не \, как в Bash: в cmd.exe это ^, в PowerShell — обратный апостроф. Переменная окружения тоже задаётся по-разному в зависимости от оболочки:
# PowerShell
$env:HTTPS_PROXY = "http://USER:[email protected]:8989"
curl.exe https://api.ipify.org
:: cmd.exe
set HTTPS_PROXY=http://USER:[email protected]:8989
curl https://api.ipify.org
Если в пароле есть %, ^ или &, cmd.exe интерпретирует эти символы сам. Такой пароль передавайте через -U в двойных кавычках или записывайте в URL процентным кодированием. Системные настройки прокси Windows cURL не читает; настройка для всей системы описана на странице интеграции с Windows.
Ошибки прокси в cURL и их решение
Когда cURL выдаёт ошибку, число в начале строки (код выхода) показывает, на каком этапе возникла проблема:
| Ошибка | Что означает | Решение |
|---|---|---|
curl: (5) Could not resolve proxy | Не удалось разрешить имя хоста прокси | Проверьте имя шлюза и локальный DNS |
curl: (7) Failed to connect | Порт прокси недоступен | Укажите порт явно, проверьте файрвол |
curl: (56) CONNECT tunnel failed, response 407 | Прокси не принял учётные данные | Проверьте имя пользователя, пароль и процентное кодирование |
curl: (35) ошибка TLS | Прокси записан с https:// или туннель не установился | Замените схему прокси на http:// |
curl: (97) | Сбой рукопожатия SOCKS | Проверьте поддержку SOCKS5 в продукте и учётные данные |
curl: (28) | Тайм-аут | Разделите лимиты --connect-timeout и -m, повторите запрос |
| Возвращается ваш IP | Запрос не дошёл до прокси | Проверьте NO_PROXY, .curlrc и значение -x |
При временных сетевых сбоях добавьте --retry 3 --retry-delay 2, и cURL повторит запрос автоматически. --retry срабатывает только на ошибках, которые считаются временными; повторять постоянную ошибку вроде 407 бесполезно. На каком уровне возникает каждый код и что проверять первым, подробно разобрано в руководстве по кодам ошибок прокси. Когда перейдёте к отправке тех же запросов из кода, примеры в статье Как использовать прокси в Python используют тот же формат адреса.
При массовых запросах через cURL соблюдайте условия использования целевого сайта и файл robots.txt; если вы собираете персональные данные, действуют требования GDPR и местного законодательства о персональных данных. Разрешённые варианты использования сервисов WeProxy перечислены на странице правил допустимого использования. Пакеты с новым IP на каждый запрос есть на странице rotating residential proxy, с фиксированным выходным адресом — на странице статических дата-центровых IPv4.
Частые вопросы
Как настроить прокси в cURL?
Добавьте к запросу адрес прокси через параметр -x: curl -x "http://USER:[email protected]:8989" https://api.ipify.org. Если учётные данные нужно передать отдельно, напишите -x "http://gw.weproxy.com.tr:8989" -U "USER:PASSWORD". Без схемы cURL считает адрес HTTP-прокси, а без порта подставляет 1080, поэтому всегда указывайте порт явно. Если в ответ пришёл выходной IP прокси, настройка верна.
Нужно ли писать адрес прокси с https:// для HTTPS-сайтов?
Нет, в большинстве случаев адрес пишется с http://. Схема описывает протокол прокси-сервера, а не целевого сайта. Для HTTPS-целей cURL отправляет прокси запрос CONNECT и устанавливает TLS-соединение с целью внутри этого туннеля. Схема https:// в адресе прокси означает, что cURL будет говорить по TLS и с самим прокси; если прокси этого не поддерживает, вы получите ошибку curl: (35).
Чем socks5 отличается от socks5h в cURL?
Оба варианта подключаются к одному и тому же SOCKS5-прокси, разница в разрешении DNS. socks5:// или --socks5 разрешает доменное имя цели на вашем компьютере и отправляет прокси IP-адрес. socks5h:// или --socks5-hostname передаёт доменное имя прокси, и разрешение выполняется на его стороне. Второй способ не выпускает DNS-запросы из локальной сети, а цель разрешается по местоположению прокси.
Почему cURL выдаёт ошибку 407?
Сообщение curl: (56) CONNECT tunnel failed, response 407 означает, что прокси не принял учётные данные. Заново скопируйте имя пользователя и пароль из личного кабинета. Если в пароле есть символы вроде @, : или %, запишите их в URL процентным кодированием или передайте учётные данные отдельно через -U "USER:PASSWORD". Если вы используете IP whitelist, проверьте, что IP, с которого уходит запрос, добавлен в личном кабинете.
Как использовать прокси, не указывая его в каждой команде cURL?
Задайте переменную окружения: в Linux и macOS export HTTPS_PROXY="http://USER:[email protected]:8989", в PowerShell $env:HTTPS_PROXY. Для HTTP-запросов нужна http_proxy в нижнем регистре. Для постоянной настройки добавьте строки proxy и proxy-user в файл ~/.curlrc. Чтобы исключить отдельные хосты, используйте NO_PROXY, а чтобы отключить прокси для одного запроса, используйте --noproxy "*".









