Справочник настроек прокси инструкции по программам

Как настроить прокси на Android: поля в параметрах Wi-Fi, приложения-клиенты, эмулятор и adb

Прокси на Android это адрес и порт посредника, которые операционная система хранит в свойствах конкретного сетевого подключения и раздаёт приложениям через объект настроек сети. Страница показывает, где эти поля лежат в оболочках разных производителей, что реально охватывает системная запись, как передать адрес эмулятору при запуске и командами adb, и как убедиться, что запросы приложения ушли через указанный порт.

Задачи, ради которых я это делаю, повторяются от проекта к проекту. Посмотреть, что мой собственный сервис отдаёт клиенту при заходе снаружи офисной сети. Проверить вёрстку мобильной веб-версии с внешнего адреса, когда локальный кэш и внутренние маршруты сбивают картину. Прогнать отладочную сборку приложения на эмуляторе так, чтобы все её запросы уходили через один известный порт и попадали в журнал.

1. Что понадобится

Поле для посредника в свойствах беспроводной сети есть во всех сборках начиная с Android 4.x, и с тех пор оно почти не менялось: адрес, порт, список исключений, отдельный пункт для файла автонастройки. Различаются только названия разделов в оболочках. Стандартный Android и Pixel называют раздел «Сеть и интернет», Samsung One UI пишет «Подключения», Xiaomi HyperOS и MIUI прячут пункт под «Wi-Fi» и «Дополнительные настройки», Huawei EMUI использует «Беспроводные сети». Сам экран правки сети везде одинаковый.

Нужна строка подключения. Поставщики отдают её двумя видами: IP:PORT и IP:PORT:LOGIN:PASS. Первый вид означает авторизацию по привязанному внешнему адресу вашего канала, второй по паре логина и пароля. Разница здесь важнее, чем на настольной системе: системные поля Wi-Fi принимают только адрес с портом, места под логин и пароль в них нет вовсе. Значит для системной записи берётся привязка по адресу, а пара логина с паролем понадобится в приложении-клиенте либо в эмуляторе.

Все примеры я пишу на адресе 198.51.100.23, порт 8888 для HTTP и порт 1080 для SOCKS5. Подставляйте свои значения, структуру строк при этом менять не нужно.

Мой рабочий пул отдаёт список ссылкой сразу в обоих форматах, поэтому строку я вставляю в поля копированием и разбираю руками только двоеточия. Под телефон и планшет я держу адреса IPv4 с выгрузкой списка ссылкой: в пакет входят две привязки, менять их в кабинете можно свободно, включение пакета занимает около 5 минут, трафик безлимитный на всех сроках доступа.

Для раздела про эмулятор и adb понадобится Android SDK Platform Tools на компьютере. Проверьте, что каталог с adb и emulator попал в переменную PATH, иначе команды придётся вызывать полным путём.

2. Прокси в параметрах сети Wi-Fi поле за полем

Откройте «Настройки», раздел «Сеть и интернет», пункт «Интернет». В списке сетей нажмите значок шестерёнки справа от активной сети. Откроется карточка сети с кнопкой карандаша либо пунктом «Изменить» в меню из трёх точек. Разверните блок «Дополнительно» или «Расширенные настройки»: там и лежит выпадающий список «Прокси-сервер».

Список даёт три значения: «Нет», «Вручную», «Прокси-авто-конфигурация». Выберите «Вручную», и под списком развернутся три поля.

Поле экранаЧто вноситьЧто ломается при ошибке
«Имя хоста прокси-сервера»Только адрес или имя хоста: 198.51.100.23Схема http:// в этом поле даёт отказ на первом же запросе
«Порт»Число: 8888Порт скопирован вместе с двоеточием, поле принимает лишь цифры
«Не использовать прокси-сервер для»Хосты через запятую, звёздочка допустима слеваЗаписи разделены пробелами, весь список читается как один хост
«URL-адрес PAC» при выборе автоконфигурацииПолный адрес файла со схемойУказан путь к файлу на диске, система его не читает
Кнопка «Сохранить»Нажимается обязательноПоля заполнены, экран закрыт кнопкой «Назад», запись потеряна

Синтаксис исключений отличается от настольных систем. Разделителем служит запятая без пробела, маски вида 192.168.0.0/16 экран не понимает, звёздочка ставится только в начале имени.

localhost,127.0.0.1,*.internal.lan,10.0.2.2,staging.example.org

Кнопка «Сохранить» применяет запись мгновенно и без перезагрузки. Chrome и другие браузеры подхватят её на следующем запросе, приложения на своих сетевых клиентах после перезапуска процесса.

Три момента, которые я проверяю каждый раз. Первый: запись живёт внутри профиля сети, поэтому кнопка «Удалить эту сеть» стирает её вместе с паролем от Wi-Fi. Второй: на сетях с порталом авторизации экран правки открывается только после успешного входа, до этого поля серые. Третий: часть оболочек показывает выпадающий список посредника лишь при подключённой сети, поэтому сохранённая, но неактивная сеть правке не поддаётся.

Отдельно про режим автоконфигурации. Значение «Прокси-авто-конфигурация» принимает адрес файла с функцией FindProxyForURL, система скачивает его при подключении к сети и кэширует. Работает он у меня стабильно в стандартном Android и капризничает в сторонних оболочках: часть прошивок читает файл один раз и держит устаревшую копию до переподключения к сети. Ручной ввод предсказуемее, поэтому на телефонах я обычно оставляю «Вручную».

3. Что охватывает системная запись Wi-Fi и где проходит её граница

Здесь начинается главное ограничение, ради которого пишется половина этой страницы. Системная запись даёт меньше, чем ожидает большинство пришедших к ней людей, и знать её границы стоит до того, как вы начнёте искать причину странного поведения приложения.

Ограничение состоит из двух частей. Первая: настройка привязана к профилю конкретной беспроводной сети. Телефон ушёл в другую сеть, и посредника у него уже нет. Заполнять поля придётся отдельно для домашней сети, отдельно для офисной, отдельно для точки доступа с ноутбука. Ушли из зоны Wi-Fi на прогулку, телефон переключился на сотовую сеть, и все проверки с этой минуты идут с обычного адреса.

Вторая часть тоньше. Система кладёт адрес и порт в объект сети, читают этот объект далеко не все приложения. Подчиняются те, кто ходит наружу через стандартные механизмы платформы: WebView, классы java.net, надстройки над ними. Приложение со своим сетевым кодом на голых сокетах записи не видит вовсе, и трафик у него идёт напрямую при полностью заполненных полях. Подробный разбор с перечнем библиотек я вынес ниже, после раздела про adb, потому что глобальная запись из моста подчиняется тем же правилам.

Порт для системной записи подбирается по одному признаку: он обязан принимать и обычные запросы, и метод CONNECT, которым браузер строит туннель к сайтам по HTTPS. Без второго режима откроются простые страницы, а всё с замком в адресной строке начнёт отдавать отказ. Я держу под мобильные проверки приватные прокси на собственном оборудовании, где оба режима на порту разрешены и строка выдаётся в готовом виде.

4. Почему у передачи данных по сотовой сети своего поля для посредника нет

Открываете настройки при выключенном Wi-Fi и не находите знакомого выпадающего списка. Это ожидаемое поведение, и причина в устройстве платформы.

Android описывает каждое подключение объектом сети со своим набором свойств. Беспроводная сеть создаётся вашими руками: вы вводите пароль, правите профиль, наполняете его свойства значениями. Подключение по сотовой сети создаётся по профилю точки доступа, который приходит от оператора связи и обслуживается системой автоматически. Свойства такого подключения заполняет оператор, экрана правки посредника платформа для него не рисует.

Формально поля есть внутри самой точки доступа: экран «Мобильная сеть», пункт «Точки доступа APN», карточка профиля, строки «Прокси-сервер» и «Порт». Три обстоятельства делают этот путь бесполезным для наших задач. Профили от крупных операторов часто помечены как защищённые от правки, и поля в них серые. На аппаратах с прошивкой оператора экран APN может быть скрыт целиком. И даже когда правка проходит, значение попадает в шлюз оператора и переживает первое же обновление профиля.

Работающий путь на сотовой сети ровно один: приложение-клиент, которое поднимает на телефоне виртуальный сетевой интерфейс и уводит трафик в него. Такой интерфейс перекрывает маршрут по умолчанию и не зависит от того, через что телефон вышел наружу. Тот же приём закрывает и вторую половину ограничения: клиент забирает соединения приложений, которые системную запись игнорируют.

5. Приложения-клиенты и что они дают сверх системной записи

Клиент регистрируется в системе как поставщик виртуальной частной сети через VpnService, получает от платформы туннельный интерфейс и таблицу маршрутов, разбирает пакеты и пересылает содержимое TCP-соединений на ваш порт SOCKS5 или HTTP. Права суперпользователя для этого не нужны, разрешение выдаётся один раз системным окном, дальше в строке состояния висит значок ключа.

Что даёт клиентКак выглядит в интерфейсе
Пара логина и пароляОтдельные поля рядом с адресом и портом
Работа на сотовой сети и при смене Wi-FiМаршрут перекрывается на уровне устройства, профиль сети роли не играет
Захват приложений со своим сетевым кодомПакеты забираются с туннельного интерфейса до сокетов приложения
Разделение по приложениямСписок установленных программ с галочками, режим «только выбранные»
Свои имена и обход по спискамПоле адреса сервера имён и текстовое поле правил
Несколько сохранённых портовИменованный список профилей с переключателем

Схему SOCKS5 клиенты держат как основную, и на телефоне у неё есть заметное преимущество: она принимает любой TCP и передаёт имя хоста на сторону посредника, поэтому запросы к службе имён остаются внутри туннеля. Под приложения-клиенты я беру порт SOCKS5 с удалённым разрешением имён и в самом клиенте оставляю поле собственного сервера имён пустым.

Ограничение у клиента одно: система отдаёт слот виртуальной сети единовременно только одной программе. Второй клиент при запуске покажет системное окно и перехватит слот у первого. При отладке я держу на устройстве один клиент и переключаю профили внутри него.

Разделение по приложениям заслуживает отдельного слова, потому что именно оно превращает клиент в отладочный инструмент. Включаете режим «только выбранные», отмечаете галочкой одну свою сборку и получаете картину, где через порт идёт ровно она. Остальной телефон продолжает жить в обычной сети. Обновления магазина и почта в журнал порта уже не попадают, и каждая строка там соответствует действию в приложении.

6. Эмулятор Android на компьютере и передача адреса через параметры запуска

Виртуальное устройство из Android Studio получает параметры посредника на уровне самого эмулятора, до операционной системы внутри. Это удобнее, чем поля Wi-Fi внутри гостя: перехватывается весь трафик виртуальной машины, включая запросы приложений со своим сетевым кодом.

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

emulator -list-avds
emulator -avd Pixel_6_API_34 -http-proxy http://198.51.100.23:8888
emulator -avd Pixel_6_API_34 -http-proxy http://login:parol@198.51.100.23:8888
emulator -avd Pixel_6_API_34 -http-proxy http://198.51.100.23:8888 -dns-server 1.1.1.1 -no-snapshot-load

Разберу ключи по порядку. Команда emulator -list-avds печатает имена созданных устройств, их же показывает диспетчер устройств в Android Studio. Ключ -avd выбирает устройство по имени. Ключ -http-proxy задаёт посредника для сетевого слоя виртуальной машины. Ключ -dns-server пригождается, когда гость не разрешает имена: эмулятор берёт службу имён у хоста, и в корпоративной сети она отвечает не тем, что ожидает гость. Ключ -no-snapshot-load поднимает устройство с начального состояния, иначе восстановление снимка возвращает и старые сетевые параметры.

Пароль в командной строке видно в списке процессов, поэтому на общей машине я задаю параметры вторым путём. Нажмите три точки справа от окна эмулятора, откройте «Extended controls», раздел «Settings», вкладку «Proxy». Снимите галочку «Use Android Studio HTTP proxy settings», отметьте «Manual proxy configuration», заполните «Host name», «Port name», при необходимости «Proxy authentication» с парой логина и пароля. Нажмите «Apply». Строка состояния прямо под полями напишет «Proxy status: Success» либо назовёт причину отказа.

Внутри гостя работает особый адрес 10.0.2.2, за которым стоит петлевой интерфейс хост-машины. Он выручает, когда посредник или отладочный сервер подняты прямо на компьютере: в поля гостя вносится 10.0.2.2 с нужным портом, и трафик уходит на хост. Адрес 10.0.2.3 указывает на службу имён хоста, 10.0.2.15 это адрес самого гостя внутри виртуальной сети. Эти три записи я держу в памяти, они экономят время при каждом разборе.

Есть тонкость с сертификатами. Когда порт разворачивает HTTPS для просмотра содержимого запросов, гостю нужен сертификат в системном хранилище, и с Android 7 пользовательские сертификаты приложениям недоступны без правки конфигурации сетевой безопасности. Для отладочной сборки достаточно добавить в манифест ссылку на network_security_config с разрешением пользовательских сертификатов. Для образов без Google Play доступен запуск с ключом -writable-system и запись сертификата в системный раздел.

7. Отладка через adb и проброс настроек на устройство

Мост отладки даёт то, чего нет в графических экранах: глобальную запись посредника, которая переживает смену сети и действует до явной отмены. Пишется она в таблицу системных настроек и требует разрешения WRITE_SECURE_SETTINGS, которое как раз и выдаётся оболочке adb.

adb devices -l
adb shell settings put global http_proxy 198.51.100.23:8888
adb shell settings get global http_proxy
adb shell settings put global http_proxy :0
adb shell settings delete global http_proxy

Первая команда печатает подключённые устройства вместе с моделью: физический телефон виден по серийному номеру, виртуальное устройство под именем вида emulator-5554. Вторая записывает адрес с портом. Схема в этой строке не пишется, только адрес и порт через двоеточие. Третья читает записанное значение обратно, ею я всегда сверяю результат. Четвёртая снимает посредника специальным пустым значением :0, и это надёжнее удаления ключа: часть прошивок кэширует старое значение до перезагрузки. Пятая удаляет запись насовсем.

Когда устройств больше одного, адресуйте нужное ключом -s. Полезны и остальные команды ниже.

adb -s emulator-5554 shell settings put global http_proxy 10.0.2.2:8888
adb connect 192.168.1.42:5555
adb reverse tcp:8888 tcp:8888
adb shell settings list global
adb shell dumpsys connectivity
adb shell am start -a android.settings.WIFI_SETTINGS
adb logcat -s OkHttp:V

Команда adb connect подключает телефон по сети без кабеля, порт 5555 открывается пунктом «Отладка по Wi-Fi» в настройках разработчика. Команда adb reverse пробрасывает порт компьютера на устройство через канал отладки: телефон обращается к 127.0.0.1:8888 и попадает на порт хост-машины. Приём выручает на физическом устройстве, когда посредник поднят локально и наружу не смотрит. Команда settings list global печатает всю таблицу, я фильтрую её поиском по подстроке proxy. Вывод dumpsys connectivity показывает объект сети со свойствами, включая действующего посредника и исключения. Последняя команда открывает экран Wi-Fi одним нажатием, удобно при работе через удалённый экран.

Порядок применения между двумя записями стоит запомнить: глобальная запись из adb перекрывает поля профиля Wi-Fi. Заполненные поля на экране сети при этом никуда не деваются и вводят в заблуждение при разборе. Столкнувшись с расхождением, я первым делом читаю settings get global http_proxy и только затем смотрю на экран.

8. Приложения, которые ходят в обход системной настройки

Теперь обещанный перечень. Он одинаково относится и к полям профиля Wi-Fi, и к глобальной записи из adb: обе кладут параметры в один объект сети, и разница только в том, на скольких подключениях этот объект действует.

Что делает запросЧитает системную настройкуЗамечание
WebView внутри приложенияДаОбновление приходит широковещательным событием, окно перезапускать не нужно
Chrome и браузеры на движке ChromiumДаСобственный сетевой стек берёт параметры у платформы
HttpURLConnection и классы java.netДаЧитаются системные свойства http.proxyHost и http.proxyPort
OkHttp и Retrofit со значениями по умолчаниюДаРаботают через ProxySelector.getDefault()
React Native на AndroidДаСетевой слой построен поверх того же OkHttp
Cronet и встроенные библиотеки GoogleЧастичноЧасть сборок настраивается собственным объектом конфигурации
Клиент на Dart внутри FlutterНетHttpClient.findProxy подключается разработчиком вручную
Игровые движки и сетевой код на сокетахНетСоединение открывается напрямую, минуя платформенные классы
gRPC поверх своего каналаНетКанал создаётся с адресом узла и списком посредников не пользуется
Push-канал и служебные сервисыНетДержат постоянное соединение своим путём
Трафик поверх UDP, включая QUICНетHTTP-посредник обслуживает TCP
Пинг и трассировкаНетICMP через порт не проходит по устройству протокола

Отсюда простое следствие для отладки: приложение, которое вы проверяете, обязано быть собрано на стандартных сетевых классах платформы либо принимать параметры посредника через свои настройки. Когда ни того ни другого нет, системная запись остаётся без действия, и в работу идут два пути из разделов выше. Приложение-клиент с виртуальным интерфейсом забирает пакеты до сокетов программы, поэтому её сетевой код обойти маршрут уже не может. Эмулятор с ключом -http-proxy перехватывает трафик на уровне виртуальной машины, ещё до гостевой системы.

Признак, по которому я быстро отличаю один случай от другого, такой. Браузер телефона показывает внешний адрес порта, экран вашего приложения показывает домашний адрес. Значит настройка внесена верно и дело в сетевом коде программы. Оба экрана показывают домашний адрес, значит ошибка в самих полях, и разбор начинается с команды settings get global http_proxy.

9. Проверка после настройки

Первый шаг это сверка внешнего адреса. Откройте в браузере телефона страницу определения адреса, запомните значение, затем переключите посредника в «Нет» и обновите страницу. Значения обязаны различаться. Совпали, значит запрос ушёл мимо посредника, и причину я ищу в порядке из следующих шагов.

Второй шаг: прочитать, что реально записано в системе.

adb shell settings get global http_proxy
adb shell dumpsys connectivity
curl -x http://198.51.100.23:8888 https://api.ipify.org
curl -x socks5h://198.51.100.23:1080 https://api.ipify.org

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

Третий шаг самый важный: убедиться, что через посредник идут запросы именно вашего приложения. Браузер подчиняется настройке почти всегда, приложение далеко не всегда, и радоваться правильному адресу в браузере рано.

Я делаю это тремя способами, по возрастанию точности. Способ первый: журнал на стороне порта. Откройте один экран приложения, который обращается к вашему интерфейсу программирования, и найдите в журнале строку с этим доменом и временем нажатия. Способ второй: сравнение ответов. Приложение получает от вашего сервиса разный вывод при заходе изнутри и снаружи, и достаточно посмотреть на экран. Способ третий: журнал самого приложения. Отладочная сборка с включённым перехватчиком OkHttp печатает адрес и заголовки каждого запроса, вывод читается командой adb logcat с фильтром по тегу.

Четвёртый шаг: проверка заголовков, которые видит сервер. Страницы проверки печатают присланные заголовки списком. Записи Via и X-Forwarded-For говорят, что порт сообщает серверу о посреднике и о вашем исходном адресе. Для проверок мобильной веб-версии я подставляю анонимные адреса для мобильных проверок и повторяю вывод той же страницы, чтобы список заголовков стал коротким.

Пятый шаг для сомнительных случаев: снять картину без телефона вовсе. Виртуальное устройство с ключом -http-proxy даёт повторяемый прогон, где посредник перехватывает всё, включая запросы приложений со своим сетевым кодом. Расхождение между эмулятором и физическим аппаратом почти всегда указывает на приложение, которое читает настройки платформы избирательно.

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

10. Разбор ошибок

Сообщение или признакПричинаЧто делать
ERR_PROXY_CONNECTION_FAILED в ChromeПорт закрыт, адрес с опечаткой либо привязка внешнего адреса слетелаПовторить запрос командой curl -x с компьютера, сверить привязку в кабинете
ERR_TUNNEL_CONNECTION_FAILED на сайтах с замкомПорт принимает обычные запросы и отклоняет метод CONNECTВзять порт с разрешённым HTTPS, проверить вкладкой с замком
Кнопка «Сохранить» сераяПорт пустой либо в имени хоста осталась схема http://Оставить в поле хоста только адрес, порт вписать цифрами
Настройка исчезла после переподключенияСеть была удалена кнопкой «Удалить эту сеть»Ввести пароль от Wi-Fi заново и заполнить поля посредника
Браузер идёт через порт, приложение напрямуюПриложение собрано на своих сокетах и запись платформы не читаетПоднять приложение-клиент с виртуальным интерфейсом либо прогнать на эмуляторе
Экран правки сети не открываетсяСеть сохранена, но неактивна, либо на ней висит портал авторизацииПодключиться к сети, пройти портал, затем править профиль
Выпадающего списка посредника нет вовсеОткрыт экран сотовой сети, поля посредника там нетНастроить беспроводную сеть либо перейти к клиенту с туннелем
Поля в карточке APN серыеПрофиль оператора помечен защищённым от правкиПерейти к клиенту с туннелем, правка APN этой задачи не закрывает
Значение из adb перекрывает поля экранаЗаписана глобальная настройка, она приоритетнее профиля сетиСнять её командой settings put global http_proxy :0
adb: no devices/emulators foundОтладка по USB выключена либо не подтверждён отпечаток компьютераВключить отладку в меню разработчика, подтвердить окно на экране телефона
Эмулятор поднялся со старыми параметрамиЗагрузился сохранённый снимок состоянияДобавить ключ -no-snapshot-load либо стереть данные устройства
Proxy status в Extended controls показывает отказПара логина и пароля не подошла к портуСверить третью и четвёртую части строки IP:PORT:LOGIN:PASS
Имена сайтов не разрешаются в эмулятореГость взял службу имён у хоста, и она отвечает по-своемуЗапустить с ключом -dns-server и публичным адресом службы имён
Приложение отдаёт ошибку сертификатаПорт разворачивает HTTPS, а сертификат лежит в пользовательском хранилищеПрописать network_security_config в отладочной сборке
Часть трафика идёт мимо при работающем клиентеВключён режим выбора приложений, нужная программа без галочкиОтметить программу в списке либо перейти в режим захвата всех
Пинг проходит без посредникаICMP через HTTP-порт не идёт по устройству протоколаПроверять доступность запросом по HTTP, не пингом

Остальные части справочника разбирают ту же задачу на других устройствах: параметры на уровне операционной системы собраны в статье про системные настройки прокси в Windows 11, собственный сетевой стек браузера с профилями описан в материале про параметры соединения в Firefox, правила переключения по доменам разобраны в инструкции про профили расширения SwitchyOmega. Когда с телефона нужно перейти к нескольким изолированным окружениям на компьютере, смотрите разбор настройки прокси в BitBrowser.