What's new

Изменение window size в nfqws считается устаревшим и более не поддерживается в скриптах.
На замену ему приходит более быстрая альтернатива --dpi-desync=split2, лишенная других недостатков wsize (типа невозможности заменить регистр Host: при --wsize=3 на пакетах от linux клиента)

В свете последних изменений переписана вводная часть readme.

Не планируете интеграцию наработок https://github.com/Kkevsterrr/geneva ?

Универсальный тампер движок портировать с питона не планирую
Но по мере необходимости готов добавлять новые стратегии, работающие в exUSSR

Изменение поведения опций сплита в tpws.

Теперь tpws в состоянии распознавать не только http, но и TLS ClientHello.
split-http-req может применяться совместно с split-pos. Если блок данных является http запросом, будет применяться split-http-req, в ином случае split-pos.
split-pos по умолчанию работает только с http и TLS ClientHello. Если вам нужно сплитать все остальное, укажите --split-any-protocol.
–hostlist так же теперь работает со SNI из TLS ClientHello.

В config параметры TPWS_OPT_HTTP и TPWS_OPT_HTTPS удалены, вместо них единый TPWS_OPT.

Простой инсталятор и скрипты запуска адаптированы, чтобы более не запускать по отдельному инстансу на http и https. Добавлен режим tpws_hostlist_https.

В продолжение предыдущего.

В tpws добавлена возможность биндаться на множество адресов.
Параметры --bind-addr и --bind-iface* начинают новый бинд. Следующие параметры --bind-wait*, --bind-linklocal относятся к последнему бинду.
Если хотите указывать link-local явно в --bind-addr, то теперь к нему надо добавлять %interface_name.
Например : fe80::1111:2222:3333:4444%br-lan
Если явно не создан ни один бинд, то в целях совместимости параметров создается бинд по умолчанию на все адреса.

init скрипты адаптированы, чтобы запускать только 1 tpws в любых случаях. Ранее их могло быть до 6 шт.
Особую проблему это представляло при использовании hostlist. Каждый инстанс подгружал свой hostlist. RAM это съедало до 6 раз больше, чем могло бы быть. На soho роутерах и листах от РКН это означало невозможность использования в такой конфигурации

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 (если уже не пофиксили)