Обход замедления для Android TV
Приветствую Хабр!
Далее расскажу как обойти ограничение скорости Youtube на Android TV. Найти универсальное решение «одной кнопкой» мне не удалось (ByeDPI не заработал), поэтому пойдем по сложному пути!
А роутера с OpenWrt у меня нет.
Главным условием является отдельная Linux машина, на которой будет запущена утилита Zapret. У меня это Mini PC с установленным Proxmox (на котором у меня дополнительно крутится умный дом HomeAssistant).
Если у вас уже есть Linux хост, то следующий шаг можно пропустить и сразу перейти к установке Zapret
Создание контейнера для Zapret на Proxmox
В консоли Proxmox проверяем командой доступные хосты pveam available
скачиваем образ легковесного Debian pveam download local debian-11-standard_11.7-1_amd64.tar.zst
Создаем LXC Container: я выделил 1 ядро, 1Гб оперативной памяти, 8Гб накопителя.
При создании необходимо обратить внимание на выбор образа, который скачали и в настройках сети установить DHCP
Скриншоты создания виртуальный машины
Установка Zapret и настройка
Пользуясь этой инструкций скачиваем и устанавливаем zapret.
cd /tmp
git clone --depth 1 https://github.com/bol-van/zapret
install_bin.sh
install_prereq.sh
Я выбираем настройку на основе iptables
Так как целью было только обойти замедление Youtube, пропускаем 6 пункт из оригинальной инструкции (запуск blockcheck.sh).
Запускаем install_easy.sh, я выбирал режим nfqws, в интерактивном режиме создаем конфиг.
Он сохранятся тут /opt/zapret/config
, настраиваем его в соответствии с инструкцией обхода замедления.
Важный параметр необходимо указать MODE_FILTER=hostlist
и в файл /opt/zapret/ipset/zapret-hosts-user.txt
добавить googlevideo.com
Мой конфиг (не копируйте его к себе, просто для примера)
this file is included from init scripts
# change values here
# can help in case /tmp has not enough space
#TMPDIR=/opt/zapret/tmp
# redefine user for zapret daemons. required on Keenetic
#WS_USER=nobody
# override firewall type : iptables,nftables,ipfw
FWTYPE=iptables
# options for ipsets
# maximum number of elements in sets. also used for nft sets
SET_MAXELEM=522288
# too low hashsize can cause memory allocation errors on low RAM systems , even if RAM is enough
# too large hashsize will waste lots of RAM
IPSET_OPT="hashsize 262144 maxelem $SET_MAXELEM"
# dynamically generate additional ip. $1 = ipset/nfset/table name
#IPSET_HOOK="/etc/zapret.ipset.hook"
# options for ip2net. "-4" or "-6" auto added by ipset create script
IP2NET_OPT4="--prefix-length=22-30 --v4-threshold=3/4"
IP2NET_OPT6="--prefix-length=56-64 --v6-threshold=5"
# options for auto hostlist
AUTOHOSTLIST_RETRANS_THRESHOLD=3
AUTOHOSTLIST_FAIL_THRESHOLD=3
AUTOHOSTLIST_FAIL_TIME=60
# 1 = debug autohostlist positives to ipset/zapret-hosts-auto-debug.log
AUTOHOSTLIST_DEBUGLOG=0
# number of parallel threads for domain list resolves
MDIG_THREADS=30
# ipset/*.sh can compress large lists
GZIP_LISTS=1
MODE=nfqws
# apply fooling to http
MODE_HTTP=0
# for nfqws only. support http keep alives. enable only if DPI checks for http request in any outgoing packet
MODE_HTTP_KEEPALIVE=0
# apply fooling to https
MODE_HTTPS=1
# apply fooling to quic
MODE_QUIC=1
# none,ipset,hostlist,autohostlist
MODE_FILTER=hostlist
# CHOOSE NFQWS DAEMON OPTIONS for DPI desync mode. run "nfq/nfqws --help" for option list
DESYNC_MARK=0x40000000
DESYNC_MARK_POSTNAT=0x20000000
#NFQWS_OPT_DESYNC="--dpi-desync=fake --dpi-desync-ttl=0 --dpi-desync-fooling=md5sig"
NFQWS_OPT_DESYNC="--dpi-desync=split2"
#NFQWS_OPT_DESYNC_HTTP=
#NFQWS_OPT_DESYNC_HTTPS="--dpi-desync=fake --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
#NFQWS_OPT_DESYNC_HTTP6=
#NFQWS_OPT_DESYNC_HTTPS6=
#NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake --dpi-desync-repeats=6"
#NFQWS_OPT_DESYNC_QUIC6=
NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake --dpi-desync-repeats=6"
# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list
TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3 --oob"
# openwrt only : donttouch,none,software,hardware
FLOWOFFLOAD=donttouch
# openwrt: specify networks to be treated as LAN. default is "lan"
#OPENWRT_LAN="lan lan2 lan3"
# openwrt: specify networks to be treated as WAN. default wans are interfaces with default route
#OPENWRT_WAN4="wan vpn"
#OPENWRT_WAN6="wan6 vpn6"
# for routers based on desktop linux and macos. has no effect in openwrt.
# CHOOSE LAN and optinally WAN/WAN6 NETWORK INTERFACES
# or leave them commented if its not router
# it's possible to specify multiple interfaces like this : IFACE_LAN="eth0 eth1 eth2"
# if IFACE_WAN6 is not defined it take the value of IFACE_WAN
#IFACE_LAN=eth0
#IFACE_WAN=
#IFACE_WAN6="ipsec0 wireguard0 he_net"
# should start/stop command of init scripts apply firewall rules ?
# not applicable to openwrt with firewall3+iptables
INIT_APPLY_FW=1
# firewall apply hooks
#INIT_FW_PRE_UP_HOOK="/etc/firewall.zapret.hook.pre_up"
#INIT_FW_POST_UP_HOOK="/etc/firewall.zapret.hook.post_up"
#INIT_FW_PRE_DOWN_HOOK="/etc/firewall.zapret.hook.pre_down"
#INIT_FW_POST_DOWN_HOOK="/etc/firewall.zapret.hook.post_down"
# do not work with ipv4
#DISABLE_IPV4=1
# do not work with ipv6
DISABLE_IPV6=1
# select which init script will be used to get ip or host list
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
# comment if not required
#GETLIST=
Перезапускаем сервис systemctl restart zapret
Автор zapret предлагает проверить обход замедления следующим способом:
curl -v4s -o/dev/null -k --connect-to ::google.com -k -H Host:\ metsalehti-staging-s4uzwwd6nq-lz.a.run.app https://test.googlevideo.com/app/uploads/2021/11/2022-mediakortti.pdf -w %{speed_download}
Но у меня это мгновенно возвращало (скорость) 0. В итоге я начал играться с параметрами и потерял очень много времени. Нужно было просто игнорировать проверку.
Настройка прокси для Android
Сначала решил поднять squid, забегая вперед, это было ошибкой; у Android есть встроенная поддержка proxy в настройках WIFI, но оказалось, что приложение Youtube игнорирует прокси, при том что другие приложения ходят в сеть через этот прокси.
Для Youtube это не работает
Чтобы я не делал, качество видео не повышалось, а в логах squid я не видел обращение к youtube, поэтому решил пойти другим путем, поднять socks5 прокси как VPN соединение, для сервера я выбрал Dante.
apt install dante-server
После установки нужно настроить сервер, идем /etc/danted.conf (это настройка только для внутренней сети).
internal: eth0 port = 1080
external: eth0
clientmethod: none #без авторизации
method: none #без авторизации
user.privileged: proxy
user.unprivileged: nobody
user.libwrap: nobody
client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
}
Перезапускаем systemctl restart danted
Добавляем в автозапуск systemctl enable danted
Если необходимо настроить авторизацию, то читаем тут.
Проверить работу socks прокси можно так
curl --proxy 'socks5h://IP_PROXY:1080' 'https://api.ipify.org/'
Теперь у нас на Debian крутится сервис zapret и sock5 прокси на порту 1080 без авторизации.
Остался последний шаг, установить прокси клиент на андроид, выбрал SocksDroid в нем указываем IP нашего прокси сервера, порт и при желании ограничиваем использование прокси только указанными приложениями (только Youtube).