curl через прокси: HTTP, SOCKS5 и частые ошибки
Опубликовано 6 минут чтения
Коротко
В curl адрес прокси задаёт флаг --proxy, а логин и пароль — --proxy-user. Для резидентских и мобильных прокси Proxeta это http://хост:8080 или socks5h://хост:1080: с socks5h имя сайта разрешает прокси. Выходной IP проверяют запросом к сервису, который возвращает адрес, а ошибка подсказывает причину: ответ 407 — логин или пароль, код 7 — порт или сеть.
curl есть почти в любой системе, поэтому через него удобно проверить прокси, прежде чем подключать его к скрипту или программе. Ниже — команды для HTTP и SOCKS5 с логином и паролем, разница между socks5h:// и socks5://, проверка выходного IP и разбор ошибок, которые печатает curl. Команды написаны для bash и zsh (macOS и Linux). Данные в примерах условные: подставьте свои из личного кабинета.
Строка прокси и флаги curl
Личный кабинет Proxeta выдаёт резидентские и мобильные прокси строкой host:port:login:password. Порт 8080 — это HTTP, порт 1080 — SOCKS5, логин и пароль у них одинаковые. Локация и режим сессии записаны в логине, поэтому копируйте его целиком; из чего он состоит, разобрано в статье формат строки прокси.
curl принимает эти данные двумя флагами:
--proxy(короткая форма-x) — схема, хост и порт:http://host:8080илиsocks5h://host:1080;--proxy-user(короткая форма-U) — логин и пароль через двоеточие. curl делит значение по первому двоеточию, поэтому двоеточия,@и/в пароле здесь ничего не ломают.
Логин и пароль можно записать и прямо в адрес прокси: http://login:password@host:8080. Тогда спецсимволы пароля нужно закодировать для URL: @ как %40, : как %3A, / как %2F.
curl через HTTP-прокси
Логины в примерах сокращены: в строке из личного кабинета есть ещё параметр фильтра, например -filter-medium, поэтому копируйте её целиком.
curl -sS --max-time 30 -w '\n' \
--proxy http://proxy.example.invalid:8080 \
--proxy-user 'login-country-us:password' \
https://api64.ipify.org
Команда печатает IP, с которого запрос пришёл на сервис api64.ipify.org, то есть выходной адрес прокси. Флаг -sS убирает индикатор загрузки, но оставляет сообщения об ошибках, --max-time 30 ограничивает время запроса, а -w '\n' добавляет перевод строки после ответа.
Для сайта по https:// curl отправляет прокси запрос CONNECT с именем сайта и портом 443, а затем шифрует соединение с самим сайтом. Прокси видит, к какому хосту вы обращаетесь, но не адреса страниц и не их содержимое. Схема в --proxy при этом остаётся http://: https:// в адресе прокси означает TLS-соединение до самого прокси, а это другой тип прокси.
Тот же запрос с логином внутри адреса:
curl -sS --max-time 30 -w '\n' \
--proxy 'http://login-country-us:password@proxy.example.invalid:8080' \
https://api64.ipify.org
Как не оставлять пароль в истории оболочки
Пароль из таких команд попадает в историю оболочки. Чтобы этого избежать, вынесите параметры в файл конфигурации proxy.conf:
proxy = "http://proxy.example.invalid:8080"
proxy-user = "login-country-us:password"
и передайте его флагом -K:
chmod 600 proxy.conf
curl -sS --max-time 30 -w '\n' -K proxy.conf https://api64.ipify.org
chmod 600 оставляет доступ к файлу только вам. Не публикуйте ни этот файл, ни строки прокси: в них ваш пароль.
curl через SOCKS5: socks5h или socks5
curl -sS --max-time 30 -w '\n' \
--proxy socks5h://proxy.example.invalid:1080 \
--proxy-user 'login-country-us:password' \
https://api64.ipify.org
Буква h в схеме решает, кто превращает имя сайта в IP-адрес:
| Схема | Кто разрешает имя сайта | Что получает прокси |
|---|---|---|
socks5h:// | Прокси | Имя сайта, например api64.ipify.org |
socks5:// | Ваше устройство | Готовый IP-адрес |
С socks5h:// DNS-запрос выполняет прокси, поэтому адрес сайта подбирается для локации выхода. С socks5:// имя разрешает ваш DNS-сервер: крупные сайты и CDN могут вернуть ему адрес сервера рядом с вами, а не рядом с выходным IP, а ваш DNS-провайдер видит, какие сайты вы открываете. Если ваше устройство не может разрешить имя, curl с socks5:// остановится с ошибкой Could not resolve host ещё до соединения с сайтом.
Вместо схемы socks5h:// можно использовать флаг --socks5-hostname proxy.example.invalid:1080: он работает так же. У HTTP-прокси этого выбора нет — в запросе CONNECT уходит имя сайта, и разрешает его прокси. Подробнее о различиях протоколов — в статье HTTP или SOCKS5.
Как проверить выходной IP
Сервис api64.ipify.org отвечает адресом, с которого к нему пришёл запрос, и работает по IPv4 и IPv6. Это важно: без параметра ipv4-true в логине выходной адрес может оказаться IPv6. Сравните ответ с прокси и без него: если адреса совпадают, запрос ушёл мимо прокси.
Страну и город по IP сервисы геолокации определяют по своим базам, а данные разных баз расходятся. Поэтому город, который показывает один сервис, может не совпасть с тем, что видит другой сайт.
Цикл ниже трижды запрашивает IP со строкой ротации и трижды — со строкой липкой сессии:
for login in login-country-us login-country-us-sid-k7m2q9x4ab; do
echo "$login"
for i in 1 2 3; do
curl -sS --max-time 30 -w '\n' \
--proxy http://proxy.example.invalid:8080 \
--proxy-user "$login:password" \
https://api64.ipify.org
done
done
Каждый запуск curl открывает новое соединение. При ротации (логин без -sid-) каждое новое соединение получает IP из пула заново, поэтому адреса меняются. В липкой сессии все три ответа — один адрес, пока сессия жива; срок сессии не настраивается, подробнее — в статье sticky-сессия или ротация.
Внутри одного запуска curl переиспользует соединение. Если передать два адреса в одной команде, оба запроса пройдут через один туннель и выйдут с одного IP даже при ротации:
curl -sS --max-time 30 -w '\n' \
--proxy http://proxy.example.invalid:8080 \
--proxy-user 'login-country-us:password' \
https://api64.ipify.org https://api64.ipify.org
Частые ошибки и что они значат
Число в скобках — код завершения curl, его же возвращает команда, поэтому скрипт может проверять $?. Тексты ниже — из curl 8.7.1, в других версиях формулировки могут отличаться.
| Сообщение curl | Что это значит | Что проверить |
|---|---|---|
(5) Could not resolve proxy: ... | curl не нашёл адрес прокси | Хост прокси. Условный proxy.example.invalid из примеров не разрешается никогда, поэтому без замены команда завершится именно так |
(7) Failed to connect to ... port 8080 ...: Couldn't connect to server | Соединение с прокси не установилось (в старых версиях curl — Connection refused) | Порт: 8080 для HTTP, 1080 для SOCKS5. Не закрывает ли исходящие соединения на этот порт ваша сеть, файрвол или антивирус |
(56) CONNECT tunnel failed, response 407 | HTTP-прокси не принял логин или пароль | Логин скопирован целиком, без пробелов и переносов строки; пароль; кодирование спецсимволов, если логин записан в URL |
(97) User was rejected by the SOCKS5 server | SOCKS5-прокси не принял логин или пароль | То же, что при 407 |
(97) Could not resolve host: ... со схемой socks5:// | Ваше устройство не смогло разрешить имя сайта | Схема socks5h://, чтобы имя разрешал прокси |
(28) ... timed out after ... milliseconds | Ответ не пришёл за отведённое время | Сеть и доступность сайта. Если зависает только запрос через прокси, проверьте, совпадает ли схема с портом |
Обрыв или зависание сразу после подключения, например Proxy CONNECT aborted | Схема не совпадает с портом или указан https:// вместо http:// | http:// — только с портом 8080, socks5h:// — с портом 1080 |
Для сайта по http:// туннеля нет: прокси возвращает 407 как обычный ответ, curl завершается с кодом 0 и выводит тело этого ответа, если прокси его прислал. Чтобы увидеть код ответа, добавьте -w '%{http_code}\n' или -v.
Как посмотреть ответ прокси
Флаг -v показывает весь обмен: строки с > отправил curl, строки с < пришли в ответ. Сразу после > CONNECT идёт ответ прокси: код 200 — туннель открыт, 407 — логин или пароль не приняты.
curl -v -sS --max-time 30 -o /dev/null \
--proxy http://proxy.example.invalid:8080 \
--proxy-user 'login-country-us:password' \
https://api64.ipify.org
В выводе -v есть строка Proxy-Authorization: Basic .... Это логин и пароль в кодировке base64, а не в зашифрованном виде, и раскодировать их может любой. Не публикуйте такой вывод целиком.
Как запускались примеры
Команды запускались 5 ноября 2026 года в curl 8.7.1 на macOS через локальные тестовые HTTP- и SOCKS5-прокси с логином и паролем и локальный сайт, а не через шлюз Proxeta. Так проверяются синтаксис и поведение curl, но не выходные IP и работа настоящей сети. Те же приёмы для кода — в статье прокси в Python, а как шлюз выдаёт адреса — в статье что такое backconnect-прокси.
Частые вопросы
Как указать логин и пароль прокси в curl?
Флагом --proxy-user 'логин:пароль' или прямо в адресе прокси: --proxy 'http://логин:пароль@хост:8080'. Во втором случае закодируйте спецсимволы пароля для URL: @ как %40, : как %3A, / как %2F. С --proxy-user кодировать ничего не нужно.
Чем socks5h отличается от socks5 в curl?
С socks5h имя сайта разрешает прокси, а с socks5 — ваше устройство, и прокси получает уже готовый IP-адрес. Для прокси с выбранной локацией берите socks5h: адрес сайта подбирается для локации выхода, а ваш DNS-сервер не видит, какие сайты вы открываете.
Что значит ошибка 407 в curl?
407 Proxy Authentication Required — прокси не принял логин или пароль. curl сообщает об этом как «CONNECT tunnel failed, response 407». Скопируйте логин из личного кабинета целиком, без пробелов, проверьте пароль и кодирование спецсимволов, если логин записан в URL.
Как проверить, что curl работает через прокси?
Запросите сервис, который возвращает ваш IP, например https://api64.ipify.org, с прокси и без него. Если адреса совпадают, запрос ушёл мимо прокси: проверьте флаг --proxy и схему адреса.
Почему curl пишет Couldn't connect to server или Connection refused?
Соединение с прокси не установилось: порт указан неверно или закрыт в вашей сети, например файрволом. У резидентских и мобильных прокси Proxeta HTTP работает на порту 8080, SOCKS5 — на порту 1080.