Гайды · 6 мин
Прокси в curl, wget и Node.js: команды и примеры
- Редакция TrueSocks
- 6 мин чтения
curl - первое, что стоит запустить, когда нужно проверить прокси: одна команда показывает, принимает ли сервер пароль, какой IP видит сайт и сколько времени занял ответ. wget удобен для скачивания файлов в скриптах, а в Node.js прокси подключается к встроенному fetch и к axios. Собрали рабочие команды и примеры кода для всех трёх, с SOCKS5, переменными окружения и разбором ошибок.
Коротко
5 пунктов- В curl прокси задаётся ключом
-x:curl -x http://login:password@ip:port https://api.ipify.org. - Для SOCKS5 используйте схему
socks5h://, чтобы имена сайтов разрешал прокси, а не ваш компьютер. - wget работает только с HTTP(S)-прокси, SOCKS5 он не поддерживает.
- Встроенный fetch в Node.js подключается к прокси через
ProxyAgentиз undici, axios черезhttps-proxy-agent. - Ключ
-vв curl показывает, на каком шаге обрывается соединение: это самый быстрый способ диагностики.
Формат адреса прокси
Все инструменты ниже понимают прокси в виде URL: схема, логин и пароль, адрес и порт. Адреса в примерах условные, подставьте свои из выдачи.
http://login:[email protected]:8000
socks5h://login:[email protected]:1080Схема http:// у HTTP(S)-прокси означает способ подключения к самому прокси, а не к сайту: HTTPS-сайты открываются через туннель CONNECT и остаются зашифрованными. Если в выдаче строка вида ip:port:login:password, переведите её в URL в конвертере прокси. Символы @, : и # в пароле нужно закодировать: %40, %3A, %23.
curl: основные команды
# логин и пароль в адресе
curl -x http://login:[email protected]:8000 https://api.ipify.org
# логин и пароль отдельным ключом (-U то же, что --proxy-user)
curl -x http://203.0.113.10:8000 -U login:password https://api.ipify.org
# прокси с привязкой по IP, без пароля
curl -x http://203.0.113.10:8000 https://api.ipify.org# имена сайтов разрешает прокси (рекомендуется)
curl -x socks5h://login:[email protected]:1080 https://api.ipify.org
# имена разрешает ваш компьютер: DNS-запросы уйдут вашему провайдеру
curl -x socks5://login:[email protected]:1080 https://api.ipify.orgЕсли команда вернула адрес прокси, всё работает. В Windows 10 и 11 curl встроен, но в PowerShell слово curl - псевдоним другой команды, поэтому пишите curl.exe. Разница между socks5 и socks5h подробно разобрана в статье утечки WebRTC и DNS.
Полезные ключи
| Ключ | Что делает |
|---|---|
-v | Подробный вывод: подключение к прокси, CONNECT, ответ прокси и сайта |
-I | Только заголовки ответа |
-m 15 | Общий таймаут 15 секунд |
--connect-timeout 5 | Таймаут подключения |
-s -o /dev/null -w "%{http_code} %{time_total}\n" | Только код ответа и время (в Windows -o NUL) |
--noproxy "localhost,127.0.0.1" | Адреса, к которым идти напрямую |
-A "Mozilla/5.0 ..." | Свой User-Agent |
curl -s -o /dev/null -x http://login:[email protected]:8000 \
-w "connect: %{time_connect}s tls: %{time_appconnect}s total: %{time_total}s\n" \
https://www.google.comtime_connect показывает время подключения к прокси, time_appconnect - завершение TLS с сайтом через туннель, total - весь запрос. Если большая задержка уже на подключении, прокси далеко или перегружен. Как разобраться со скоростью, рассказано в статье почему прокси медленно работает.
Переменные окружения и файл .curlrc
export http_proxy="http://login:[email protected]:8000"
export https_proxy="http://login:[email protected]:8000"
export no_proxy="localhost,127.0.0.1"
curl https://api.ipify.orgcurl принимает http_proxy только в нижнем регистре: это защита от подмены прокси через HTTP-заголовок Proxy в CGI-скриптах. Для HTTPS работают оба варианта, https_proxy и HTTPS_PROXY. Переменная ALL_PROXY задаёт прокси для всех протоколов. Те же переменные читают wget, pip, git и многие другие программы.
Чтобы curl всегда ходил через прокси без ключей, добавьте строку proxy = "http://login:[email protected]:8000" в файл ~/.curlrc. В Windows это файл _curlrc в папке %APPDATA%. Помните, что пароль в таком файле хранится открыто.
wget
wget -q -O - \
-e use_proxy=yes \
-e https_proxy=http://203.0.113.10:8000 \
--proxy-user=login --proxy-password=password \
https://api.ipify.orgКлюч -e выполняет команду из синтаксиса файла настроек, так прокси задаётся без переменных окружения. Для постоянной настройки добавьте строки в ~/.wgetrc:
use_proxy = on
http_proxy = http://203.0.113.10:8000
https_proxy = http://203.0.113.10:8000
proxy_user = login
proxy_password = passwordNode.js: встроенный fetch и undici
Встроенный fetch в Node.js построен на библиотеке undici и сам прокси не подхватывает. Прокси передаётся через диспетчер ProxyAgent.
import { fetch, ProxyAgent } from "undici";
const dispatcher = new ProxyAgent("http://login:[email protected]:8000");
const res = await fetch("https://api.ipify.org", {
dispatcher,
signal: AbortSignal.timeout(15000),
});
console.log(await res.text());Импортируйте fetch из того же пакета undici, что и ProxyAgent: при смешивании встроенного fetch и диспетчера из другой версии undici бывают несовместимости. Вместо логина в адресе можно передать заголовок явно: new ProxyAgent({ uri: "http://203.0.113.10:8000", token: "Basic " + Buffer.from("login:password").toString("base64") }).
Прокси из переменных окружения
В Node.js 24 и новее встроенный fetch умеет брать прокси из HTTP_PROXY, HTTPS_PROXY и NO_PROXY, если запустить процесс с переменной NODE_USE_ENV_PROXY=1. В Node.js 20 и 22 то же делается в коде одной строкой:
import { setGlobalDispatcher, EnvHttpProxyAgent } from "undici";
setGlobalDispatcher(new EnvHttpProxyAgent());
// дальше любой fetch пойдёт через HTTPS_PROXY с учётом NO_PROXYNode.js: axios, SOCKS5 и ротация
У axios есть собственная опция proxy, но с HTTPS-сайтами надёжнее работает агент из пакета https-proxy-agent. Встроенную опцию при этом отключают, чтобы она не мешала агенту.
import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";
import { SocksProxyAgent } from "socks-proxy-agent";
// HTTP(S)-прокси
const httpAgent = new HttpsProxyAgent("http://login:[email protected]:8000");
const r1 = await axios.get("https://api.ipify.org", { httpsAgent: httpAgent, proxy: false, timeout: 15000 });
console.log(r1.data);
// SOCKS5, DNS на стороне прокси
const socksAgent = new SocksProxyAgent("socks5h://login:[email protected]:1080");
const r2 = await axios.get("https://api.ipify.org", { httpsAgent: socksAgent, httpAgent: socksAgent, proxy: false });
console.log(r2.data);Те же агенты подходят для модулей https и http из стандартной библиотеки, для got и других клиентов, которые принимают agent. Для ротации по списку статических адресов достаточно создать агент на каждый адрес и перебирать их по кругу:
import { readFileSync } from "node:fs";
import { fetch, ProxyAgent } from "undici";
const agents = readFileSync("proxies.txt", "utf8")
.split(/\r?\n/)
.filter(Boolean)
.map((url) => new ProxyAgent(url));
let i = 0;
async function get(url) {
const dispatcher = agents[i++ % agents.length];
const res = await fetch(url, { dispatcher, signal: AbortSignal.timeout(15000) });
if (res.status === 429) throw new Error("rate limited, slow down");
return res.text();
}Агенты переиспользуют соединения, поэтому создавайте их один раз, а не на каждый запрос. Для браузерных сценариев на Node.js смотрите статью прокси в Selenium, Playwright и Puppeteer, для Python - прокси в Python.
Проверка списка прокси и частые ошибки
while read -r p; do
host=$(echo "$p" | cut -d@ -f2)
ip=$(curl -s -m 10 -x "$p" https://api.ipify.org) || ip="FAIL"
echo "$host -> $ip"
done < proxies.txtСкрипт выводит хост прокси без пароля и внешний IP, который видит сайт. Если адрес не отвечает, сначала проверьте протокол: прокси, заказанный как HTTP(S), не заработает со схемой socks5h://, и наоборот. В течение 24 часов после покупки неработающий адрес можно бесплатно заменить.
| Сообщение | Что значит | Что делать |
|---|---|---|
CONNECT tunnel failed, response 407 | Прокси не принял логин или пароль | Проверьте данные и кодирование спецсимволов |
curl: (7) Failed to connect | Порт закрыт или прокси не активен | Сверьте адрес и порт с выдачей |
curl: (28) Operation timed out | Нет ответа за отведённое время | Увеличьте таймаут, проверьте другой адрес |
curl: (97) | Ошибка рукопожатия с прокси | Чаще всего не тот протокол: SOCKS вместо HTTP или наоборот |
ECONNRESET в Node.js | Соединение сброшено | Проверьте протокол и не превышайте разумное число параллельных запросов |
Полная расшифровка кодов с разбором, кто вернул ошибку, прокси или сайт, есть в статье ошибки прокси 407, 403, 502, 504.
Какие прокси брать для скриптов
- Задача
Сбор открытых данных и мониторинг
ВыборСерверные IPv4 нужной страны: стабильные адреса по низкой цене, удобно перебирать списком.
Смотреть: Сбор открытых данных и мониторинг - Задача
Сайты с поддержкой IPv6
ВыборIPv6-прокси обходятся заметно дешевле. Проверьте, что целевой сайт отвечает по IPv6:
Смотреть: Сайты с поддержкой IPv6curl -6 -I https://example.com. - Задача
Сайты, строгие к дата-центрам
ВыборРезидентские прокси с ротацией через один шлюз, без собственной логики перебора.
Смотреть: Сайты, строгие к дата-центрам
Большие списки удобно получать через API, а не переписывать файл вручную. Сценарии сбора данных описаны на странице прокси для парсинга, все типы с ценами в каталоге.
Вопросы и ответы
Как указать логин и пароль прокси в curl?
В адресе: curl -x http://login:[email protected]:8000 URL, или отдельным ключом: curl -x http://203.0.113.10:8000 -U login:password URL. Спецсимволы в пароле закодируйте.
Почему curl игнорирует переменную HTTP_PROXY?
Для HTTP curl читает только переменную в нижнем регистре, http_proxy. Это защита от подмены прокси через заголовок запроса. Для HTTPS работают оба варианта.
Поддерживает ли wget SOCKS5?
Нет, классический wget работает только с HTTP(S)-прокси. Для SOCKS5 используйте curl или запуск через proxychains.
Как подключить прокси к fetch в Node.js?
Через ProxyAgent из пакета undici: передайте его в опции dispatcher. В Node.js 24 и новее можно также задать HTTPS_PROXY и запустить процесс с NODE_USE_ENV_PROXY=1.
Прокси для этой задачи
Цена «от» за единицу на базовый срок, страны и скидка за объём видны на странице товара.
- Выбрать страну
Индивидуальные IPv4
68 стран, от 179 ₽ за IP / 30 дней
- Выбрать страну
IPv6 Эконом
10 стран, от 52 ₽ за IP / 30 дней
- Выбрать страну
Прокси для парсинга
11 стран, от 59 ₽ за IP / 30 дней
- Выбрать страну
Резидентские
60 стран, от 149 ₽ за 1 ГБ / 30 дней
- #curl
- #wget
- #Node.js
- #командная строка
- #парсинг
Прокси предоставляются для законных задач. Спам, мошенничество и взлом запрещены, соблюдайте правила площадок. Правила сервиса
Читайте также
Все статьи- GDГайды
Прокси в Python: requests, httpx, aiohttp, Scrapy и SOCKS5
Как подключить прокси в Python: рабочие примеры для requests, httpx, aiohttp и Scrapy, логин и пароль в адресе, SOCKS5, ротация по списку и разбор ошибок 407 и 429.
10 мин - GDГайды
Прокси в Selenium, Playwright и Puppeteer: авторизация и ротация
Как подключить прокси с логином и паролем в Selenium, Playwright и Puppeteer: рабочие примеры на Python и Node.js, свой IP на контекст, ротация, SOCKS5 и утечки.
6 мин - GDГайды
Ошибки прокси 407, 403, 502, 504: что значат и как исправить
Разбор ошибок прокси: 407, 403, 429, 502, 503, 504, таймауты, ERR_PROXY_CONNECTION_FAILED и ERR_TUNNEL_CONNECTION_FAILED. Как понять, кто виноват, и что делать.
8 мин