Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
nfqws [2025/02/03 00:10] mirocownfqws [2025/02/04 23:19] (текущий) mirocow
Строка 1: Строка 1:
-====== Zapret DPI bypass multi platform Topics (NFQWS)  ======+====== nfqws Эта программа - модификатор пакетов и обработчик очереди NFQUEUE ======
  
-https://github.com/bol-van/zapret+Эта программа модификатор пакетов и обработчик очереди NFQUEUE.
  
-<code bash> +Для BSD систем существует адаптированный вариант - dvtws, собираемый из тех же исходников.
-./install_easy.sh +
-</code>+
  
-{{:network:7e86e3fac7f44f9d13c3a737d882a845.jpg?600|}} 
- 
-Выбираем имя внутреннего сетевого интерфейса (LAN), br0 - обычно в роутере: 
- 
-{{:network:7e777b8bf042462347c3d9ff20170beb.jpg?600|}} 
- 
-Но заворот трафика на nfqws происходит всегда после маршрутизации, поэтому к нему применима только фильтрация по WAN, так что LAN в этом режиме работы неважен. 
- 
-<note tip>Важно: выбираем режим фильтрации трафика (none, ipset, hostlist, autohostlist).</note> 
- 
-  * 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/ipset/zapret-hosts-user.txt 
 <code> <code>
-www.youtube.com + --debug=0|1 ; 1=выводить отладочные сообщения 
-youtube.com+ --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 fake fakeknown rst rstack hopbyhop destopt ipfrag1 disorder disorder2 split split2 ipfrag2 udplen tamper 
 + --dpi-desync-fwmark=<int|0xHEX>        ; бит fwmark для пометки десинхронизирующих пакетов, чтобы они повторно не падали в очередь. default = 0x40000000 
 + --dpi-desync-ttl=<int>                  ; установить ttl для десинхронизирующих пакетов 
 + --dpi-desync-ttl6=<int>                ; установить ipv6 hop limit для десинхронизирующих пакетов. если не указано, используется значение ttl 
 + --dpi-desync-fooling=<fooling> ; дополнительные методики как сделать, чтобы фейковый пакет не дошел до сервера. none md5sig badseq badsum hopbyhop hopbyhop2 
 + --dpi-desync-retrans=0|1                ; (только для fake,rst,rstack) 0(default)=отправлять оригинал следом за фейком  1=дропать оригинал, заставляя ОС выполнять ретрансмиссию через 0.2 сек 
 + --dpi-desync-repeats=<N>                ; посылать каждый генерируемый в nfqws пакет N раз (не влияет на остальные пакеты) 
 + --dpi-desync-skip-nosni=0| 1 ; 1(default)=не применять dpi desync для запросов без hostname в SNI, в частности для ESNI 
 + --dpi-desync-split-pos=<1..1500> ; (только для split*, disorder*) разбивать пакет на указанной позиции 
 + --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(default)=работать только по http request и tls clienthello  1=по всем непустым пакетам данных 
 + --dpi-desync-fake-http=<filename>|0xHEX ; файл, содержащий фейковый http запрос для dpi-desync=fake, на замену стандартному w3.org 
 + --dpi-desync-fake-tls=<filename>|0xHEX         ; файл, содержащий фейковый tls clienthello для dpi-desync=fake, на замену стандартному w3.org 
 + --dpi-desync-fake-unknown=<filename>|0xHEX ; файл, содержащий фейковый пейлоад неизвестного протокола для dpi-desync=fake, на замену стандартным нулям 256 байт 
 + --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-cutoff=[n|d|s]N                   ; применять dpi desync только в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру меньше N 
 + --hostlist=<filename>         ; применять дурение только к хостам из листаможет быть множество листов, они обьединяютсяпустой обший лист = его отсутствие 
 + --hostlist-exclude=<filename>         ; не применять дурение к хостам из листаможет быть множество листов, они обьединяютс
 </code> </code>
- 
-nano /opt/zapret/init.d/sysv/zapret 
-<code bash> 
-#!/bin/sh 
-### BEGIN INIT INFO 
-# Provides: zapret 
-# Required-Start: $local_fs $network 
-# Required-Stop: $local_fs $network 
-# Default-Start:     2 3 4 5 
-# Default-Stop:      0 1 6 
-### END INIT INFO 
- 
-SCRIPT=$(readlink -f "$0") 
-EXEDIR=$(dirname "$SCRIPT") 
-ZAPRET_BASE=$(readlink -f "$EXEDIR/../..") 
-. "$EXEDIR/functions" 
- 
-NAME=zapret 
-DESC=anti-zapret 
- 
-do_start() 
-{ 
- 
-   if lsmod | grep "xt_multiport " &> /dev/null ;  then 
- echo "xt_multiport.ko is already loaded" 
-    else 
-        if insmod /lib/modules/$(uname -r)/xt_multiport.ko &> /dev/null; then 
- echo "iptable_raw.ko loaded" 
-        else 
- echo "Cannot find xt_multiport.ko kernel module, aborting" 
- #exit 1 
-        fi 
- fi 
- 
- if lsmod | grep "xt_connbytes " &> /dev/null ;  then 
-        echo "xt_connbytes.ko is already loaded" 
-    else 
-        if insmod /lib/modules/$(uname -r)/xt_connbytes.ko &> /dev/null; then 
- echo "xt_connbytes.ko loaded" 
-        else 
- echo "Cannot find xt_connbytes.ko kernel module, aborting" 
- #exit 1 
-        fi 
- fi 
- 
- if lsmod | grep "xt_NFQUEUE " &> /dev/null ;  then 
-        echo "xt_NFQUEUE.ko is already loaded" 
-    else 
-        if insmod /lib/modules/$(uname -r)/xt_NFQUEUE.ko &> /dev/null; then 
-            echo "xt_NFQUEUE.ko loaded" 
-        else 
-            echo "Cannot find xt_NFQUEUE.ko kernel module, aborting" 
-            #exit 1 
-        fi 
-    fi 
- 
- zapret_run_daemons 
- [ "$INIT_APPLY_FW" != "1" ] || { zapret_apply_firewall; } 
-} 
-do_stop() 
-{ 
- zapret_stop_daemons 
- [ "$INIT_APPLY_FW" != "1" ] || zapret_unapply_firewall 
-} 
- 
-case "$1" in 
- start) 
- do_start 
- ;; 
- 
- stop) 
- do_stop 
- ;; 
- 
- restart) 
- do_stop 
- do_start 
- ;; 
- 
- start-fw|start_fw) 
- zapret_apply_firewall 
- ;; 
- stop-fw|stop_fw) 
- zapret_unapply_firewall 
- ;; 
- 
- restart-fw|restart_fw) 
- zapret_unapply_firewall 
- zapret_apply_firewall 
- ;; 
- 
- start-daemons|start_daemons) 
- zapret_run_daemons 
- ;; 
- stop-daemons|stop_daemons) 
- zapret_stop_daemons 
- ;; 
- restart-daemons|restart_daemons) 
- zapret_stop_daemons 
- zapret_run_daemons 
- ;; 
- 
- reload-ifsets|reload_ifsets) 
- zapret_reload_ifsets 
- ;; 
- list-ifsets|list_ifsets) 
- zapret_list_ifsets 
- ;; 
- list-table|list_table) 
- zapret_list_table 
- ;; 
- 
-  *) 
- N=/etc/init.d/$NAME 
- echo "Usage: $N {start|stop|restart|start-fw|stop-fw|restart-fw|start-daemons|stop-daemons|restart-daemons|reload-ifsets|list-ifsets|list-table}" >&2 
- exit 1 
- ;; 
-esac 
- 
-exit 0 
-</code> 
- 
-nano /opt/zapret/config 
-<code bash> 
-# this file is included from init scripts 
-# change values here 
- 
-# 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 
-# nftables only : set this to 0 to use pre-nat mode. default is post-nat. 
-# pre-nat mode disables some bypass techniques for forwarded traffic but allows to see client IP addresses in debug log 
-#POSTNAT=0 
- 
-# 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 
-# command to reload ip/host lists after update 
-# comment or leave empty for auto backend selection : ipset or ipfw if present 
-# on BSD systems with PF no auto reloading happens. you must provide your own command 
-# set to "-" to disable reload 
-#LISTS_RELOAD="pfctl -f /etc/pf.conf" 
- 
-# mark bit used by nfqws to prevent loop 
-DESYNC_MARK=0x40000000 
-DESYNC_MARK_POSTNAT=0x20000000 
- 
-TPWS_SOCKS_ENABLE=0 
-# tpws socks listens on this port on localhost and LAN interfaces 
-TPPORT_SOCKS=987 
-# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir 
-# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy 
-# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list 
-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 
-# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir 
-# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy 
-# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list 
-TPWS_OPT=" 
---filter-tcp=80 --methodeol <HOSTLIST> --new 
---filter-tcp=443 --split-pos=1,midsld --disorder <HOSTLIST> 
-" 
- 
-NFQWS_ENABLE=1 
-# redirect outgoing traffic with connbytes limiter applied in both directions. 
-NFQWS_PORTS_TCP=80,443 
-NFQWS_PORTS_UDP=443 
-# PKT_OUT means connbytes dir original 
-# PKT_IN means connbytes dir reply 
-# this is --dpi-desync-cutoff=nX kernel mode implementation for linux. it saves a lot of CPU. 
-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 
-# redirect outgoing traffic without connbytes limiter and incoming with connbytes limiter 
-# normally it's needed only for stateless DPI that matches every packet in a single TCP session 
-# typical example are plain HTTP keep alives 
-# this mode can be very CPU consuming. enable with care ! 
-#NFQWS_PORTS_TCP_KEEPALIVE=80 
-#NFQWS_PORTS_UDP_KEEPALIVE= 
-# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir 
-# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy 
-# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list 
-NFQWS_OPT=" 
---filter-tcp=80 --dpi-desync=fake,multisplit --dpi-desync-ttl=0 --dpi-desync-fooling=md5sig,badsum <HOSTLIST> --new 
---filter-tcp=443 --dpi-desync=fake,multidisorder --dpi-desync-split-pos=method+2,midsld,5 --dpi-desync-ttl=0 --dpi-desync-fooling=md5sig,badsum,badseq --dpi-desync-repeats=15 --dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin <HOSTLIST> --new 
---filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=15 --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> 
-" 
- 
-# none,ipset,hostlist,autohostlist 
-MODE_FILTER=none 
- 
-# 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=br0 
-IFACE_WAN=eth3 
-#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=0 
- 
-# 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 
-</code> 
- 
-  * [[config-1]] 
-  * [[config-2]] 
-  * [[config-3]] 
- 
-