Zapret: what's new

8 posts were merged into an existing topic: Обсуждение

Сделана экспериментальная поддержка flow offloading в openwrt , включая простой инсталятор
В openwrt flow offloading работает только глобально. Либо включено, либо выключено. nfqws не работает с включенным offloading.
Скрипты zapret теперь сами в состоянии выборочно управлять трафиком, который идет на offload, отключая при этом системную установку. То есть в люси у вас будет чекбоксик выключен, но оффлоад на самом деле будет работать там, где он не мешает nfqws

Тестировалось только на software flow offloading, на hardware возможности проверить нет
Если кто-то может проверить, буду благодарен.

Сделал рефакторинг системы управления режимами. Вместо впихивания нескольких опций в один строковый параметр MODE, эти опции теперь разделены по разным переменным.
Поддержка keep alive в nfqws больше не требует custom скрипта. Она теперь вшита в основной функционал.

# CHOOSE OPERATION MODE
# MODE : nfqws,tpws,filter,custom
# nfqws : use nfqws
# tpws : use tpws
# filter : no daemon, just create ipset or download hostlist
# custom : custom mode. should modify custom init script and add your own code
MODE=tpws
# apply fooling to http
MODE_HTTP=1
# for nfqws only. support http keep alives. enable only if DPI checks for http request in any outgoing packet
MODE_HTTP_KEEPALIVE=0
# apply fooling to https
MODE_HTTPS=1
# none,ipset,hostlist
MODE_FILTER=none

Добавлена проверка на подмену DNS в простой инсталятор install_easy.sh
Инсталятор сам не будет решать проблему DNS за вас, но предупредит о возможной подмене

Было замечено, что virtualbox и vmware ломает большинство техник nfqws, если сеть настроена в режиме NAT.
Принудительно заменяется TTL на ttl хоста, не проходят фейковые ретрансмиссии
Необходимо настраивать VM в режиме bridge
Ожидаемо так же не работает и GoodbyeDPI с --set-ttl

В nfqws добавлена возможность комбинирования режимов десинхронизации
Режим 1-й фазы может быть fake,rst,rstack. Режим 2-й фазы может быть disorder,disorder2,split,split2.
Пишем через запятую : --dpi-desync=fake,split
Может быть полезно, когда у провайдера стоит не один DPI.
–dpi-desync без параметров раньше приравнивался к fake. Теперь это больше не поддерживается, требуется явное указание режима.

Ограниченная поддержка систем FreeBSD и OpenBSD
работают mdig, ip2net, tpws
на FreeBSD полностью работоспособны скрипты ipset/*.sh. Они заполняют ipfw lookup tables.
тестировалось на FreeBSD 12.2 и OpenBSD 6.8. на значительно более старых скорее всего будут проблемы
портирование nfqws напрямую невозможно. nfqueue в BSD отсутствует в принципе. нужно искать другой аналогичный механизм

Добил поддержку FreeBSD и OpenBSD.
На замену nfqws пришел dvtws. Это nfqws, собираемый под divert sockets.
Работает почти точно так же, как nfqws. Разница только в способах перенаправления трафика.
ipfw команды или pf.conf вместо iptables

Экспериментально. Тестируйте, кто может.

Ограниченная поддержка MacOS.
Яблочники там убрали все самое вкусное, поэтому dvtws и tpws в прозрачном режиме не завести.
Работает tpws socks. Его можно сделать прозрачным через приложение Proxifier (на не совсем новых версиях macos ставит свой модуль ядра).
Скрипты ipset/*.sh работают после установки через brew некоторых GNUшных программ взамен устаревшим имеющимся в macos.
Описание в docs/bsd.txt

Прозрачный режим tpws в MacOS.
Яблочники убрали net/pfvar.h, где находятся определения, необходимые для получения оригинального адреса в прозрачном режиме.
Взял из старых версий яблочного SDK. Сработало. Они изменили некоторые структуры, поэтому вариант из BSD не работал.
Но теперь это недокументировано, и запросто могут еще что-нибудь поубирать в будущих версиях.

Сделан install_easy.sh для MacOS
Поддерживается весь стандартный набор, но только для tpws
Internet sharing не поддерживается !! При его включении PF начинает функционировать странно.
Редиректы не работают. При выключении все лишние anchor-ы убираются, состояние становится как до включения, но редиректы уходят в никуда.
Лечится только через pfctl -f /etc/pf.conf. В причинах пока не разобрался. Возможно, какие-то хитрости яблочников, выходящие за пределы стандартного поведения PF

В простой инсталятор внесен режим socks.

Редизайн выбора LAN и WAN интерфейсов на десктопных системах.
В этом процессе есть ряд важных нюансов, которые нужно осознавать, включая фильтрацию по интерфейсам.
Они описаны в readme в разделе “простая установка”

Новая схема дурения DPI, которые секут не только TLS ClientHello, но и ServerHello.
Как же с этим бороться ? Сложно заставить сервер посылать не то, на что он запрограммирован.
Лучшее решение было бы всем перейти на TLS 1.3, где ServerHello шифрован.
Но переход идет вяло. Владельцы серверов годами остаются на давно настроенных и стабильных системах. Потому там может быть только TLS 1.2.
Но кое-что все-таки сделать можно. Почему бы не возродить старую идею со сменой winsize, только наоборот ?
В nfqws добавлен параметр --wssize=<window_size>[:<scale_factor>]
Он позволяет менять window size и scale factor для сервера до тех пор, пока не будет отослан запрос, на который должен придти фрагментированный ответ, затем перестать менять winsize, чтобы вернуть скорость.
Менять winsize и scale factor надо во всех пакетах от начала соединения до отсылки TLS ClientHello, иначе это не сработает на linux серверах.
Типичное использование --wssize=1:6. scale_factor - это степень двойки, на которую умножается winsize.
Чем он больше, тем потом будет выше скорость, однако если его сделать слишком большим, то не будет достигнута цель, а если слишком малым - потом будут тормоза.
Для http такая схема бесполезна, поэтому заодно введена возможность в скриптах отдельно настраивать опции дурения nfqws для http и https

Код:

NFQWS_OPT_DESYNC="--dpi-desync=fake --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
#NFQWS_OPT_DESYNC_HTTP="--dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
#NFQWS_OPT_DESYNC_HTTPS="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"

Для http берется NFQWS_OPT_DESYNC_HTTP, если он пустой - NFQWS_OPT_DESYNC
Для https берется NFQWS_OPT_DESYNC_HTTPS, если он пустой - NFQWS_OPT_DESYNC
Схема себя показала эффективной против ТСПУ, даже без fake, но со split

Режим десинхронизации synack. Отсылаем SYN,ACK перед SYN.
Попытка убедить DPI , что роли клиента и сервера перепутаны.
Работает только если между атакующим девайсом и DPI нет NAT.
Если верить geneva, возможно сработает в KZ (если уже не пофиксили)

Добавил поддержку openrc в install_easy.sh
Проверено на nitrux и alpine.
alpine - сильно обрезанная система, отсутствуют по умолчанию ip(6)tables
Делать автоустановку не стал, чтобы не привязываться к специфической для обрезанной системы пакетной базе : apk add iptables ip6tables
Должно работать и на gentoo при условии ручной установки ipset : emerge ipset

Более надежное определение systemd. Некоторые дистрибутивы оставляют systemctl и юниты, хотя systemd там отсутствует

Для облегчения интеграции с обрезанными системами и прошивками sysv init доработан до поддержки максимально спартанских условий. Может теперь работать с разными adduser/useradd или вовсе без них. Поддержка readonly root.
Имея rw /opt, туда можно установить entware, необходимые проги, и все, что не дает использовать zapret на полную, это лишь отсутствующие модули ядра. Тут ничем помочь не могу.

Сделан собственный скрипт для автоматизации проверки стратегий обхода DPI через nfqws - blockcheck.sh
Его следует запускать, когда любые инструменты обхода блокировок неактивны.
Проверка подмены DNS убрана из install_easy.sh и перенесена в blockcheck.sh

Реализовано задание раздельных опций nfqws для http и https и для версий ip протоколов 4,6 :

NFQWS_OPT_DESYNC_HTTP="--dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
NFQWS_OPT_DESYNC_HTTPS="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
NFQWS_OPT_DESYNC_HTTP6="--dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
NFQWS_OPT_DESYNC_HTTPS6="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"

Если какая-то из переменных NFQWS_OPT_DESYNC_HTTP/NFQWS_OPT_DESYNC_HTTPS не определена, берется значение NFQWS_OPT_DESYNC.
Если какая-то из переменных NFQWS_OPT_DESYNC_HTTP6/NFQWS_OPT_DESYNC_HTTPS6 не определена, берется значение NFQWS_OPT_DESYNC_HTTP/NFQWS_OPT_DESYNC_HTTPS.
Значит, если определено только NFQWS_OPT_DESYNC, то все 4 специализированные переменные берут это значение.
Зачем это надо : вряд ли ttl будет одинаковым для ipv4 и ipv6. Если для ipv4 он окажется 9, то таким ttl вы вполне можете начать рубить сайты на ipv6

Скрипты всеми силами стараются минимизировать количество процессов nfqws, чтобы сохранить память. Для роутеров это важно, а если используется hostlist, то 4 процесса nfqws легко забьют и 256 Mb. Если для разных вариантов используются одни параметры, то запускается только один процесс с ними.

В nfqws добавлен параметр --dpi-desync-ttl6, задающий отдельное значение для ipv6 hop limit.
Если --dpi-desync-ttl6 не указан, то берется значение --dpi-desync-ttl. Чтобы отключить hop limit на ipv6 используйте --dpi-desync-ttl6=0.
Параметр позволяет не запускать лишний процесс nfqws, когда стратегия обхода для ipv4 и ipv6 отличается лишь ttl.

В blockcheck.sh добавлена поддержка FreeBSD через фаервол ipfw
Необходима загрузка модулей ipfw.ko и ipdivert.ko