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

Далее расскажу как обойти ограничение скорости 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

Комментарии (60)


  1. black_list_man
    03.08.2024 09:01
    +1

     SocksDroid требует запуска при каждом включении телевизора, или есть какой-то автозапуск?


    1. foxyrus Автор
      03.08.2024 09:01

      Есть автозапуск


  1. Fox_exe
    03.08.2024 09:01
    +2

    Я так понял, тулза "Zapret" - это разновидность тулзы "GoodbyeDPI", только дополнена проксёй?


    1. foxyrus Автор
      03.08.2024 09:01

      Ага.


      1. foxyrus Автор
        03.08.2024 09:01

        *Встроенного прокси нет в zaprtet нет.


  1. rendov
    03.08.2024 09:01
    +10

    Главным условием является отдельная локальная Linux машина, на которой будет запущена утилита Zapret. 

    До сих пор не могу понять, зачем морочиться с обходом DPI провайдера такими методами, когда намного проще уже смириться с добавочным счетом в 500р/мес за какой-нибудь нидерландский VPS, на котором крутиться ShadowSocks + V2Ray. Клиенты для него есть и на андроид, и на винду, и на линукс. Я если честно, все эти замедления ютуба даже и не заметил, пока из новостей не прочел. И самое главное, щас то замедляют, а потом просто внесут в блок диапазон IP, и что делать будете?


    1. Intel_Google
      03.08.2024 09:01

      Иногда даже на своем vps скорость проседает до нескольких мегабит. Возможно как раз из-за притока клиентов.