TrueSocks

Гайды · 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: основные команды

#
HTTP(S)-прокси
# логин и пароль в адресе
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
SOCKS5
# имена сайтов разрешает прокси (рекомендуется)
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.com

time_connect показывает время подключения к прокси, time_appconnect - завершение TLS с сайтом через туннель, total - весь запрос. Если большая задержка уже на подключении, прокси далеко или перегружен. Как разобраться со скоростью, рассказано в статье почему прокси медленно работает.

Переменные окружения и файл .curlrc

#
Linux и macOS
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.org

curl принимает 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:

~/.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 = password

Node.js: встроенный fetch и undici

#

Встроенный fetch в Node.js построен на библиотеке undici и сам прокси не подхватывает. Прокси передаётся через диспетчер ProxyAgent.

npm install undici, файл .mjs
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_PROXY

Node.js: axios, SOCKS5 и ротация

#

У axios есть собственная опция proxy, но с HTTPS-сайтами надёжнее работает агент из пакета https-proxy-agent. Встроенную опцию при этом отключают, чтобы она не мешала агенту.

npm install axios https-proxy-agent socks-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.

Проверка списка прокси и частые ошибки

#
Bash: проверить все адреса из файла
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.

Какие прокси брать для скриптов

#

Большие списки удобно получать через 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.

Редакция TrueSocks

Гайды и разборы о прокси

Статьи пишет команда TrueSocks: те, кто собирает каталог прокси и отвечает в поддержке. Нашли неточность или устаревший шаг? Напишите нам в Telegram, поправим.

На посадку

Прокси для этой задачи

Цена «от» за единицу на базовый срок, страны и скидка за объём видны на странице товара.

  • #curl
  • #wget
  • #Node.js
  • #командная строка
  • #парсинг
Поделиться

Прокси предоставляются для законных задач. Спам, мошенничество и взлом запрещены, соблюдайте правила площадок. Правила сервиса

Все статьи