Настройка прокси · 2 мин чтения

Использование переменных окружения HTTP_PROXY / HTTPS_PROXY

Переменные окружения HTTP_PROXY, HTTPS_PROXY и NO_PROXY — это самый быстрый способ направить исходящий трафик программы через прокси. Вот как они ведут себя в curl, wget, Python, Node.js и Docker — и где они незаметно не срабатывают.

Как работают переменные окружения прокси

HTTP_PROXY, HTTPS_PROXY и NO_PROXY — это старая кроссплатформенная конвенция: многие инструменты командной строки и HTTP-библиотеки читают их при запуске и направляют исходящие запросы через указанный вами прокси. Эффект прост — ваш реальный / исходный IP остаётся скрытым, а получатель видит вместо него выходной адрес прокси.

Названия сбивают с толку. HTTP_PROXY — это прокси для URL-адресов назначения http://, а HTTPS_PROXY — для URL-адресов назначения https://; это не означает «прокси, доступный по HTTPS». Схема внутри значения (http:// или socks5h://) определяет, как ваш клиент соединяется с нашим прокси.

Не каждый инструмент учитывает эти переменные, а те, что учитывают, расходятся в деталях:

ИнструментЧитает переменные окружения?Примечания
curlДастрочными буквами http_proxy только для HTTP; оба регистра для HTTPS
wgetДаучитывает http_proxy, https_proxy, no_proxy
Python requests / urllibДаавтоматически; аргумент proxies= для отдельного запроса имеет приоритет
Node.js core fetch / httpНетнужен undici ProxyAgent или global-agent
Docker CLI / buildЧастичнопередавайте через --build-arg, -e или config.json

Наши прокси — из дата-центров (не резидентные), поэтому потребительские сайты могут чаще их помечать — отлично подходят для API, CI и целей скрапинга, которые вы контролируете, и хуже для закрытых потребительских платформ. Наши аутентифицированные SOCKS5 и HTTP прокси требуют имени пользователя и пароля, так что ничего не выходит без ваших учётных данных. Для постоянной маршрутизации всего устройства используйте вместо этого WireGuard VPN; чтобы попробовать одноразовый публичный список прокси или узнать цену доступа по счётчику, смотрите цены. Больше рецептов — в руководствах, а полное сравнение VPN и прокси тоже здесь.

Задайте переменные в вашей оболочке (curl + wget)

Экспортируйте один раз, и обычные команды будут выходить через прокси. Аутентификация указывается прямо в URL в формате USER:PASS. Задайте также вариант строчными буквами — curl читает http_proxy только строчными буквами для схемы HTTP.

bash
# HTTP proxy endpoint (port 3128) with inline auth
export HTTP_PROXY="http://USER:[email protected]:3128"
export HTTPS_PROXY="http://USER:[email protected]:3128"
# curl and some tools only read the lowercase form — set both
export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"

# Never send local / internal traffic through the proxy
export NO_PROXY="localhost,127.0.0.1,::1,.internal,169.254.169.254"
export no_proxy="$NO_PROXY"

# Now normal commands go through the proxy
curl https://api.ipify.org      # prints the proxy exit IP, not yours
wget -qO- https://api.ipify.org

# One-off, without exporting anything:
curl -x http://USER:[email protected]:3128 https://example.com

# SOCKS5 (port 1080). socks5h makes DNS resolve AT the proxy,
# so your origin never leaks the hostname lookup.
export ALL_PROXY="socks5h://USER:[email protected]:1080"
curl https://api.ipify.org

Python и Node.js

requests/urllib в Python подхватывают эти переменные автоматически. Встроенный http в Node и глобальный fetch() — нет; вам придётся самостоятельно подключить прокси-агент.

python
# --- Python: requests, urllib, pip and httpx honor the env vars ---
import requests
print(requests.get("https://api.ipify.org").text)   # proxy exit IP

# Override per-request (this ignores the env vars):
proxies = {
    "http":  "http://USER:[email protected]:3128",
    "https": "http://USER:[email protected]:3128",
}
requests.get("https://api.ipify.org", proxies=proxies)

# SOCKS5 needs the extra:  pip install "requests[socks]"
proxies = {"https": "socks5h://USER:[email protected]:1080"}


# --- Node.js (>=18): core fetch does NOT read HTTP_PROXY on its own ---
// import { ProxyAgent, setGlobalDispatcher } from "undici";
// setGlobalDispatcher(
//   new ProxyAgent("http://USER:[email protected]:3128"));
// const r = await fetch("https://api.ipify.org");
// console.log(await r.text());        // proxy exit IP
//
// To make libraries respect the env vars instead:
//   npm i global-agent
//   GLOBAL_AGENT_HTTP_PROXY=$HTTP_PROXY node -r global-agent/bootstrap app.js

Docker (сборка и выполнение)

Контейнеры не наследуют окружение вашей оболочки. Передавайте переменные явно для сборок и запусков; демон, который скачивает образы, читает их из своего собственного конфигурационного файла.

bash
# Build-time: forward the proxy into the build
docker build \
  --build-arg HTTP_PROXY="http://USER:[email protected]:3128" \
  --build-arg HTTPS_PROXY="http://USER:[email protected]:3128" \
  --build-arg NO_PROXY="localhost,127.0.0.1" .

# Runtime: inject into the running container
docker run --rm \
  -e HTTP_PROXY="http://USER:[email protected]:3128" \
  -e HTTPS_PROXY="http://USER:[email protected]:3128" \
  -e NO_PROXY="localhost,127.0.0.1" \
  curlimages/curl https://api.ipify.org

# The Docker daemon itself (image pulls) reads ~/.docker/config.json:
#   { "proxies": { "default": {
#       "httpProxy":  "http://USER:[email protected]:3128",
#       "httpsProxy": "http://USER:[email protected]:3128",
#       "noProxy":    "localhost,127.0.0.1" } } }

Подводные камни, о которых стоит знать

Кодируйте учётные данные в percent-encoding

Специальные символы в USER:PASS ломают URL. Кодируйте их: @ становится %40, : становится %3A, / становится %2F, # становится %23. Иначе парсер обрежет значение не в том месте.

HTTPS_PROXY нацелен на URL-адреса https://

Она выбирает прокси для URL-адресов назначения https, а не прокси, доступный по HTTPS. Схема в значении (http:// или socks5h://) определяет, как вы соединяетесь с нашим прокси.

NO_PROXY привередлив

Разделяется запятыми, без пробелов, сопоставляется по суффиксу (.example.com). Диапазоны CIDR и символ подстановки * поддерживаются одними инструментами и игнорируются другими, поэтому проверяйте, а не предполагайте.

socks5h против socks5

С socks5:// ваша машина разрешает DNS локально, и через прокси проходит только TCP-соединение. Используйте socks5h://, чтобы поиск имени хоста тоже происходил на прокси, не задействуя DNS вашего источника.

Учётные данные видны локально

Переменные окружения появляются в выводе ps, истории оболочки и логах CI. Используйте отдельные прокси-учётные данные для каждого аккаунта, которые можно ротировать, и предпочитайте хранилища секретов вместо того, чтобы вписывать их в Dockerfile или конвейер.

Не каждый клиент им подчиняется

Встроенные http и fetch в Node, а также некоторые SDK, полностью игнорируют эти переменные. Всегда проверяйте через IP-эхо вроде api.ipify.org, что трафик действительно вышел через выход прокси, а не через ваш реальный IP.

Поделиться страницей
FAQ

Ответы на вопросы

Почему curl игнорирует HTTP_PROXY, но учитывает http_proxy?

Для схемы HTTP curl намеренно читает только http_proxy строчными буквами. Вариант HTTP_PROXY заглавными буквами отключили много лет назад, потому что CGI-скрипты получают переменную окружения HTTP_* из заголовков клиента, что могло бы подменить настройку прокси. Для HTTPS и NO_PROXY curl читает оба регистра. Безопасная привычка — экспортировать варианты и заглавными, и строчными буквами.

В чём разница между HTTPS_PROXY и «прокси по HTTPS»?

HTTPS_PROXY определяет, какой прокси обрабатывает запросы к целевым URL-адресам https://. Он ничего не говорит о том, как вы подключаетесь к самому прокси — это задаётся схемой в значении. http://proxy.s4m.online:3128 обращается к нашему HTTP-прокси через открытый CONNECT; socks5h://proxy.s4m.online:1080 обращается к конечной точке SOCKS5. Ваша фактическая полезная нагрузка к https-сайту остаётся зашифрованной TLS от начала до конца в любом случае.

Можно ли указать SOCKS5-URL в HTTP_PROXY?

curl принимает socks5:// и socks5h:// в URL-адресе прокси, но многие другие инструменты — нет. Для переносимости используйте ALL_PROXY для SOCKS5 или собственную опцию SOCKS вашей библиотеки. Отдавайте предпочтение socks5h://, чтобы DNS разрешался на proxy.s4m.online:1080, а не утекал запросами с вашего источника.

Это резидентные прокси?

Нет. Прокси s4m — это аутентифицированные датацентровые SOCKS5- и HTTP-прокси с оплатой по факту использования. Датацентровые IP быстрые и надёжные для API, CI и целей скрапинга, которые вы контролируете, но некоторые потребительские сайты обнаруживают и блокируют датацентровые диапазоны легче, чем резидентные. Мы не продаём резидентные IP и не заявляем, что располагаем ими.

Скроет ли установка этих переменных мой настоящий IP везде?

Только для программ, которые их действительно читают. Встроенный http в Node, глобальный fetch, некоторые SDK и любое приложение, открывающее сырые сокеты, обойдут прокси и раскроют ваш настоящий IP. После настройки проверьте с помощью IP-эха, например api.ipify.org, или воспользуйтесь нашим WireGuard VPN, когда нужно направить каждый процесс на устройстве.

Направьте свои запросы через s4m

Аутентифицированные SOCKS5 и HTTP прокси дата-центров с тарификацией по факту использования, а также WireGuard VPN с фиксированной оплатой. No-logs по задумке, RAM-first, анонимные аккаунты. Добавьте выделенный персональный IP, когда вам нужен статический выход.

Эту страницу нашли по запросу

Реальные поисковые фразы, на которые отвечает эта страница — по ссылкам откроются материалы, раскрывающие тему глубже.