Настройка мобильного прокси в Linux
В Linux каждая утилита управляет собственной конфигурацией прокси, поэтому единого места для настройки нет. В этом руководстве рассматриваются переменные среды и сфера их действия, настройки рабочего стола и их недостатки, а также утилиты, которые требуют использования собственного файла настроек.
- Переменные среды доступны большинству утилит — curl, wget, git, pip и npm все считывают значения http_proxy и https_proxy.
- sudo отключает их — при выполнении команды с повышенными правами прокси перестает работать, если вы не настроите его прохождение специально.
- apt по замыслу игнорирует их — менеджер пакетов использует свой собственный файл конфигурации, а не переменные среды вашей оболочки.
- Настройка рабочего стола не действует в масштабах всей системы — она распространяется на приложения GNOME, а ваш терминал к ним не относится.
Добавьте статический адрес сервера в белый список и полностью исключите ввод учетных данных.
Четыре экспортные функции в профиле определяют большую часть пользовательского пространства.
Переменные среды и сфера их действия
В Linux нет системных настроек прокси в том смысле, в каком это понимается в других операционных системах. Вместо этого существует соглашение: большинство программ считывает переменные среды `http_proxy` и `https_proxy` и учитывает переменную `no_proxy` для хостов, которые должны обходить эти настройки. Эта конвенция охватывает очень многое — curl, wget, git, pip, npm, большинство сред выполнения языков программирования — но это скорее конвенция, чем правило, и именно об исключениях из неё и пойдёт речь в данном руководстве.
export http_proxy="http://user123:[email protected]:8000" export https_proxy="$http_proxy" export no_proxy="localhost,127.0.0.1,::1,.internal.example.com,10.0.0.0/8" # Some tools read only the upper-case names export HTTP_PROXY="$http_proxy" export NO_PROXY="$no_proxy"
Лучше намеренно установить значение no_proxy, чем оставлять поле пустым. Без него запросы к localhost и внутренним именам хостов отправляются через прокси, который не может к ним подключиться — в результате подключение к базе данных или проверка работоспособности, которые еще пять минут назад работали нормально, начинают завершаться с тайм-аутом по причинам, которые никак не похожи на проблему с прокси. Значения разделяются запятыми, без пробелов, а точка в начале строки означает поддомены.
Обратите внимание, что параметр https_proxy принимает схему http://. Схема указывает, как подключиться к прокси-серверу, а не какой протокол использует целевой сервер; клиент открывает туннель, и внутри него от начала до конца работает TLS. Для SOCKS5 предпочтительнее использовать форму socks5h, где конечная буква h обеспечивает прохождение DNS-разрешения через прокси — без неё ваш компьютер разрешает каждое имя хоста локально и раскрывает весь список посещаемых вами доменов вашей собственной сети.
| Слой | Что это считывает | Чего в ней не хватает |
|---|---|---|
| Переменные среды | curl, wget, git, pip, npm, большинство сред выполнения | Все, что запускается с помощью sudo, apt, а также службы, запускаемые systemd |
| Настройка прокси на рабочем столе | GNOME Web и приложения, которые считывают настройки рабочего стола | Ваш терминал и все, что запускается из него |
| Настройки для каждого инструмента | apt, Docker, snap, git — для каждого свой файл | Ничего, но для каждого инструмента нужно написать по одному |
| proxychains | Любая программа, перехватывая свои сетевые вызовы | Бинарные файлы со статической компоновкой и всё, что позволяет обойти использование сетевых функций libc |
Настройки прокси-сервера на рабочем столе и что они включают
GNOME, KDE и другие среды рабочего стола предлагают настройку сетевого прокси, которая выглядит как средство системного управления, которого в Linux в остальном не хватает. Но это не так. При этом записывается ключ конфигурации рабочего стола, и это влияет только на те приложения, которые целенаправленно считывают этот ключ — на практике это GNOME Web и несколько приложений GNOME.
Ваш терминал не считывает его. Как и любые программы, запускаемые из терминала. Настройка прокси для рабочего стола, а затем недоумение по поводу того, почему curl возвращает ваш реальный адрес, — это, пожалуй, самая распространенная ошибка при настройке прокси в Linux, и она вполне объяснима: ничто в интерфейсе не указывает на то, насколько ограничена область его действия.
Рассматривайте настройку рабочего стола как настройку для конкретного приложения, которая просто находится в системном меню. Если вы хотите, чтобы проксировалось всё пользовательское пространство, для этого нужно использовать переменные среды в профиле вашей оболочки — но даже они не действуют за пределами sudo.
apt, sudo и инструменты, для которых требуется отдельный файл
Существует две причины, которые неизменно приводят к сбою работающей прокси-конфигурации в Linux, и обе связаны с тем, что среда не переносит предельное значение.
Первая проблема связана с командой sudo. Из соображений безопасности sudo удаляет большинство переменных окружения перед запуском команды, поэтому ваш тщательно экспортированный прокси просто исчезает. Однократную проблему можно решить, попросив sudo сохранить переменные среды; постоянное решение заключается в добавлении переменных прокси в список env_keep в файле sudoers, который следует редактировать с помощью visudo, а не напрямую.
Второй вариант — apt, который по замыслу игнорирует текущую среду и требует собственной конфигурации. Передача переменных через sudo каждый раз работает, но конфигурационный файл более надежен, поскольку его настройки применяются независимо от того, кто и как запускает команду.
# apt -- write /etc/apt/apt.conf.d/95proxies Acquire::http::Proxy "http://user123:[email protected]:8000"; Acquire::https::Proxy "http://user123:[email protected]:8000"; # sudo -- preserve the environment for one command sudo -E some-command # sudo -- permanently, via `sudo visudo` Defaults env_keep += "http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY" # git, which keeps its own config git config --global http.proxy "http://user123:[email protected]:8000"
Docker заслуживает отдельного упоминания, поскольку в нём существуют две разные проблемы с одинаковым названием. Демону требуется прокси для загрузки образов, настраиваемый в конфигурационном файле systemd; контейнерам же он нужен в качестве аргументов сборки или переменных среды. Настройка одного не влияет на другой, что приводит к знакомой ситуации, когда образы загружаются нормально, а приложение внутри не может ни к чему подключиться.
Для программного обеспечения, которое вообще не поддерживает прокси — некоторых старых сетевых утилит, нескольких инструментов с закрытым исходным кодом — стандартным решением является proxychains. Он предварительно загружает библиотеку, которая перехватывает сетевые вызовы программы и маршрутизирует их через прокси, определённый в собственном файле конфигурации, и поддерживает как SOCKS5, так и HTTP. Он не может помочь со статически скомпилированными бинарными файлами, поскольку в них нет ничего, что можно было бы перехватить.
Как узнать, какой прокси-сервер на самом деле использует команда
Поскольку каждый инструмент настраивается независимо, имеет смысл задавать не вопрос о том, работает ли прокси, а вопрос о том, какую именно конфигурацию использует данная конкретная команда. Лучше обратиться к самой команде, чем проверять настройки.
env | grep -i proxy curl -v https://api.ipify.org 2>&1 | head -20 curl https://api.ipify.org ; echo # through whatever env says curl --noproxy '*' https://api.ipify.org ; echo # deliberately direct sudo -E env | grep -i proxy # does sudo keep them?
| Симптом | Наиболее вероятная причина |
|---|---|
| Работает в оболочке, не работает при использовании sudo | Команда `sudo` удалила переменные среды. Используйте флаг `preserve` или `env_keep`. |
| curl работает через прокси, а apt — нет | apt игнорирует переменные среды. Укажите файл в каталоге apt.conf.d. |
| Настройка рабочего стола включена, терминал не затронут | Работает так, как и задумано. Нажатие клавиши на рабочем столе не передается в оболочку. |
| Местные службы внезапно прерываются по истечении времени ожидания | Параметр `no_proxy` не установлен, поэтому трафик с `localhost` направляется через прокси. |
| Изображения загружаются, у контейнеров нет доступа к сети | Демон Docker работает через прокси, а контейнеры — нет. |
| Настройки верны, ничего не изменилось | Профиль был отредактирован, но источники так и не были указаны. Откройте новую командную строку. |
Если вам нужно проверить именно конечную точку, а не настройки, то бесплатный инструмент для проверки прокси-серверов PXM2 проверяет это через браузер и сообщает об обнаруженном типе прокси и стране выхода.
Установите мобильный прокси для Linux
Активные локации PXM2 — выберите страну, в которой вам нужен выходной IP-адрес, и настройте его, следуя инструкциям на этой странице:
Великобритания
Испания
Индия
Часто задаваемые вопросы
Как настроить прокси в Linux?
Экспортируйте переменные http_proxy и https_proxy в вашей оболочке и задайте параметр no_proxy для хостов, которые должны обходить прокси. Добавьте их в профиль оболочки, чтобы настройки сохранялись. Это касается curl, wget, git, pip, npm и большинства программ командной строки, хотя для apt и некоторых других инструментов потребуется дополнительная настройка.
Почему apt игнорирует мои переменные среды прокси?
По замыслу — apt не наследует среду оболочки при запуске под sudo и использует собственную конфигурацию. Добавьте директиву прокси Acquire в файл в каталоге /etc/apt/apt.conf.d/, чтобы настройка сохранялась независимо от того, кто и как запускает команду. Это более надёжный способ, чем каждый раз передавать переменные через sudo.
Почему мой прокси перестает работать при использовании sudo?
Команда `sudo` удаляет большинство переменных окружения перед запуском команды, поэтому экспортированный вами прокси-сервер так и не доходит до неё. Для разового использования воспользуйтесь командой `sudo` с флагом, сохраняющим окружение, или, если вам нужно сделать это на постоянной основе, добавьте переменные прокси-сервера в список `env_keep` в файле `sudoers` с помощью команды `visudo`.
Применяются ли настройки сетевого прокси GNOME к терминалу?
Нет. Настройка прокси на рабочем столе действует только на приложения, которые считывают конфигурацию рабочего стола — GNOME Web и несколько других приложений GNOME. Утилиты терминала считывают переменные среды и совершенно не зависят от этой настройки. Установка этой настройки в надежде, что curl будет ей следовать, — одна из самых распространенных ошибок при работе с прокси в Linux.
Как настроить прокси для приложения, которое не поддерживает прокси?
Используйте proxychains — программу, которая перехватывает сетевые запросы приложения и направляет их через прокси-сервер, настройки которого задаются в отдельном конфигурационном файле. Это стандартный способ решения проблемы для программ, которые не читают ни переменные среды, ни собственные настройки прокси, и он работает как с SOCKS5, так и с HTTP.
Связанные руководства по мобильным прокси-серверам
Если ваш компьютер под Linux является сервером, а не настольным компьютером, белый список IP-адресов, как правило, является более подходящим вариантом аутентификации — в обзоре настроек описано, в каких случаях его следует предпочесть.
Руководства по настройке
Основные руководства по мобильным прокси-серверам
Настройте маршрутизацию вашего компьютера под Linux через IP-адрес реального провайдера
Специализированные модемы 4G/5G с неограниченной пропускной способностью и неограниченным количеством переключений — конечные точки HTTP(S) и SOCKS5 с белым списком IP-адресов для серверов со стабильным адресом.
Получить мобильный прокси