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.