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 407HTTP-прокси не принял логин или парольЛогин скопирован целиком, без пробелов и переносов строки; пароль; кодирование спецсимволов, если логин записан в URL
(97) User was rejected by the SOCKS5 serverSOCKS5-прокси не принял логин или парольТо же, что при 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.

Читайте также

Все статьи

Опубликовано 5 минут чтения

HTTP или SOCKS5: какой протокол прокси выбрать

Чем HTTP-прокси отличается от SOCKS5: как они передают запросы, кто разрешает DNS, почему через шлюз не проходят UDP и QUIC и какой порт выбрать в Proxeta.

Читать статью

Опубликовано 6 минут чтения

Прокси в Python: requests, httpx и Playwright

Прокси с логином и паролем в Python: requests, httpx и Playwright, SOCKS5 через socks5h, смена IP и почему Chromium не принимает SOCKS5 с паролем.

Читать статью