Попробовать
Назад к блогу

Прокси для Wget: настройка через HTTP, HTTPS и SOCKS5 в Linux, macOS и Windows

Прокси для Wget: настройка через HTTP, HTTPS и SOCKS5 в Linux, macOS и Windows

Чтобы GNU Wget скачивал через посредника, достаточно указать ему адрес в http_proxy и https_proxy: как переменную оболочки, строкой конфига .wgetrc или ключом -e в самой команде. Логин с паролем указываются либо прямо в URL прокси, либо отдельно через --proxy-user и --proxy-password. Есть и важная оговорка: с посредником Wget общается исключительно по HTTP, так что SOCKS5-серверу понадобится обёртка — например, proxychains-ng.

Ниже — все способы настройки, от разовой команды до постоянного конфига, а также авторизация, HTTPS-сайты через прокси, обходной путь для SOCKS5, быстрая проверка IP и разбор типичных ошибок. Начнём с короткой памятки по основным командам скачивания: параметры прокси комбинируются именно с ними.

Прокси для консольных утилит

HTTP- и SOCKS5-прокси с логином и паролем, которые работают в wget и curl

Попробовать

Основы Wget за две минуты

Wget — неинтерактивный загрузчик: он скачивает файлы и целые страницы по HTTP, HTTPS и FTP и продолжает работу, даже если терминал закрыт. В большинстве дистрибутивов Linux он уже установлен; в macOS ставится через Homebrew (brew install wget), в Windows — нативная сборка из менеджера пакетов, например Chocolatey или Scoop.

ЗадачаКоманда
Скачать файл под исходным именемwget https://example.com/report.pdf
Сохранить под другим именемwget -O latest.pdf https://example.com/report.pdf
Докачать прерванную загрузкуwget -c https://example.com/big.iso
Скачать все адреса из спискаwget -i urls.txt
Сохранить страницу с картинками и CSS для офлайн-чтенияwget -p -k https://example.com/article
Зеркалировать раздел сайтаwget --mirror -np -k -p https://example.com/docs/
Не нагружать серверwget --wait=2 --random-wait --limit-rate=500k ...
Вывести страницу в терминалwget -qO- https://example.com

При зеркалировании соблюдайте robots.txt (Wget учитывает его по умолчанию) и правила сайта, а темп держите низким с помощью --wait.

Способ 1. Прокси для одной команды

Параметр -e выполняет инструкцию из .wgetrc прямо в командной строке, поэтому за пределами этого запуска ничего не меняется:

wget -e use_proxy=on \
     -e http_proxy=http://203.0.113.24:8000 \
     -e https_proxy=http://203.0.113.24:8000 \
     https://example.com/data.json

Нужны обе переменные: Wget выбирает прокси по схеме целевого адреса — http_proxy для обычных HTTP-ссылок, https_proxy для HTTPS. Сам прокси в обоих случаях доступен по обычному HTTP: для HTTPS-сайта Wget просит прокси открыть туннель CONNECT и проводит через него TLS, так что содержимое страницы прокси не видит. Чем отличаются HTTP- и HTTPS-прокси, разобрано в отдельной статье.

Способ 2. Экспорт переменных

Для всей текущей сессии терминала достаточно один раз выполнить export:

export http_proxy="http://203.0.113.24:8000"
export https_proxy="$http_proxy"
export no_proxy="localhost,127.0.0.1,.office.lan"
wget -qO- https://api.ipify.org; echo

Wget читает имена в нижнем регистре, ими и пользуйтесь. В no_proxy перечисляются узлы, которые должны идти напрямую, — имена или суффиксы доменов через запятую. Чтобы настройки сохранялись между сессиями, добавьте строки export в ~/.bashrc или ~/.zshrc, помня, что те же переменные читают curl и менеджеры пакетов.

Когда переменные уже выставлены, а конкретную загрузку нужно провести напрямую, допишите к ней ключ --no-proxy, и этот запуск обойдёт посредника.

Способ 3. Постоянный файл .wgetrc

Файл конфигурации действует только на Wget и не засоряет окружение оболочки. Пользовательские настройки лежат в ~/.wgetrc, общесистемные — в /etc/wgetrc или /usr/local/etc/wgetrc в зависимости от сборки. Можно указать и любой другой файл через переменную окружения WGETRC — в Windows это самый простой путь.

# ~/.wgetrc
use_proxy = on
https_proxy = http://203.0.113.24:8000/
http_proxy = http://203.0.113.24:8000/
proxy_user = user-7f3k
proxy_password = ваш-пароль
no_proxy = localhost,127.0.0.1

Раз пароль хранится без шифрования, права на файл стоит ограничить командой chmod 600 ~/.wgetrc. Чтобы на время отказаться от прокси, замените значение use_proxy на off и ничего больше не удаляйте.

Три места, откуда Wget берёт настройки прокси: параметры командной строки, переменные окружения и файл wgetrc
Wget берёт настройки прокси из параметров командной строки, переменных окружения или файла wgetrc; параметры в командной строке имеют приоритет

Порядок приоритета простой: параметры командной строки перекрывают .wgetrc, а явные -e или --proxy-user важнее всего остального.

Авторизация на прокси

Передать логин и пароль в Wget можно двумя равноценными способами.

В адресе прокси. Логин и пароль ставятся перед хостом, например http://user-7f3k:ваш-пароль@203.0.113.24:8000. Символы, имеющие особый смысл в URL, — @, : или # — нужно закодировать, например @ превращается в %40.

Отдельными параметрами — так кодировать ничего не нужно:

wget --proxy-user=user-7f3k --proxy-password='ваш-пароль' \
     -e https_proxy=http://203.0.113.24:8000 \
     https://example.com/file.zip

Пароль, набранный в командной строке, попадает в историю оболочки и виден другим пользователям машины в списке процессов. На общих серверах лучше использовать .wgetrc с закрытыми правами или прокси с авторизацией по IP, где пароль не нужен вовсе.

Wget и SOCKS5: обходной путь

В GNU Wget 1.x поддержки SOCKS нет, и в документации Wget2 такой опции тоже не значится. Поэтому настройка вида http_proxy=socks5://... не работает. Практических обходных путей три; чем отличаются протоколы, объясняет сравнение SOCKS5 и HTTP-прокси.

Как обойти отсутствие поддержки SOCKS5
Как обойти отсутствие поддержки SOCKS5

Вариант 1. proxychains-ng

Про устройство протокола можно прочитать в статье что такое SOCKS5-прокси. proxychains-ng перехватывает сетевые вызовы динамически собранной программы и отправляет их через прокси из своего конфига. Установите пакет proxychains4 (Debian и Ubuntu) или proxychains-ng (Homebrew, Arch) и создайте личный конфиг:

# ~/.proxychains/proxychains.conf
strict_chain
proxy_dns
tcp_connect_time_out 8000
tcp_read_time_out 15000

[ProxyList]
socks5 203.0.113.24 1080 user-7f3k ваш-пароль

Запустите Wget через него:

proxychains4 -q -f ~/.proxychains/proxychains.conf wget -qO- https://api.ipify.org

Строка proxy_dns заставляет прокси самостоятельно разрешать имена хостов, и DNS-запросы не уходят с вашего подключения. proxychains работает через предзагрузку библиотек, поэтому не подходит для статически собранных программ, а в macOS для системных бинарников это ограничивает System Integrity Protection; Wget, установленный через Homebrew, обычно работает.

Вариант 2. tsocks и torsocks

tsocks — более старый инструмент того же типа, который много лет не обновляется, поэтому на современных системах берите proxychains-ng. torsocks создан специально для Tor и универсальным SOCKS5-клиентом не является.

Вариант 3. HTTP-порт или другой инструмент

Многие провайдеры отдают один и тот же выход по обоим протоколам. Если в тарифе есть HTTP-порт, направьте Wget на него и обойдитесь без прослоек; наши SOCKS5-прокси доступны в обоих вариантах. Для скриптов, которым нужен именно SOCKS5, подойдёт curl — он поддерживает его штатно через --socks5-hostname.

Проверьте, что Wget идёт через прокси

Выведите внешний адрес с прокси и без него и сравните:

wget -qO- --no-proxy https://api.ipify.org; echo
wget -qO- https://api.ipify.org; echo

Вторая строка должна показать IP прокси. Для подробностей wget -S выводит заголовки ответа, а в подробном режиме Wget пишет, к какому хосту подключается, — там виден адрес прокси.

Частые ошибки и их решение

СообщениеЧто означаетЧто делать
Proxy tunneling failed: Proxy Authentication RequiredПрокси не открыл туннель CONNECT без верных учётных данныхПроверьте логин и пароль, закодируйте спецсимволы
407 Proxy Authentication RequiredТо же для HTTP-адресаДобавьте --proxy-user и --proxy-password
Connecting to 203.0.113.24:8000... failed: Connection refusedНеверный порт или прокси не работаетСверьте порт в панели провайдера
Unable to establish SSL connectionТуннель оборвался, часто после ошибки авторизацииСначала исправьте авторизацию; не отключайте проверку сертификатов
Запрос идёт напрямуюПеременные в верхнем регистре или use_proxy = offИспользуйте имена в нижнем регистре, проверьте .wgetrc
Error parsing proxy URL ... Unsupported schemeУказан адрес socks5, а SOCKS Wget не поддерживаетИспользуйте proxychains-ng или HTTP-порт

Параметр --no-check-certificate глушит ошибки TLS, но вместе с ними убирает защиту от перехвата. Применяйте его только для известного тестового хоста и никогда — как «лекарство» от проблем с прокси.

Особенности Windows

В Windows PowerShell 5.1 команда wget по умолчанию перенаправляется на Invoke-WebRequest — это другой инструмент с собственными ключами. Пишите wget.exe полностью — так гарантированно запустится утилита GNU. Переменные прокси работают так же: $env:https_proxy = "http://203.0.113.24:8000" в PowerShell или set https_proxy=http://203.0.113.24:8000 в cmd. Файл конфигурации можно положить в любую папку и указать путь к нему в WGETRC.

Для больших загрузок с множества адресов обычно быстрее и дешевле всего серверные прокси — если целевой сайт не фильтрует диапазоны хостингов.

Частые вопросы о wget и прокси

Поддерживает ли wget SOCKS5-прокси?

Нет. GNU Wget работает с прокси только по HTTP, поэтому пустите его через proxychains-ng, используйте HTTP-порт того же прокси или возьмите curl для задач с SOCKS5.

Почему wget не видит переменную HTTPS_PROXY?

Wget читает имена в нижнем регистре — https_proxy и http_proxy. Проверьте также, нет ли в .wgetrc строки use_proxy = off, которая отключает прокси независимо от окружения.

Как передать пароль со спецсимволами?

Либо закодируйте его в адресе прокси, либо передайте параметром --proxy-password в одинарных кавычках — тогда кодировать ничего не нужно.

Как сделать, чтобы wget обходил прокси для одного сайта?

Добавьте хост в no_proxy, например локальные адреса или суффикс внутреннего домена, либо допишите --no-proxy к конкретной команде.

Как узнать, с какого IP работает wget?

Выполните wget -qO- https://api.ipify.org с настроенным прокси и повторите ту же команду, добавив --no-proxy: адреса должны различаться.