Как настроить прокси сервер на Android
Android позволяет настроить параметры прокси-сервера для каждой Wi-Fi сети. Иногда это требуется для доступа в Интернет для корпоративной или школьной сети, например. Ваш браузер будет отправлять трафик через настроенный прокси.
Настройки прокси будут использовать Google Chrome и другие браузеры, но не будут использоваться другими приложениями. Каждый разработчик Android приложения сам решает, будет ли приложение использовать прокси или нет. Это еще одна причина, почему лучше использовать VPN вместо прокси. С VPN Вы можете заставить все приложения передавать сетевой трафик через VPN-соединение. Это лучший способ, чтобы скрыть Ваш IP-адрес или открыть доступ к сайтам, которые недоступны в Вашей стране.
Этот процесс одинаков для всех современных версий Android, начиная с Android 4.0 до 7.1. Различные производители Android устройств могут изменить название настроек или переместить их в другое место, но в общем процесс одинаков.
Откройте Настройки и нажмите на пункт «Wi-Fi», чтобы открыть список всех доступных Wi-Fi сетей.
Нажмите и удерживайте на имени Wi-Fi сети для которой хотите изменить настройки. Нажмите «Изменить сеть» во всплывающем меню.
Если Вы еще не подключены к Wi-Fi сети, Вам необходимо подключиться к ней и ввести пароль чтобы получить доступ к варианту «Изменить сеть».
В этом меню откройте раздел «Расширенные настройки». Нажмите на «Прокси-сервер» и выберите либо «Нет», чтобы не использовать прокси, «Вручную», чтобы вручную ввести параметры прокси-сервера, или «Автоконфигурация прокси», чтобы автоматически обнаружить необходимые параметры для Вашей сети.
Опция «Автоконфигурация прокси» может быть недоступна в старых версиях Android.
Если Вы выберите «Автоконфигурация прокси», то Android предложит ввести адрес скрипта для автоконфигурации прокси, также известный как .PAC-файл.
В отличие от других операционных систем — Windows, MacOS или iOS, и даже Chrome OS, Android не поддерживает автоматическое обнаружение протокол прокси(WPAD).
В сети, использующей протокол WPAD, Вам придется либо указать ссылку на .PAC-файл или вручную ввести параметры прокси-сервера.
Если Вы выберите «Вручную», то сможете сами ввести настройки прокси-сервера. Введите адрес прокси в поле «Имя хоста прокси-сервера». Несмотря на название, Вы можете ввести как «proxy.example.com» или IP-адрес «192.168.1.100», например. Введите номер порта прокси-сервер в поле «Порт прокси-сервера».
Если Вы хотите не использовать прокси для каких либо адресов, то введите их в поле «Не использовать прокси-сервер для:» через запятую. Например, если Вы хотели бы получить доступ к android-example.ru и example.com напрямую, не используя прокси, Вам нужно было бы введите следующий текст в поле:
android-example.ru,example.com
Нажмите «Сохранить», чтобы сохранить настройки.
Каждая Wi-Fi сеть имеет собственные настройки прокси-сервера. Даже после включения прокси-сервера для одной Wi-Fi сети, другие Wi-Fi сети будут продолжать не использовать прокси-сервер по умолчанию. Повторите этот процесс, если Вам нужно изменить параметры прокси-сервера для другой Wi-Fi сети.
Wi-Fi через прокси без шума и пыли (почти)
Если раздать Wi-Fi через VPN задача простая и решаемая, вот даже статья «WiFi-портал в Россию» недавно вышла, то с прокси дело обстоит чуть сложнее, нужно немного костылей и напильников, а так же замечательное ПО под названием tun2socks.
Но, в отличие от VPN, прокси дешевле, и если нужно тестировать мобильные устройства с разных геолокаций — то прокси будет неплохим выходом. Конечно, существуют готовые решения, такие как Double SSH Tunnel Manager и Raspberry с прошивкой «Linux Mars», но мы, как водится, пойдём своим путём, да и готовые решения выше предназначены для другого.
Disclaimer. Статья пишется больше для себя, как заметки на полях, поэтому подробного мануала тут не будет. Тем не менее, материал может быть полезен и неограниченному кругу лиц, кто захочет реализовать самостоятельно. Понадобятся небольшие знания по сетям и линуксам.
Немного за технологию
Для работы с прокси будем использовать такую славную вещь, как tun2socks. На хабре уже была статья про это ПО (настоятельно рекомендую к ознакомлению), где рассказывается как настроить шлюз через прокси на Linux или Windows машине. Я же расскажу чуть подробнее, как настроить такой шлюз на роутере.
- Роутер на OpenWrt или роутер, который можно прошить в OpenWrt (я тестировал на незабвенном Tp-Link TL-MR3020 и на не менее незабвенном MikroTik hAP ac²). Помимо работы OpenWrt от роутера понадобится 128 и более мегабайт оперативной памяти и столько же места на внутреннем накопителе — или же возможность установить внешний.
- Под внешний накопитель вполне подойдёт обычная usb-флешка или sd-карточка минимального размера. Я экспериментировал с древней флешкой на 4гб. Для ценителей — usb-модем с sd-карточкой:)
- Прокси-провайдер (предпочтительнее socks5 c поддержкой udp)
- Немного свободного времени
Прошивка роутера
Берём нашу модель и идём на сайт OpenWrt, дальше смотрим-курим поддержку и мануалы по установке. Например, для hAP ac² применимы стандартные методы прошивки для микротиков — https://openwrt.org/toh/mikrotik/common
Подробно расписывать я не буду, но небольшая памятка-TL;DR для микротиков — копируем лицензионный ключ к себе (на всякий случай) выставляем приоритет загрузки на сеть, по BOOTP при помощи например tftp32 грузим sysupgrade.bin, затем при помощи вебморды или ssh+scp прошиваем уже ось initramfs.bin. Если понадобилось вернуть RouterOS, то можно это сделать через netinstall, или через утилиту командной строки rbcfg.
Считаем что роутер у нас перепрошит в OpenWrt. Для роутеров с небольшой внутренней памятью (16мб в hAP ac²!) понадобится перенос системы на внешнюю флешку. Инструкцией в сети полно, поэтому опять же кратенько:
- форматируем флешку — можно сделать сразу два раздела, под систему и swap. Под винду я использовал Minitool Partition Wizard. Выбор файловой системы — по вкусу, я вот взял ext4. По размерам — хватит минимального, я подкинул на swap 256мб, под систему — 1Гб
- ставим в OpenWrt нужные пакеты (роутер надо будет выпустить в инет):
opkg update opkg install block-mount kmod-usb-core kmod-usb2 kmod-usb-ohci kmod-usb-storage kmod-fs-ext4
- Ротуер в ребут, через dmseg можно проверить, что флешка нашлась. Формируем fstab, можно через block-detect (block detect >> /etc/config/fstab), приводим fstab примерно к такому виду (честно стянуто с инета):
config 'global' option anon_swap '0' option anon_mount '1' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' option from_fstab '1' config 'swap' option uuid 'b91e3bff-9e15-4fd0-82e7-25d75d889ce6' option enabled '1' config 'mount' option target '/overlay' option uuid '7ee9d192-239f-4401-b749-3fb60b4f8eaa' option fstype 'ext4' option options 'rw,sync' option enabled '1'
mkdir /mnt/sda2 mount /dev/sda2 /mnt/sda2 tar -C /overlay -cf - . | tar -C /mnt/sda2 -xf - umount /mnt/sda2 rm -rf /mnt/sda2
Теперь у нас есть роутер, на OpenWrt и с достаточным свободным местом. Едем дальше.
Магия tun2socks
Берём tun2socks под нужную нам платформу из гитхаба разработчика — https://github.com/xjasonlyu/tun2socks/releases. Например, для нашего hAP ac² нужна будет arm-архитектура. Я закинул бинарник сюда — /usr/bin/tun2socks
Ставим необходимые пакеты:
opkg update opkg install ip-full kmod-tun
Создаём таблицу маршрутизации (в неё будем пихать весь трафик, который хотим завернуть в прокси):
echo -e '\n300 tun2socks\n' >> /etc/iproute2/rt_tables
Формируем файл для init.d, чтобы tun2socks работал как сервис. У меня он вышел примерно такой (/etc/init.d/tun2socks):
#!/bin/sh /etc/rc.common START=90 USE_PROCD=1 #PROCD_DEBUG=1 #имя туннельного интерфейса tun_name='t2s0' #адрес туннельного интерфейса tun_ip='10.254.1.1' #самое главное - адрес прокси proxy='socks5://192.168.88.201:123456' loglevel='warn' #запускаем tun2socks tun2socks() < procd_open_instance procd_set_param command /usr/bin/tun2socks -device tun://$tun_name -proxy $proxy -loglevel $loglevel procd_close_instance >#правила iptables при старте rulesup()< iptables -t mangle -N tun2socks #отправляем всё, что с бриджа в прокси iptables -t mangle -I PREROUTING -i br-lan -j MARK --set-mark 3 #отправляем https трафик в прокси iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 3 #запускаем туннельный интерфейс ip tuntap add dev $tun_name mode tun ip addr add $/24 dev $tun_name ip link set dev $tun_name up #формируем таблицу маршрутизации ip route add default dev $tun_name table 300 ip rule add fwmark 3 lookup 300 #iptables -A forwarding_lan_rule -o $tun_name -j ACCEPT > #подчищаем правила, когда стопим сервис rulesdown() < ip rule del fwmark 3 lookup 300 iptables -t mangle -D PREROUTING -i br-lan -j MARK --set-mark 3 iptables -t mangle -D OUTPUT -p tcp --dport 443 -j MARK --set-mark 3 ip tuntap del dev $tun_name mode tun >start_service() < rulesup tun2socks >service_stopped()
Теперь можно включить и запустить сервис, и наслаждаться вайфаем через прокси (настройку собственно вайфая на OpenWrt тоже пожалуй оставим за кадром):
/etc/init.d/tun2socks enable /etc/init.d/tun2socks start
Из нюансов — для Tp-Link мне пришлось брать не самый свежий релиз tun2socks, свежий выпадал в ошибку. Зато если на роутере есть кнопка или переключатель — можно повесить на неё старт-стоп сервиса:) Для Tp-Link TL-MR3020 это может выглядеть, как скрипт /etc/hotplug.d/button/00-button :
#!/bin/sh if [ $ACTION == "released" ] ; then if [ $BUTTON == "BTN_1" ] ; then /etc/init.d/tun2socks stop #logger "Slider 3G" elif [ $BUTTON == "BTN_0" ] ; then /etc/init.d/tun2socks start #logger "Slider WISP" fi elif [ $BUTTON == "BTN_0" ] || [ $BUTTON == "BTN_1" ] ; then if grep -qe "sw1.*in hi" /sys/kernel/debug/gpio ; then if grep -qe "sw2.*in hi" /sys/kernel/debug/gpio ; then #logger "Slider AP" fi fi fi
В принципе всё, за некоторым исключением, про которое поговорим отдельно.
Утечка DNS
Внимательный читатель заметит, что я зачем-то кидаю https-трафик от роутера в прокси тоже. Делается это по причине, чтоб не «подтекал» DNS, что обнаруживается всякими прокси-детекторами. Конечно, DNS работает по UDP:53.. А вот DoH (DNS over HTTPS) нет.
Поэтому не забудем включить поддержку DoH на нашем роутере, поставив соответствующий пакет:
opkg update opkg install https-dns-proxy
В стандартных настройках используются DNS-серверы от Google и Cloudflare. Вы можете настроить на любой другой сервер, и, выбрав определённые IP серверов, маркировать трафик до них для отправки в прокси. Я же для простоты промаркировал весь https 🙂
Не хочу прошивать Микротик, он классный
С появлением RouterOS 7 и доработки функционала контейнеров в ней, можно и не сносить прекрасный RouterOS, а запихать tun2socks в контейнер. Оно работает, но с оговорками (поскольку создаётся tap-интерфейс, в процессе дебага может понадобится поребутать роутер). Контейнер можно приготовить на основе образа от разработчика — https://hub.docker.com/r/xjasonlyu/tun2socks , изменив в нём работу с таблицами маршрутизации и iptables по вкусу, и потом силами микротика и его nat (или route rule) отправлять нужный трафик в контейнер. Подробностей не будет, поскольку вариант хоть и занятный, но не каждый MikroTik умеет в контейнеры, да и задачу реализовывал ещё до поддержки контейнеров в ROS7, поэтому дальше так сказать MVP 🙂 реализовывать не стал.
Но если кому захочется — документация о работе с контейнерами — https://help.mikrotik.com/docs/display/ROS/Container, в общем случае понадобится одна переменная среды — PROXY. Из коробки работать не будет, нужно адаптировать образ, ну и конечно понадобится флешка под хранилище — куда без неё:)
Статья вышла немного сумбурной, но надеюсь может быть полезной кому-то, кроме меня. Удачного проксирования!