Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия |
router:zapret [2025/02/04 21:23] – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1 | router:zapret [2025/09/27 22:24] (текущий) – mirocow |
---|
| ====== 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> |