Обход замедления для 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Гб оперативной памяти (потом уменьшил до 512), 8Гб накопителя.

При создании необходимо обратить внимание на выбор образа, который скачали и в настройках сети установить DHCP

Скриншоты создания виртуальный машины
Нужно выбрать скаченный ранее образ Debian

Нужно выбрать скаченный ранее образ Debian

Тут нужно обратить внимание на выбор DHCP

Тут нужно обратить внимание на выбор 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

Мой конфиг (не копируйте его к себе, просто для примера)
# 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 это не работает

Для 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) — com.google.android.youtube.

Нагрузка при просмотре Youtube


ссылка на оригинал статьи https://habr.com/ru/articles/833508/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *