Zapret: what's new

Да, речь про десинхронизацию и она прекрасна своей изящностью в сочетании с минимальным оверхедом.

Добавлен выбор режима десинхронизации DPI.
На текущий момент это может быть

  • поддельный пакет с разрешенным запросом : --dpi-desync без параметра или --dpi-desync=fake
  • пакет сброса соединения : --dpi-desync=rst

Добавлен режим disorder для dpi-desync.

В этом режиме пакет с http request или tls client hello разбивается на 2 части. Отсылка идет следующим образом :

  1. 2-й сегмент
  2. поддельный 1-й сегмент
  3. 1-й сегмент
  4. поддельный 1-й сегмент

цель атаки - максимально усложнить DPI реконструкцию сообщения, по которому принимается решение о блокировке

Исправлен баг, при котором была невозможна отправка поддельных пакетов ipv4 и ipv6 с одного процесса nfqws. Для 4 и 6 теперь используются разные raw сокеты.

Добавлен режим --dpi-desync-fooling=badseq. Испорченные sequence numbers в поддельных пакетах.
Возможно сочетание любых режимов через запятую : --dpi-desync-fooling=badseq,badsum,md5sig

Отработана схема использования nfqws на мобильных модемах Huawei.
Проверено на E8372. Вероятно работает на E3372 с минимальными модификациями.
Возможно, на других устройствах.

Изменение 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