Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
router:zapret [2025/02/04 21:23] – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1router:zapret [2025/09/27 22:24] (текущий) mirocow
Строка 1: Строка 1:
 +====== Zapret - DPI bypass multi platform Topics (NFQWS)  ======
  
 +  * [[:nfqws]]
 +===== Entware - Software repository =====
 +
 +<code bash>
 +$ amtm 
 + ep
 + /tmp/mnt/SYS
 +</code>
 +
 +===== Установка и настройка zapret =====
 +
 +https://github.com/bol-van/zapret
 +
 +<code bash>
 +$ 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
 +</code>
 +
 +  * **Выбираем 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
 +<code bash>
 +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
 +</code>
 +
 +<code bash>
 +$ echo '' > /opt/zapret/ipset/youtube_domain_list.txt
 +</code>
 +
 +=== Только для теста ===
 +
 +  * [[:config-default]]
 +
 +===== NWQWS_OPT =====
 +
 +<code>
 +--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.
 +
 +</code>
 +
 +===== Фильтры =====
 +
 +nano /opt/zapret/ipset/zapret-hosts-user.txt
 +<code>
 +www.youtube.com
 +youtube.com
 +</code>
 +
 +nano /opt/zapret/ipset/zapret-hosts-user-exclude.txt 
 +<code>
 +
 +</code>
 +
 +nano /opt/zapret/ipset/youtube_domain_list.txt
 +<code>
 +youtube.com
 +youtu.be
 +googlevideo.com
 +googleapis.com
 +ggpht.com
 +ytimg.com
 +youtube-nocookie.com
 +play.google.com
 +gstatic.com
 +googlevideo.com
 +ggpht.com
 +ytimg.com
 +l.google.com
 +youtube.com
 +www.youtube.com
 +play.google.com
 +youtubei.googleapis.com
 +youtu.be
 +nhacmp3youtube.com
 +googleusercontent.com
 +googleads.g.doubleclick.net
 +</code>
 +
 +nano /opt/zapret/ipset/zapret-ip-exclude.txt
 +<code>
 +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
 +</code>
 +
 +==== Скрипты ====
 +
 +  * [[:discord]]
 +
 +==== Отключение проверки контрольной суммы пакетов ====
 +
 +<code bash>
 +$ opkg install procps-ng-sysctl
 +</code>
 +
 +nano /opt/etc/init.d/S00fix
 +<code bash>
 +#!/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
 +</code>
 +
 +<code bash>
 +$ chmod +x /opt/etc/init.d/S00fix
 +</code>
 +
 +==== Запуск ====
 +
 +<code bash>
 +$ /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
 +</code>
 +
 +==== Автозапуск ====
 +
 +nano /jffs/scripts/firewall-start  
 +<code bash>
 +#!/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
 +</code>
 +
 +<code bash>
 +$ chmod +x /jffs/scripts/firewall-start
 +</code>