Как стать автором
Обновить

Обход замедления для Android TV

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров184K

Приветствую Хабр!

Далее расскажу как обойти ограничение скорости 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, в интерактивном режиме создаем конфиг.

Он сохранятся тут /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=

Автор 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

Добавляем в автозапуск systemctl enable danted

После установки нужно настроить сервер, идем /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 zapret

Перезапускаем systemctl restart danted

Проверить работу socks прокси можно так

curl --proxy 'socks5h://IP_PROXY:1080' 'https://api.ipify.org/'

UPD: Обновленная инструкция

Важный параметр необходимо указать MODE_FILTER=hostlist и в файл /opt/zapret/ipset/zapret-hosts-user.txt добавить:

googlevideo.com
ggpht.com
ytimg.com
l.google.com
youtube.com
play.google.com
youtubei.googleapis.com.
youtu.be
nhacmp3youtube.com
googleusercontent.com
gstatic.com
nhacmp3youtube.com
youtu.be

1e100.net

У zapret есть поддержка встроенного socks proxy, меняем конфиг /opt/zapret/config

MODE=tpws-socks
MODE_HTTP=0
MODE_HTTP_KEEPALIVE=0
MODE_HTTPS=1
MODE_QUIC=1
MODE_FILTER=hostlist
TPWS_OPT="ТУТ НУЖНО ПОИГРАТЬСЯ С ЛГОРИТМАМИ, ИНДИВИУАЛЬНО ДЛЯ ВАШЕГО ПРОВАЙДЕРА"
IFACE_LAN=eth0

перезапускаем Zapret

systemctl stop zapret

systemctl start zapret

Теперь у нас на Debian крутится сервис zapret и встроенный sock5 прокси на порту 988 без авторизации.

Остался последний шаг, установить прокси клиент на андроид, выбрал SocksDroid в нем указываем IP нашего прокси сервера, порт

Нагрузка на CPU\RAM

Теги:
Хабы:
Всего голосов 28: ↑26 и ↓2+29
Комментарии110

Публикации

Истории

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань