Это старая версия документа!
Zapret - DPI bypass multi platform Topics (NFQWS)
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-v72.2.tar.gz $ tar -xvzf zapret-v72.2.tar.gz $ cd zapret-v72.2 $ ./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
Только для теста
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
Скрипты
Отключение проверки контрольной суммы пакетов
$ 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