diff --git a/binaries/aarch64/nfqws b/binaries/aarch64/nfqws index 6db0310..4d2bf8b 100755 Binary files a/binaries/aarch64/nfqws and b/binaries/aarch64/nfqws differ diff --git a/binaries/arm/nfqws b/binaries/arm/nfqws index 25db05e..c42cab6 100755 Binary files a/binaries/arm/nfqws and b/binaries/arm/nfqws differ diff --git a/binaries/freebsd-x64/dvtws b/binaries/freebsd-x64/dvtws index 752e7a5..046cbbb 100755 Binary files a/binaries/freebsd-x64/dvtws and b/binaries/freebsd-x64/dvtws differ diff --git a/binaries/mips32r1-lsb/nfqws b/binaries/mips32r1-lsb/nfqws index 6483955..6dabe5d 100755 Binary files a/binaries/mips32r1-lsb/nfqws and b/binaries/mips32r1-lsb/nfqws differ diff --git a/binaries/mips32r1-msb/nfqws b/binaries/mips32r1-msb/nfqws index 7301195..140c272 100755 Binary files a/binaries/mips32r1-msb/nfqws and b/binaries/mips32r1-msb/nfqws differ diff --git a/binaries/mips64r2-msb/nfqws b/binaries/mips64r2-msb/nfqws index 6acd726..d32813b 100755 Binary files a/binaries/mips64r2-msb/nfqws and b/binaries/mips64r2-msb/nfqws differ diff --git a/binaries/ppc/nfqws b/binaries/ppc/nfqws index 8c23137..713e384 100755 Binary files a/binaries/ppc/nfqws and b/binaries/ppc/nfqws differ diff --git a/binaries/win64/winws.exe b/binaries/win64/winws.exe index e8c544d..ee04f2b 100644 Binary files a/binaries/win64/winws.exe and b/binaries/win64/winws.exe differ diff --git a/binaries/win64/zapret-winws/preset_russia.cmd b/binaries/win64/zapret-winws/preset_russia.cmd index 06928ea..5dba037 100644 --- a/binaries/win64/zapret-winws/preset_russia.cmd +++ b/binaries/win64/zapret-winws/preset_russia.cmd @@ -1,2 +1,7 @@ -start "zapret: http,https,quic" /min "%~dp0winws.exe" --wf-tcp=80,443 --wf-udp=443 --filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 --new --filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --new --filter-tcp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls="%~dp0tls_clienthello_www_google_com.bin" --new --dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig - +start "zapret: http,https,quic" /min "%~dp0winws.exe" ^ +--wf-tcp=80,443 --wf-udp=443 ^ +--filter-udp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic="%~dp0quic_initial_www_google_com.bin" --new ^ +--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 --new ^ +--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --new ^ +--filter-tcp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls="%~dp0tls_clienthello_www_google_com.bin" --new ^ +--dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig diff --git a/binaries/win64/zapret-winws/preset_russia_autohostlist.cmd b/binaries/win64/zapret-winws/preset_russia_autohostlist.cmd index dd9fd2b..b6d3b74 100644 --- a/binaries/win64/zapret-winws/preset_russia_autohostlist.cmd +++ b/binaries/win64/zapret-winws/preset_russia_autohostlist.cmd @@ -1 +1,7 @@ -start "zapret: http,https,quic" /min "%~dp0winws.exe" --wf-tcp=80,443 --wf-udp=443 --filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 --new --filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt" --new --filter-tcp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls="%~dp0tls_clienthello_www_google_com.bin" --new --dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt" +start "zapret: http,https,quic" /min "%~dp0winws.exe" ^ +--wf-tcp=80,443 --wf-udp=443 ^ +--filter-udp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic="%~dp0quic_initial_www_google_com.bin" --new ^ +--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 --new ^ +--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt" --new ^ +--filter-tcp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls="%~dp0tls_clienthello_www_google_com.bin" --new ^ +--dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt" diff --git a/binaries/win64/zapret-winws/quic_initial_www_google_com.bin b/binaries/win64/zapret-winws/quic_initial_www_google_com.bin new file mode 100644 index 0000000..80a07cc Binary files /dev/null and b/binaries/win64/zapret-winws/quic_initial_www_google_com.bin differ diff --git a/binaries/win64/zapret-winws/winws.exe b/binaries/win64/zapret-winws/winws.exe index e8c544d..ee04f2b 100644 Binary files a/binaries/win64/zapret-winws/winws.exe and b/binaries/win64/zapret-winws/winws.exe differ diff --git a/binaries/x86/nfqws b/binaries/x86/nfqws index 6cbf75b..85911b3 100755 Binary files a/binaries/x86/nfqws and b/binaries/x86/nfqws differ diff --git a/binaries/x86_64/nfqws b/binaries/x86_64/nfqws index 1d729b4..278dadf 100755 Binary files a/binaries/x86_64/nfqws and b/binaries/x86_64/nfqws differ diff --git a/common/installer.sh b/common/installer.sh index ef5c069..57d7cdf 100644 --- a/common/installer.sh +++ b/common/installer.sh @@ -500,6 +500,7 @@ write_config_var() fi else # var does not exist in config. add it + contains "$M" " " && M="\"$M\"" if [ -n "$M" ]; then echo "$1=$M" >>"$ZAPRET_CONFIG" else diff --git a/config.default b/config.default index 73db91e..ea24a7b 100644 --- a/config.default +++ b/config.default @@ -84,7 +84,9 @@ NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake --dpi-desync-repeats=6" #NFQWS_OPT_DESYNC_QUIC6_SUFFIX="" # CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list +# SUFFIX VARS define additional lower priority desync profile. it's required if MODE_FILTER=hostlist and strategy has hostlist-incompatible 0-phase desync methods (mss) TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3 --oob" +#TPWS_OPT_SUFFIX="--mss 88" # openwrt only : donttouch,none,software,hardware FLOWOFFLOAD=donttouch diff --git a/docs/changes.txt b/docs/changes.txt index c36070a..51bf952 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -313,3 +313,7 @@ v62: tpws: connection close logic rewrite. tcp user timeout parameters for local and remote leg. nfqws: multi-strategy + +v63: + +tpws: multi-strategy diff --git a/docs/quick_start.txt b/docs/quick_start.txt index 39dc2bd..4d0aee8 100644 --- a/docs/quick_start.txt +++ b/docs/quick_start.txt @@ -97,7 +97,6 @@ blockcheck не всегда может выдать вам в итогах оп --dpi-desync-fooling, чтобы не сломать сайты на более коротких дистанциях. md5sig наиболее совместим, но работает только на linux серверах. badseq может работать только на https и не работать на http. -badsum и вовсе перестал работать на многих провайдерах с некоторых пор, видимо включили проверку чексумм на DPI. Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL с каждым из этих ограничителей. @@ -105,6 +104,11 @@ badsum и вовсе перестал работать на многих про может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах она стабильна, на третьих полный хаос, и проще отказаться. +Если используются методы нулевой фазы десинхронизации (--mss, --wssize, --dpi-desync=syndata) и режим фильтрации hostlist, +то все параметры, относящиеся к этим методам, следует помещать не в основные параметры (например, NFQWS_OPT_DESYNC), +а в suffix (NFQWS_OPT_DESYNC_SUFFIX). Чтобы не ошибиться, можно их продублировать и там, и там. +Иначе они могут не работать. + 8) Запустите install_easy.sh. Выберите nfqws или tpws, затем согласитесь на редактирование параметров. Откроется редактор, куда впишите найденные стратегии. diff --git a/docs/quick_start_windows.txt b/docs/quick_start_windows.txt index b6fd76f..d9e5a6d 100644 --- a/docs/quick_start_windows.txt +++ b/docs/quick_start_windows.txt @@ -87,6 +87,11 @@ badseq может работать только на https и не работа может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах она стабильна, на третьих полный хаос, и проще отказаться. +Если используются методы нулевой фазы десинхронизации (--wssize, --dpi-desync=syndata) и фильтр hostlist, +то все параметры, относящиеся к этим методам, следует помещать в следующий профиль без хостлиста, +к которому перейдет управление, когда имя хоста еще неизвестно. +Используйте параметр --debug для отладки вашего сценария. + 7) Протестируйте найденные стратегии на winws. winws следует брать из zapret-winws. Для этого откройте командную строку windows от имени администратора в директории zapret-winws. Проще всего это сделать через _CMD_ADMIN.cmd. Он сам поднимет права и зайдет в нужную директорию. diff --git a/docs/readme.eng.md b/docs/readme.eng.md index cec360c..40f298e 100644 --- a/docs/readme.eng.md +++ b/docs/readme.eng.md @@ -633,6 +633,10 @@ tpws is transparent proxy. ; its worth to make a reserve with 1.5 multiplier. by default maxfiles is (X*connections)*1.5+16 --max-orphan-time= ; if local leg sends something and closes and remote leg is still connecting then cancel connection attempt after N seconds + --new ; begin new strategy + --filter-l3=ipv4|ipv6 ; L3 protocol filter. multiple comma separated values allowed. + --filter-tcp=[~]port1[-port2] ; TCP port filter. ~ means negation + --hostlist= ; only act on hosts in the list (one host per line, subdomains auto apply, gzip supported, multiple hostlists allowed) --hostlist-exclude= ; do not act on hosts in the list (one host per line, subdomains auto apply, gzip supported, multiple hostlists allowed) --hostlist-auto= ; detect DPI blocks and build hostlist automatically @@ -737,11 +741,17 @@ Server replies with it's own MSS in SYN,ACK packet. Usually servers lower their fit to supplied MSS. The greater MSS client sets the bigger server's packets will be. If it's enough to split TLS 1.2 ServerHello, it may fool DPI that checks certificate domain name. This scheme may significantly lower speed. Hostlist filter is possible only in socks mode if client uses remote resolving (firefox `network.proxy.socks_remote_dns`). -TLS version filters are not possible. -`--mss-pf` sets port filter for MSS. Use `mss-pf=443` to apply MSS only for https. -Likely not required for TLS1.3. If TLS1.3 is negotiable then MSS make things only worse. +`--mss` is not required for TLS1.3. If TLS1.3 is negotiable then MSS make things only worse. Use only if nothing better is available. Works only in Linux, not BSD or MacOS. +### multiple strategies + +`tpws` supports multiple strategies as well. They work mostly like with `nfqws` with minimal differences. +`filter-udp` is absent because `tpws` does not support udp. 0-phase desync methods (`--mss`) can work with hostlist in socks modes with remote hostname resolve. +This is the point where you have to plan profiles carefully. If you use `--mss` and hostlist filters, behaviour can be different depending on remote resolve feature enabled or not. +Use `--mss` both in hostlist profile and profile without hostlist. +Use `curl --socks5` and `curl --socks5-hostname` to issue two kinds of proxy queries. +See `--debug` output to test your setup. ## Ways to get a list of blocked IP @@ -939,6 +949,12 @@ Its possible to change manipulation options used by tpws : `TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3"` +Additional low priority desync profile for `MODE_FILTER=hostlist`. +With multiple profile support 0-phase desync methods are no more applied with hostlist ! +To apply them additional profile is required without hostlist filter. + +`TPWS_OPT_SUFFIX="--mss=88"` + nfqws options for DPI desync attack: ``` diff --git a/docs/readme.txt b/docs/readme.txt index af11bc3..93a462e 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -1,4 +1,4 @@ -zapret v.62 +zapret v.63 English ------- @@ -774,6 +774,9 @@ tpws - это transparent proxy. --hostlist-auto-fail-threshold= ; сколько раз нужно обнаружить ситуацию, похожую на блокировку, чтобы добавить хост в лист (по умолчанию: 3) --hostlist-auto-fail-time= ; все эти ситуации должны быть в пределах указанного количества секунд (по умолчанию: 60) --hostlist-auto-debug= ; лог положительных решений по autohostlist. позволяет разобраться почему там появляются хосты. + --new ; начало новой стратегии + --filter-l3=ipv4|ipv6 ; фильтр версии ip для текущей стратегии + --filter-tcp=[~]port1[-port2] ; фильтр портов tcp для текущей стратегии. ~ означает инверсию. --debug позволяет выводить подробный лог действий на консоль, в syslog или в файл. @@ -903,13 +906,12 @@ tpws поддерживает эту возможность асинхронно С фильтром по hostlist совместимо только в режиме socks при включенном удаленном ресолвинге хостов. (firefox network.proxy.socks_remote_dns). Это единственный вариант, когда tpws может узнать имя хоста еще на этапе установления соединения. -Невозможен фильтр по версии TLS. -Взамен имеется фильтр по портам --mss-pf. --mss-pf=443 применяет дурение только к https. Применяя данную опцию к сайтам TLS1.3, если броузер тоже поддерживает TLS1.3, то вы делаете только хуже. Но нет способа автоматически узнать когда надо применять, когда нет, поскольку MSS идет только в 3-way handshake еще до обмена данными, а версию TLS можно узнать только по ответу сервера, который может привести к реакции DPI. Использовать только когда нет ничего лучше или для отдельных ресурсов. +Для http использовать смысла нет, поэтому заводите отдельный desync profile с фильтром по порту 443. Работает только на linux, не работает на BSD и MacOS. --skip-nodelay может быть полезен, чтобы привести MTU к MTU системы, на которой работает tpws. @@ -924,6 +926,20 @@ TCP_USER_TIMEOUT. Под таймаутом подразумевается вр что данных для передачи нет. Полезно для сокращения время закрытия подвисших соединений. Поддерживается только на Linux и MacOS. +МНОЖЕСТВЕННЫЕ СТРАТЕГИИ +Работают аналогично nfqws, кроме некоторых моментов. +Нет параметра --filter-udp, поскольку tpws udp не поддерживает. +Методы нулевой фазы (--mss) могут работать по хостлисту в одном единственном случае : +если используется режим socks и удаленный ресолвинг хостов через прокси. +То есть работоспособность вашей настройки в одном и том же режиме может зависеть от того, +применяет ли клиент удаленный ресолвинг. Это может быть неочевидно. +В одной программе работает, в другой - нет. +Если вы используете профиль с хостлистом , и вам нужен mss, укажите mss в профиле с хостлистом, +создайте еще один профиль без хостлиста, если его еще нет, и в нем еще раз укажите mss. +Тогда при любом раскладе будет выполняться mss. +Используйте `curl --socks5` и `curl --socks5-hostname` для проверки вашей стратегии. +Смотрите вывод --debug, чтобы убедиться в правильности настроек. + Способы получения списка заблокированных IP ------------------------------------------- @@ -1369,6 +1385,12 @@ MODE_FILTER=none TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3" +Дополнительный низкоприоритетный профиль десинхронизации для режимов с MODE_FILTER=hostlist. +После реализации поддержки множественных профилей режимы нулевой фазы десинхронизации больше не применяются с хостлистом ! +Для их применения требуется дополнительный профиль без хостлист фильтра. + +#TPWS_OPT_SUFFIX="--mss 88" + Опции nfqws для атаки десинхронизации DPI : DESYNC_MARK=0x40000000 diff --git a/files/fake/quic_initial_google_com.bin b/files/fake/quic_initial_google_com.bin deleted file mode 100644 index baf4f8c..0000000 Binary files a/files/fake/quic_initial_google_com.bin and /dev/null differ diff --git a/init.d/macos/custom-tpws b/init.d/macos/custom-tpws index c32d5cb..1f99a0e 100644 --- a/init.d/macos/custom-tpws +++ b/init.d/macos/custom-tpws @@ -6,9 +6,10 @@ zapret_custom_daemons() { # $1 - 1 - run, 0 - stop local opt="--user=root --port=$TPPORT_MY" - filter_apply_hostlist_target opt tpws_apply_binds opt opt="$opt $TPWS_OPT" + filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" do_daemon $1 1 "$TPWS" "$opt" } diff --git a/init.d/macos/functions b/init.d/macos/functions index 45f678e..4fb826f 100644 --- a/init.d/macos/functions +++ b/init.d/macos/functions @@ -163,9 +163,10 @@ zapret_do_daemons() } # MacOS requires root. kernel hardcoded requirement for /dev/pf ioctls opt="--user=root --port=$TPPORT" - filter_apply_hostlist_target opt tpws_apply_binds opt opt="$opt $TPWS_OPT" + filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" do_daemon $1 1 "$TPWS" "$opt" ;; tpws-socks) @@ -175,8 +176,9 @@ zapret_do_daemons() } opt="--socks --user=$WS_USER --port=$TPPORT" tpws_apply_socks_binds opt - filter_apply_hostlist_target opt opt="$opt $TPWS_OPT" + filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" do_daemon $1 1 "$TPWS" "$opt" ;; filter) diff --git a/init.d/openwrt/custom-tpws4http-nfqws4https b/init.d/openwrt/custom-tpws4http-nfqws4https index 333e7c3..d777aa8 100644 --- a/init.d/openwrt/custom-tpws4http-nfqws4https +++ b/init.d/openwrt/custom-tpws4http-nfqws4https @@ -10,6 +10,7 @@ zapret_custom_daemons() [ "$MODE_HTTP" = "1" ] && { opt="--port=$TPPORT $TPWS_OPT" filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" run_tpws 1 "$opt" } diff --git a/init.d/openwrt/zapret b/init.d/openwrt/zapret index f30b3ef..208dc67 100755 --- a/init.d/openwrt/zapret +++ b/init.d/openwrt/zapret @@ -122,11 +122,13 @@ start_daemons_procd() tpws) opt="--port=$TPPORT $TPWS_OPT" filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" run_tpws 1 "$opt" ;; tpws-socks) opt="--port=$TPPORT $TPWS_OPT" filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" run_tpws_socks 1 "$opt" ;; nfqws) diff --git a/init.d/sysv/custom-tpws4http-nfqws4https b/init.d/sysv/custom-tpws4http-nfqws4https index 9689880..95042c0 100644 --- a/init.d/sysv/custom-tpws4http-nfqws4https +++ b/init.d/sysv/custom-tpws4http-nfqws4https @@ -10,6 +10,7 @@ zapret_custom_daemons() [ "$MODE_HTTP" = "1" ] && { opt="--port=$TPPORT $TPWS_OPT" filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" do_tpws $1 1 "$opt" } diff --git a/init.d/sysv/functions b/init.d/sysv/functions index 2553d02..519c1e0 100644 --- a/init.d/sysv/functions +++ b/init.d/sysv/functions @@ -291,11 +291,13 @@ zapret_do_daemons() tpws) opt="--port=$TPPORT $TPWS_OPT" filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" do_tpws $1 1 "$opt" ;; tpws-socks) opt="--port=$TPPORT $TPWS_OPT" filter_apply_hostlist_target opt + filter_apply_suffix opt "$TPWS_OPT_SUFFIX" do_tpws_socks $1 1 "$opt" ;; nfqws) diff --git a/install_easy.sh b/install_easy.sh index dd962e3..67364d8 100755 --- a/install_easy.sh +++ b/install_easy.sh @@ -111,8 +111,8 @@ select_mode_mode() ask_list MODE "$MODES" tpws && write_config_var MODE case $MODE in - tpws) - vars="TPWS_OPT" + tpws|tpws-socks) + vars="TPWS_OPT TPWS_OPT_SUFFIX" ;; nfqws) vars="NFQWS_OPT_DESYNC NFQWS_OPT_DESYNC_SUFFIX NFQWS_OPT_DESYNC_HTTP NFQWS_OPT_DESYNC_HTTP_SUFFIX NFQWS_OPT_DESYNC_HTTPS NFQWS_OPT_DESYNC_HTTPS_SUFFIX NFQWS_OPT_DESYNC_HTTP6 NFQWS_OPT_DESYNC_HTTP6_SUFFIX NFQWS_OPT_DESYNC_HTTPS6 NFQWS_OPT_DESYNC_HTTPS6_SUFFIX NFQWS_OPT_DESYNC_QUIC NFQWS_OPT_DESYNC_QUIC_SUFFIX NFQWS_OPT_DESYNC_QUIC6 NFQWS_OPT_DESYNC_QUIC6_SUFFIX" diff --git a/nfq/nfqws.c b/nfq/nfqws.c index 218d398..7fea2b3 100644 --- a/nfq/nfqws.c +++ b/nfq/nfqws.c @@ -925,8 +925,6 @@ bool parse_tlspos(const char *s, enum tlspos *pos) int main(int argc, char **argv) { - cd_to_exe_dir(argv[0]); - #ifdef __CYGWIN__ if (service_run(argc, argv)) {