Zapret - DPI bypass multi platform Topics (NFQWS)

nfqws - Эта программа - модификатор пакетов и обработчик очереди NFQUEUE

Entware - Software repository

$ amtm ep /tmp/mnt/SYS

Установка и настройка zapret

https://github.com/bol-van/zapret

$ wget https://github.com/bol-van/zapret/releases/download/v71.4/zapret-v71.4.tar.gz $ tar -xvzf zapret-v71.4.tar.gz $ cd zapret-v71.4 $ ./install_easy.sh - Y - Y - Y - Y - 1 : iptables - Y - N - N - Y - N - 3 - br0 - 8 - eth3 - 3

Выбираем iptables

Выбираем имя внутреннего сетевого интерфейса (LAN), br0 - обычно в роутере

Выбираем режим фильтрации трафика (none, ipset, hostlist, autohostlist). - none

Режимы фильтрации

none - фильтрация отключена, весь трафик обрабатывается утилитой. Простейший вариант. Рекомендую его использовать, если не хотите заморачиваться настройкой списков адресов, а хотите просто, чтобы быстро и просто все работало.

ipset - фильтрация трафика с помощью ipset. Сложный режим, как работает читаем в инструкции.

hostlist - фильтрация списком хостов из файлов: /opt/zapret/ipset/zapret-hosts-user.txt - прописывайте свои домены, которые нужно обрабатывать или в файле/opt/zapret/ipset/zapret-hosts-user-exclude.txt - домены, которые нужно исключить из обработки. Пишется по одному доменному имени или IP-адресу на строчку. То что там изначально написано в файлах - удаляем. Рекомендую это режим использовать, если хотите обрабатывать только определенные адреса или наоборот если хотите исключить из обработки некоторые адреса.

autohostlist -режим hostlist + распознавание блокировок и ведение автоматического листа.

Режим фильтра также можно потом менять через параметр MODE_FILTER в /opt/zapret/config.

Текущие настройки

nano /opt/zapret/config

WS_USER=nobody FWTYPE=iptables SET_MAXELEM=1048576 IPSET_OPT="hashsize 262144 maxelem $SET_MAXELEM" IP2NET_OPT4="--prefix-length=22-30 --v4-threshold=3/4" IP2NET_OPT6="--prefix-length=48-64 --v6-threshold=3" AUTOHOSTLIST_RETRANS_THRESHOLD=3 AUTOHOSTLIST_FAIL_THRESHOLD=3 AUTOHOSTLIST_FAIL_TIME=30 AUTOHOSTLIST_DEBUGLOG=0 MDIG_THREADS=50 GZIP_LISTS=1 DESYNC_MARK=0x40000000 DESYNC_MARK_POSTNAT=0x20000000 TPWS_SOCKS_ENABLE=0 TPPORT_SOCKS=987 TPWS_SOCKS_OPT=" --filter-tcp=80 --methodeol <HOSTLIST> --new --filter-tcp=443 --split-pos=1,midsld --disorder <HOSTLIST> " TPWS_ENABLE=0 TPWS_PORTS=80,443 TPWS_OPT=" --filter-tcp=80 --methodeol --split-pos=2,midsld --hostlist=/opt/zapret/ipset/youtube_domain_list.txt --new --filter-tcp=443 --split-pos=2,midsld --disorder --hostlist=/opt/zapret/ipset/youtube_domain_list.txt " NFQWS_ENABLE=1 NFQWS_PORTS_TCP=80,443 NFQWS_PORTS_UDP=443 NFQWS_TCP_PKT_OUT=$((6+$AUTOHOSTLIST_RETRANS_THRESHOLD)) NFQWS_TCP_PKT_IN=3 NFQWS_UDP_PKT_OUT=$((6+$AUTOHOSTLIST_RETRANS_THRESHOLD)) NFQWS_UDP_PKT_IN=0 MODE_HTTP=1 MODE_HTTPS=1 MODE_QUIC=1 NFQWS_OPT=" # YouTube rules --filter-tcp=80 --dpi-desync=fake,multisplit --dpi-desync-ttl=1 --hostlist=/opt/zapret/ipset/youtube_domain_list.txt --new --filter-tcp=443 --dpi-desync=fake,multidisorder --dpi-desync-split-pos=1 --dpi-desync-ttl=1 --dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin --hostlist=/opt/zapret/ipset/youtube_domain_list.txt --new #--filter-udp=443 --dpi-desync=fake --dpi-desync-ttl=1 --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin --hostlist=/opt/zapret/ipset/youtube_domain_list.txt --filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 --dpi-desync-ttl=0 --dpi-desync-any-protocol --dpi-desync-cutoff=d4 --dpi-desync-fooling=md5sig,badsum --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin --hostlist=/opt/zapret/ipset/youtube_domain_list.txt # Main rules --filter-tcp=80,443 --dpi-desync=fake --dpi-desync-ttl=0 --filter-udp=443 --dpi-desync=fake --dpi-desync-ttl=0 " NFQWS_OPT_DESYNC="--dpi-desync=fake,disorder2 --dpi-desync-split-pos=1 --dpi-desync-ttl=0 --dpi-desync-fooling=md5sig,badsum --dpi-desync-repeats=6 --dpi-desync-any-protocol --dpi-desync-cutoff=d4 --dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin" NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake --dpi-desync-repeats=6 --dpi-desync-ttl=0 --dpi-desync-any-protocol --dpi-desync-cutoff=d4 --dpi-desync-fooling=md5sig,badsum --dpi-desync-fake-quic=/opt/zapret/files/fake/quic_initial_www_google_com.bin" MODE_FILTER=none FLOWOFFLOAD=disable IFACE_LAN=br0 IFACE_WAN=eth0 INIT_APPLY_FW=1 DISABLE_IPV6=0 DEBUGLOG=0
$ echo '' > /opt/zapret/ipset/youtube_domain_list.txt

Только для теста

config-default

NWQWS_OPT

--debug=0|1: 1 = выводить отладочные сообщения
--daemon: демонизировать программу
--pidfile=<file>: сохранить PID в файл
--user=<username>: менять uid процесса
--uid=uid[:gid]: менять uid процесса
--qnum=N: номер очереди N
--bind-fix4: пытаться решить проблему неверного выбора исходящего интерфейса для сгенерированных IPv4 пакетов
--bind-fix6: пытаться решить проблему неверного выбора исходящего интерфейса для сгенерированных IPv6 пакетов
--wsize=<winsize>[:<scale_factor>]: менять tcp window size на указанный размер в SYN,ACK. Если не задан scale_factor, то он не меняется (устарело)
--wssize=<winsize>[:<scale_factor>]: менять tcp window size на указанный размер в исходящих пакетах. По умолчанию scale_factor = 0 (см. conntrack)
--wssize-cutoff=[n|d|s]N: изменять server window size в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру меньше N
--ctrack-timeouts=S:E:F[:U]: таймауты внутреннего conntrack в состояниях SYN, ESTABLISHED, FIN, таймаут UDP. По умолчанию 60:300:60:60
--hostcase: менять регистр заголовка "Host:" по умолчанию на "host:"
--hostnospace: убрать пробел после "Host:" и переместить его в конец значения "User-Agent:" для сохранения длины пакета
--hostspell=HoST: точное написание заголовка Host (можно "HOST" или "HoSt"). Автоматом включает --hostcase
--domcase: домен после Host сделать таким: TeSt.cOm
--dpi-desync=[<mode0>,]<mode>[,<mode2>]: атака по десинхронизации DPI. mode: synack syndata fake fakeknown rst rstack hopbyhop destopt ipfrag1 disorder disorder2 split split2 ipfrag2 udplen tamper
--dpi-desync-fwmark=<int|0xHEX>: бит fwmark для пометки десинхронизирующих пакетов, чтобы они повторно не падали в очередь. По умолчанию = 0x40000000
--dpi-desync-ttl=<int>: установить TTL для десинхронизирующих пакетов
--dpi-desync-ttl6=<int>: установить IPv6 hop limit для десинхронизирующих пакетов. Если не указано, используется значение TTL
--dpi-desync-autottl=[<delta>[:<min>[-<max>]]]: режим auto TTL для IPv4 и IPv6. По умолчанию: 1:3-20. Delta=0 отключает функцию
--dpi-desync-autottl6=[<delta>[:<min>[-<max>]]]: переопределение предыдущего параметра для IPv6
--dpi-desync-fooling=<fooling>: дополнительные методики, как сделать, чтобы фейковый пакет не дошел до сервера. Варианты: none, md5sig, badseq, badsum, datanoack, hopbyhop, hopbyhop2
--dpi-desync-repeats=<N>: посылать каждый генерируемый в nfqws пакет N раз (не влияет на остальные пакеты)
--dpi-desync-skip-nosni=0|1: 1 (по умолчанию) = не применять dpi desync для запросов без hostname в SNI, в частности для ESNI
--dpi-desync-split-pos=<1..1500>: (только для split*, disorder*) разбивать пакет на указанной позиции
--dpi-desync-split-http-req=method|host: разбивка HTTP request на указанном логическом месте
--dpi-desync-split-tls=sni|sniext: разбивка TLS client hello на указанном логическом месте
--dpi-desync-split-seqovl=<int>: использовать sequence overlap перед первым отсылаемым оригинальным tcp сегментом
--dpi-desync-split-seqovl-pattern=<filename>|0xHEX: чем заполнять фейковую часть overlap
--dpi-desync-badseq-increment=<int|0xHEX>: инкремент sequence number для badseq. По умолчанию -10000
--dpi-desync-badack-increment=<int|0xHEX>: инкремент ack sequence number для badseq. По умолчанию -66000
--dpi-desync-any-protocol=0|1: 0 (по умолчанию) = работать только по HTTP request и TLS client hello, 1 = по всем непустым пакетам данных
--dpi-desync-fake-http=<filename>|0xHEX: файл, содержащий фейковый HTTP запрос для dpi-desync=fake, на замену стандартному www.iana.org
--dpi-desync-fake-tls=<filename>|0xHEX: файл, содержащий фейковый TLS client hello для dpi-desync=fake, на замену стандартному
--dpi-desync-fake-unknown=<filename>|0xHEX: файл, содержащий фейковый пейлоад неизвестного протокола для dpi-desync=fake, на замену стандартным 256 байт нулей
--dpi-desync-fake-syndata=<filename>|0xHEX: файл, содержащий фейковый пейлоад пакета SYN для режима десинхронизации syndata
--dpi-desync-fake-quic=<filename>|0xHEX: файл, содержащий фейковый QUIC Initial
--dpi-desync-fake-dht=<filename>|0xHEX: файл, содержащий фейковый пейлоад DHT протокола для dpi-desync=fake, на замену стандартным 64 байтам нулей
--dpi-desync-fake-unknown-udp=<filename>|0xHEX: файл, содержащий фейковый пейлоад неизвестного UDP протокола для dpi-desync=fake, на замену стандартным 64 байтам нулей
--dpi-desync-udplen-increment=<int>: насколько увеличивать длину UDP пейлоада в режиме udplen
--dpi-desync-udplen-pattern=<filename>|0xHEX: чем добивать UDP пакет в режиме udplen. По умолчанию – нули
--dpi-desync-start=[n|d|s]N: применять dpi desync только в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру больше или равно N
--dpi-desync-cutoff=[n|d|s]N: применять dpi desync только в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру меньше N
--hostlist=<filename>: применять дурение только к хостам из листа. Может быть множество листов, они объединяются. Пустой общий лист = его отсутствие
--hostlist-exclude=<filename>: не применять дурение к хостам из листа. Может быть множество листов, они объединяются
--hostlist-auto=<filename>: обнаруживать автоматически блокировки и заполнять автоматический hostlist (требует перенаправления входящего трафика)
--hostlist-auto-fail-threshold=<int>: сколько раз нужно обнаружить ситуацию, похожую на блокировку, чтобы добавить хост в лист (по умолчанию: 3)
--hostlist-auto-fail-time=<int>: все эти ситуации должны быть в пределах указанного количества секунд (по умолчанию: 60)
--hostlist-auto-retrans-threshold=<int>: сколько ретрансмиссий запроса считать блокировкой (по умолчанию: 3)
--hostlist-auto-debug=<logfile>: лог положительных решений по autohostlist. позволяет разобраться почему там появляются хосты.
--new: начало новой стратегии
--filter-l3=ipv4|ipv6: фильтр версии ip для текущей стратегии
--filter-tcp=[~]port1[-port2]: фильтр портов tcp для текущей стратегии. ~ означает инверсию. установка фильтра tcp и неустановка фильтра udp запрещает udp.
--filter-udp=[~]port1[-port2]: фильтр портов udp для текущей стратегии. ~ означает инверсию. установка фильтра udp и неустановка фильтра tcp запрещает udp.

Параметр / Комбинация	Возможная проблема
–dpi-desync=fake,multisplit & –dpi-desync=fake,multidisorder	Слишком агрессивные методы для TLS 1.2 могут нарушать стабильность соединения, что критично для Android-плееров и Smart TV.
–dpi-desync-split-pos=10	Слишком высокое значение может не работать для обхода и негативно влиять на производительность.
–dpi-desync-ttl=1 / –dpi-desync-ttl=0	Слишком низкий TTL может помешать пакетам достигать серверов Google, которые находятся "близко" к провайдеру, что приводит к сбоям
–dpi-desync-repeats=6	Может быть недостаточно для стабильного обхода, что приводит к подвисаниям YouTube на Android
Отсутствие –dpi-desync-fooling	Без ограничителей фейки могут применяться ко всем подключениям, ломая легитимные

Фильтры

nano /opt/zapret/ipset/zapret-hosts-user.txt

www.youtube.com
youtube.com

nano /opt/zapret/ipset/zapret-hosts-user-exclude.txt

nano /opt/zapret/ipset/youtube_domain_list.txt

10tv.app
1e100.net
7tv.app
7tv.gg
7tv.io
api.7tv.app
api.ffzap.com
api.frankerfacez.com
apis.google.com
betterttv.net
cdn.7tv.app
cdn.7tv.gg
cdn.betterttv.net
cdn.frankerfacez.com
cdn2.frankerfacez.com
doubleclick.net
emotes.7tv.app
events.7tv.app
frankerfacez.com
ggpht.com
googleapis.com
googleusercontent.com
googlevideo.com
gstatic.com
gvt1.com
jnn-pa.googleapis.com
l.google.com
m.youtube.com
nhacmp3youtube.com
play.google.com
static.7tv.app
video.google.com
wide-youtube.l.google.com
www.youtube.com
youtu.be
youtube.be
youtube.ca
youtube.co
youtube.co.in
youtube.co.uk
youtube.com
youtube.com.au
youtube.com.br
youtube.com.mx
youtube.com.tr
youtube.com.ua
youtube.de
youtube.es
youtube.fr
youtube.googleapis.com
youtube.jp
youtube.nl
youtube.pl
youtube.pt
youtube.ru
youtubeapi.com
youtubechildren.com
youtubecommunity.com
youtubecreators.com
youtubeeducation.com
youtubeembeddedplayer.googleapis.com
youtubei.googleapis.com
youtubekids.com
youtube-nocookie.com
youtube-studio.com
youtube-ui.l.google.com
yt.be
yt-video-upload.l.google.com
yt3.ggpht.com
ytimg.com

nano /opt/zapret/ipset/zapret-ip-exclude.txt

0.0.0.0/8
10.0.0.0/8
192.168.0.0/16
172.16.0.0/12
100.64.0.0/10
169.254.0.0/16
224.0.0.0/3
255.255.255.255/32

Скрипты

discord

Отключение проверки контрольной суммы пакетов

$ opkg install procps-ng-sysctl

nano /opt/etc/init.d/S00fix

#!/bin/sh start() { sysctl -w net.netfilter.nf_conntrack_checksum=0 &> /dev/null } stop() { sysctl -w net.netfilter.nf_conntrack_checksum=1 &> /dev/null } case "$1" in 'start') start ;; 'stop') stop ;; *) stop start ;; esac exit 0
$ chmod +x /opt/etc/init.d/S00fix

Запуск

$ /tmp/mnt/SYS/entware/zapret/ipset/get_refilter_domains.sh $ /opt/zapret/init.d/sysv/zapret restart $ /opt/etc/init.d/S00fix start $ iptables -S

Автозапуск

nano /jffs/scripts/firewall-start

#!/bin/sh sleep 10 logger "hostlist" "Update domains list" /tmp/mnt/SYS/entware/zapret/ipset/get_refilter_domains.sh logger "firewall" "Applying dpi-start rules" /opt/zapret/init.d/sysv/zapret restart /opt/etc/init.d/S00fix start
$ chmod +x /jffs/scripts/firewall-start