Zapret: what's new

Сюда буду сбрасывать информацию о последних изменениях в проекте

Опишу кратко назначение.
Проект нацелен на прозрачный обход блокировок и замедлений веб сайтов http(s) на Linux, FreeBSD, OpenBSD, частично MacOS, в том числе на роутерах на базе openwrt. Может применяться и для противодействия сигнатурному анализу произвольных tcp протоколов
Он состоит из следующих компонент :

  1. Скрипты для автоматизации получения списка заблокированных ip и хостов и их обработки (ipset, ip2net, mdig).
  2. Программы для обхода DPI на http и https : nfqws,dvtws,tpws,
  3. Скрипты задействования этих программ + фаервола на разных системах - openwrt, sysv, systemd, macos (init.d)
  4. То, что не автоматизировано. Описательная часть для продвинутых пользователей : как организовать выборочное прозрачное проксирование соединений, заворот на VPN, способы модификации существующих VPN решений для изменений их стандартного протокола с целью скрытия от DPI

Изменения май-июнь 2019
Проект был существенно доработан.

Сделана максимально упрощенная установка для пользователей основных дистрибутивов linux и openwrt через скрипт install_easy.sh.
Вариант по умолчанию ставит сплиттер http запросов + Host => HOST
Переписаны скрипты для debian и openwrt.
Убрана вся каша с провайдерами, потому что все равно не буду следить за актуальностью что на каком провайдере.
Теперь все более логично. Вы выбираете что использовать : tpws или nfqws, их параметры.
Можно легко самому добавлять в скрипты запуск дополнительных демонов или их копий с разными параметрами.
Добавление правил firewall вынесено в отдельные процедуры, которые можно использовать при модификации скрипта.
Добавление правил firewall под openwrt вынесено в отдельный firewall include /etc/firewall.zapret, чтобы /etc/firewall.user использовать для своих целей и не смешивать команды.
Настройки вынесены из init скриптов в отдельный файл “config”.
Все выглядит проще и лаконичней imho
Листы РКН разрослись до мегабайтов. Теперь они хранятся в сжатом виде, что уменьшает в разы требования свободного места на роутере.
Новая программа ip2net позволяет в 2-3 раза уменьшить ipset-ы, объединяя ip в подсети.
Многопоточный ресолвер mdig делает снова реальным самостоятельный ресолвинг реестра через get_reestr.sh.
Добавлены бинарики для arm64, mips64, ppc.
Бинарики для всех архитектур, кроме mips64, запакованы в upx. Это уменьшает их размер в 2 раза.
Сделан автоматический распознаватель архитектуры и установщик бинариков - install_bin.sh
install_easy.sh в случае необнаружения подходящих бинариков может сам их собрать при условии наличия gcc,make и необходимых -dev пакетов
Можно запустить install_easy с параметром “make”, чтобы форсировать сборку.
Сделана поддержка ipv6. Она и раньше была в tpws, nfqws, но сейчас она пронесена через все компоненты.
tpws получил дополнительные функции для привязки к определенным IP и возможности по ожиданию готовности интерфейсов,
возможность чтения hostlist-ов в формате gzip
Логика управления соединениями в tpws переписана на использование неблокирующих сокетов, устранены многочисленные потенциальные проблемы кода, унаследованного у взятого где-то в сети примера не лучшего качества
nfqws больше не требует рута для работы, ограничиваясь сбросом capabilities до CAP_NET_ADMIN.
В tpws и nfqws кроме --user добавлена возможность установки uid:gid через параметр --uid. Это полезно на android, поскольку там нет /etc/passwd.
Написана документация по настройке policy based routing на примере wireguard.
Описан метод модификации wireguard для противостояния возможным попыткам заблокировать VPN протоколы на DPI (суверенный рунет).

Изменения сентябрь 2019

Выяснилось откуда в реестре появляется миллион+ IP и этот список неудержимо растет.
Автоматическое распознавание телеграм прокси.
Вот вы сидите в метро через wifi, тыкаетесь в новонайденный телеграм прокси.
А вас снифают. И сливают инфу РКН.
Переработаны скрипты получения ipset.
Добавлена поддержка листов с https://antifilter.network на замену get_antizapret.
умные префиксированныо-вычищенные листы оставляют нас всего лишь с десятками тысяч префиксов, что запросто потянет роутер с 64 Mb RAM
Переработано получение листов непосредственно из реестра (get_reestr_*.sh)
бывший get_reestr.sh переименован в get_reestr_resolve.sh. Это скрипт для самостоятельного ресолва доменов из реестра через mdig.
На смену get_combined.sh пришел get_reestr_combined.sh. Теперь он работает только с реестром, не используя другие листы.
get_reestr_ip.sh подтягивает IP в том виде, в каком они значатся в реестре
get_reestr_ip, get_reestr_combined поддерживают теперь ipv6. Оба убирают мусор , которым на данный момент считается телеграм
В ip2net добавлена поддержка ipv6 и настройка параметров через командную строку. create_ipset.sh обновлен до поддержки этой функции.
Параметры ip2net вынесены в config

Добавлена поддержка режима socks4/5
Он не требует повышенных привилегий, рута
может использоваться на нерутированных android устройствах с программами, поддерживающими socks или через хитрые методы прозрачного заворота через tun

Для разработки программы, которая бы использовала zapret, можно взять исходный код программы Intra или какого-нибудь проксификатора (например, shadowsocks). Почти все подобные программы используют badvpn tun2socks.

Лично у меня совсем нет опыта в android development, и вряд ли я начну делать аппликуху сам. Но если кто желает, пожалуйста.
Хотя, если так подумать, то при таком подходе зачем нужен бинарик tpws ? Ведь можно то же самое и на яве соорудить. Не зависеть от платформы.
С tpws преимущество разве что в скорости немного. Но я не думаю, что это существенно для мобильников

Можно сделать универсальную аппликуху для рута и без рута. Если рут, то адвансед моде и тпвс в транспарент режиме, иначе через выкрутасы

В tpws добавлена опция --hostpad=
Добавляет паддинг-хедеров перед Host: на указанное количество байтов
Полезно против DPI, выполняющих реассемблинг TCP с ограниченным буфером.
Если техника работает, то после некоторого количества bytes http запрос начнет проходить до сайта.
Если при этом критический размер padding около MTU, значит скорее всего DPI не выполняет реассемблинг пакетов, и лучше будет использовать обычные опции --split-…
Если все же реассемблинг выполняется, то критический размер будет около размера буфера DPI. Он может быть 4K или 8K, возможны и другие значения.

Реализована атака десинхронизации DPI для http и https. За основу взята идея от ValdikSS.

Очень крутая и полезная вещь, у нескольких хостеров (включая Селектел) отлично работает, что позволяет пользоваться запрещёнкой без оверхеда на VPN с большим RTT.
Спасибо!

Речь про десинхронизацию или другие опции ?
Пока про десинхронизацию у меня нет отзывов, тестирование было крайне ограниченным

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

Добавлен выбор режима десинхронизации 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 роутерах и листах от РКН это означало невозможность использования в такой конфигурации