Zapret: what's new

Сделал проверку в blockcheck на уже запущенные процессы zapret и вывод предупреждения, если они есть.
Только предупреждение. Блокчек ничего не знает об install_easy, о способе запуска этих процессов, не знает ничего о службах systemd, openrc, sysv, ничего не будет останавливать и трогать. Только warning.
Наличие процессов может свидетельствовать о неободимости остановить службу zapret, а может ни о чем не свидетельствовать. Например, болтается инстанс на порт wireguard или tpws --socks.
Сами думайте надо ли что-то делать или нет.

Сделал еще детект goodbyedpi. Он тоже будет мешать блокчеку

-filter-udp=50000-65535 --dpi-desync=fake,tamper --dpi-desync-any-protocol --dpi-desync-autottl=2 --dpi-desync-repeats=11

отсутствие понимания создает огромную проблему, и она множится от копипасты
запрет не будет думать за вас
он будет срать 11 пакетами на каждый реальный как вы ему и сказали
причем не только на дискорд
торентики в 10 раз замедлились на раздачу ? вот поэтому, что вы трэш написали

desync any protocol нуждается в connbytes или cutoff ограничителе.
пример взят c винды, где connbytes нет

в добавок в этом примере tamper - лишний. он работает пока только с DHT.
а так же autottl не будет работать на всех провайдерах. или вообще, или потребуется поиск рабочей delta. Для каких-то протоколов это не так важно, потому что сервер отбрасывает невалидные пакеты, даже если они до него дошли. Типичный пример - QUIC. А для других может испортить что-то.
Поскольку нет фильтра по IP, а только по портам, то насиловаться будут все udp с портами 50000+. И что-то может сломаться. Совершенно неожиданно и внезапно.

Добавлена поддержка множественных custom скриптов в директориях custom.d

Спойлер

Вариант custom

custom код вынесен в отдельные shell includes.
Поддерживается старый вариант в
/opt/zapret/init.d/sysv/custom
/opt/zapret/init.d/openwrt/custom
/opt/zapret/init.d/macos/custom
Он считается устаревшим. Актуальный вариант - помещать отдельные скрипты там же, но в директорию “custom.d”.
Она будет просканирована стандартным образом, т.е. в алфавитном порядке, и каждый скрипт будет применен.
Рядом имеется “custom.d.examples”. Это готовые скрипты, которые можно копировать в “custom.d”.
Особо стоит отметить “10-inherit-*”. Они наследуют стандартные режимы nfqws/tpws/tpws-socks.
Полезно, чтобы не писать код заново. Достаточно лишь скопировать соответствующий файл.
Можно наследовать и более сложным образом.
“10-inherit-tpws4http-nfqws4https” наследует для http tpws, а для https и quic - nfqws.

Для linux пишется код в функции
zapret_custom_daemons
zapret_custom_firewall
zapret_custom_firewall_nft

Для macos
zapret_custom_daemons
zapret_custom_firewall_v4
zapret_custom_firewall_v6

zapret_custom_daemons поднимает демоны nfqws/tpws в нужном вам количестве и с нужными вам параметрами.
Для систем традиционного linux (sysv) и MacOS в первом параметре передается код операции : 1 = запуск, 0 = останов.
Для openwrt логика останова отсутствует за ненадобностью.
Схема запуска демонов в openwrt отличается - используется procd.

zapret_custom_firewall поднимает и убирает правила iptables.
В первом параметре передается код операции : 1 = запуск, 0 = останов.

zapret_custom_firewall_nft поднимает правила nftables.
Логика останова отсутствует за ненадобностью.

Если вам не нужны iptables или nftables - можете не писать соответствующую функцию.

В linux можно использовать локальные переменные FW_EXTRA_PRE и FW_EXTRA_POST.
FW_EXTRA_PRE добавляет код к правилам ip/nf tables до кода, генерируемого функциями-хелперами.
FW_EXTRA_POST добавляет код после.

В linux функции-хелперы добавляют правило в начало цепочек, то есть перед уже имеющимися.
Поэтому специализации должны идти после более общих вариантов.
Поэтому наследования идут с префиксом 10, а остальные custom скрипты с префиксом 50.
Допустим, у вас есть особые правила для IP подсети youtube. Порты те же самые.
Включен и общий обход. Чтобы youtube пошел приоритетом, скрипт должен применяться после
общего обхода.
Для macos правило обратное. Там правила добавляются в конец. Поэтому inherit скрипты
имеют префикс 90.

В macos firewall-функции ничего сами никуда не заносят. Их задача - лишь выдать текст в stdout,
содержащий правила для pf-якоря. Остальное сделает обертка.

Особо обратите внимание на номер демона в функциях “run_daemon” и “do_daemon”, номера портов tpws
и очередей nfqueue.
Они должны быть уникальными во всех скриптах. При накладке будет ошибка.
Поэтому используйте функции динамического получения этих значений из пула.

custom скрипты могут использовать переменные из config. Можно помещать в config свои переменные
и задействовать их в скриптах.
Можно использовать функции-хелперы. Они являются частью общего пространства функций shell.
Полезные функции можно взять из примеров скриптов. Так же смотрите “common/*.sh”.
Используя хелпер функции, вы избавитесь от необходимости учитывать все возможные случаи
типа наличия/отсутствия ipv6, является ли система роутером, имена интерфейсов, …
Хелперы это учитывают, вам нужно сосредоточиться лишь на фильтрах {ip,nf}tables и
параметрах демонов.

Сделаны экспериментальные custom скрипты 50-discord.
Автор не изучал блокировку этого сервиса. Сделано с информации community.
Можете дополнять, изменять и оптимизировать.

Сделаны скрипты получения листов get_refilter_ipsum.sh, get_refilter_domains.sh

Если вкратце, то это интеллектуальная попытка расчистить нарко-казиношный трэш из реестра

Сделаны ipset-ы в tpws и nfqws. User mode реализация, которая ни в коей мере не должна быть использована как удобная замена сложным ковыряниям в ip/nf tables лишь потому, что это просто и удобно. Это будет порочной практикой. Сделано для систем windows и linux без ipset (Android, например)

ipset-ами фильтруются профили. ipset является жестким фильтром, он работает сразу после первого пакета.

Поддержка фильтрации L7 (–filter-l7). L7 протокол становится известен обычно после первого пакета с данными вместе с hostname. Поэтому он не работает для нулевой фазы. На нулевой фазе L7 всегда равен unknown.

autohostlist debug log теперь содержит ip:port клиента и название L7 протокола. В postnat режиме вы не увидите ip клиента, а увидите endpoint самого роутера, с которого идет внешний конект.

custom scripts
Переменные FW_EXTRA_PRE, FW_EXTRA_POST для добавления строчки в nft rule или iptables rule до и после правила zapret. Можно использовать как локальные переопределения для одной или более операций в своих custom скриптах.
Например, вам очень нужно дурить DPI только для клиентов с одной подсети. Если используется postnat режим, сначала надо маркировать пакеты каким-то битом, не конфликтующим с nfqws, а
затем добавлять фильтр по mark.

Чтобы исключить конфликты по номерам портов , демонов и очередей введена динамическая аллокация через хелперы alloc_dnum, alloc_qnum alloc_tpws_port.

Новая функция zapret_custom_firewall_nft_flush предназначена для зачистки своих цепочек и set-ов. Нужна только, если таковые есть. Стандартные цепочки zapret чистятся автоматически.

Новые скрипты получения ip и host листов get_refilter_ipsum.sh , get_refilter_domain.sh

Багфиксы.
Зависание tpws/nfqws с 100% cpu usage, если хостлист в gzip и содержит комментарий.
Исправлено применение autottl при смене профиля на лету.
tpws: исправлено не-применение MSS в transparent proxy mode.

zapret-win-bundle. Обновлен preset-russia на поддержку discord voice. Фильтруется по портам и ipset.
Добавлен killall.exe и reload_lists.cmd для перечитки листов без убивания процесса. Может не работать с сервисом и scheduled task !

32-битная версия под windows : GitHub - bol-van/zapret-win32

Сделан минимальный вариант запуска tpws на openwrt для систем с ограниченным местом на диске.
init.d/openwrt-minimal
Требования к диску от 120 до 200 кб. 200 кб - для iptables и ipv6

Управление конфигом tpws через UCI : /etc/config/tpws. Управление фаерволом через файлы /etc/firewall.user для iptables и /etc/nftables.d/90-tpws.nft для nftables

Собираюсь убирать все это хозяйство с HTTP,HTTPS,QUIC,MODE
Оно создавалось под вариант, когда не было мультистратегий и фильтров.
Сейчас натягивают сову на глобус, пытаясь запихнуть в QUIC незапихуемое только потому, что там udp. Это полнейший misuse и трэш.
Будет несовместимое изменение, полностью ломающее старый конфиг.
Конфигурация будет приближена к winws.
Отдельно настраиваем перехват по портам и отдельно опции единственного инстанса nfqws и/или tpws.
Стандартный autohostlist будет в виде переменной $AUTOHOSTLIST, стандартный hostlist - $HOSTLIST. Куда надо, туда и воткнете. Будете сами думать куда. Как в винде.
Скачивание сетов/листов будет отдельно настраиваться.

Кастомы останутся, но уже без MODE=custom. Достаточно их наличия.
Могут быть варианты, не вписывающиеся даже в новую схему.
Тот же дискорд требует особого ipset. Проводить в конфиг - это слишком частно, такого не будет.
На винде ipset идет через параметр --ipset winws, а на не винде это порочная практика. Естественно, по незнанию и по упрощению будут насиловать несвойственным образом, но это ненормально. Надо использовать kernel ipsets.
Думаю воткну в инсталятор проверку на наличие параметра --ipset и принудительный отказ продолжать. Иначе один кто-то напишет, а потом по сети этот копипастный трэш будет распространяться.

Масштабное переосмысление системы запуска под linux,openwrt,macos.
Конфиг потерял совместимость.
Инсталлятор при замещении /opt/zapret будет предупреждать о несовместимости параметров и отказываться их сохранять. Придется настраивать заново.

Основная причина рефакторинга - приведение конфига к функции мульти-стратегий.
Больше не надо разделять на инстансы http, quic и прочее.
Не надо натягивать сову на неестественные места. В сети распространились конфиги, где дискорд пытаются засунуть в QUIC.

Больше нет никаких http, https, quic.
Есть отдельно настраиваемые параметры запуска tpws, tpws-socks, nfqws и параметры перехвата трафика через ядро (iptables, nftables).
Очень похоже на вариант winws на windows.
Параметра MODE тоже больше нет. Стандартные режимы имеют свои выключатели и включаются независимо, а custom scripts применяются просто по факту их наличия в custom.d
Можно легко комбинировать tpws и nfqws вместе, и потом на эту систему подвесить еще tpws socks для получения обходного прокси.

custom скрипты inherit больше не нужны. Если их не убрать, будет рекурсивное зацикливание.

Применение стандартных хостлистов идет через маркер <HOSTLIST> в конфиге. Скрипты подставляют на его место фактические параметры листов из ipset в зависимости от MODE_FILTER и убирают, если не задана фильтрация по хостлистам.

Особо читайте раздел “Выбор параметров” в readme.txt, а так же docs/quick_start.txt.

Еще одно слабое место остается в nfqws и tpws.
При дублировании хостлистов по профилям они дублируются и в памяти.
Если листы большие - занимаемая память увеличивается кратно.
Так сделано из-за обьединения всех листов одного типа.
Если 1 профиль имеет хостлист a и b, а другой имеет b, то фактически это разные хостлисты в памяти, поскольку список “a+b” - не a и не b. Там не отделить одно от другого.
Надо хранить все листы в памяти раздельно и проверять несколько штук в 1 профиле тоже раздельно. И делать дедупликацию. Не загружать заново.
Аналогично и с ipset

В blockcheck сделана поддержка DoH.
Она включается автоматически, если обнаружена подмена DNS.
Чтобы включить или выключить принудительно, можно использовать переменную
SECURE_DNS=0|1
В код зашит список из 5 открытых ресолверов DoH. Проверяются все по очереди до первого работающего. Этот и используется.
Переопределить список для поиска можно в переменной DOH_SERVERS. Задать конкретный сервер можно через DOH_SERVER.

Технически ресолвинг опирается на обновленный mdig и выполняется так :
mdig --family=6 --dns-make-query=rutracker.org | curl --data-binary @- -H "Content-Type: application/dns-message" https://cloudflare-dns.com/dns-query | mdig --dns-parse-query

Поэтому он не требует никакого специального софта и может работать на openwrt без плясок.
Встроенная поддержка doh в curl может во-первых не быть, во-вторых он будет каждый раз призадумываться. В blockcheck сделано кэширование DNS записей, и этот вариант не очень сочетается.

В blockcheck сделана фильтрация только по IP:port тестируемого в настоящий момент домена.
Все остальное больше не трогается. Не рушит на час работу броузера.

upcoming release 67 notes

Самое главное изменение - переделана система внутреннего управления листами в nfqws и tpws.
Если раньше листы одного профиля кидались в общую неделимую кучу и загружались заново для каждого следующего профиля, то теперь листы все загружаются отдельно, исключая повторы.
Если раньше вы писали <HOSTLIST> в 3 профилях и использовали большой РКН лист, то требуемая память умножалась на 3 и могла доходить до внушительных для слабых систем значений. Теперь это больше не так.

Спойлер
--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-fooling=md5sig <HOSTLIST> --new \
--filter-tcp=443 --dpi-desync=fake,disorder2 --dpi-desync-fooling=md5sig <HOSTLIST> --new \
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 <HOSTLIST> --debug

lists summary:
hostlist file /opt/zapret/ipset/zapret-hosts-user-exclude.txt
hostlist file /opt/zapret/ipset/zapret-hosts.txt.gz
hostlist file /opt/zapret/ipset/zapret-hosts-user.txt
profile 1 include hostlist /opt/zapret/ipset/zapret-hosts.txt.gz
profile 1 include hostlist /opt/zapret/ipset/zapret-hosts-user.txt
profile 1 exclude hostlist /opt/zapret/ipset/zapret-hosts-user-exclude.txt
profile 2 include hostlist /opt/zapret/ipset/zapret-hosts.txt.gz
profile 2 include hostlist /opt/zapret/ipset/zapret-hosts-user.txt
profile 2 exclude hostlist /opt/zapret/ipset/zapret-hosts-user-exclude.txt
profile 3 include hostlist /opt/zapret/ipset/zapret-hosts.txt.gz
profile 3 include hostlist /opt/zapret/ipset/zapret-hosts-user.txt
profile 3 exclude hostlist /opt/zapret/ipset/zapret-hosts-user-exclude.txt

Кроме того сделана автоматическая перечитка всех листов при изменении времени модификации файлов. HUP больше не нужен.
Исчезновение какого-либо файла листа или потеря доступа к нему больше не является фатальной проблемой. Раньше демоны в этом случае аварийно завершались. Сейчас в этой ситуации ничего страшного не случится. Будет использоваться копия в памяти. При появлении файла или возобновлении доступа он опять будет проверен на время изменения и при необходимости перегружен.
Перегрузка выполняется не сразу, а только по факту использования данного листа.

Все сказанное полностью распространяется и на user mode ipsets.

Параметры --filter-tcp, --filter-udp теперь берут список портов или диапазонов портов через запятую.
Особый знак * есть синоним 1-65535.

В конфиге в опциях tpws и nfqws введен еще 1 маркер <HOSTLIST_NOAUTO>.
Он аналогичен <HOSTLIST>, только ipset/zapret-hosts-auto.txt для текущего профиля вставляется как обычный лист, что позволяет выключить логику распознавания блокировок.
Если другой профиль обновил автолист, остальные профили принимают изменения автоматически, поскольку теперь это хранится в одной области памяти без дублирования.

blockcheck теперь дурит только IP:port тестируемого домена. Все остальное не затрагивается.
Введена поддержка DoH серверов, которая включается автоматически при обнаружении подмены DNS.
Элевация до рута сохраняет переменные исходного юзера. Больше не надо получать сначала рутовый шелл, чтобы скармливать переменные blockcheck.
blockcheck не проводит элевацию до рута, если SKIP_PKTWS=1 или система MacOS (тк там всегда только tpws)

Репозиторий zapret-win32 удален. Его содержимое перемещено в основной репозиторий в binaries/win32.
win64/zapret-winws так же удален. Его содержимое осталось только в zapret-win-bundle.

nfqws: исправлено вероятное падение при включении опций --hostcase, --hostnospace, --domcase

В nfqws, tpws поддерживается чтение конфига из файла через первый и единственный параметр @<config_file>

release 68

Удалены binaries. Binaries теперь только в релизах, собираемых через github actions.
Русская документация переведена в markdown.
nfqws,tpws: альтернативное использование знака ‘$’ для чтения параметров запуска из файла :$<config_file>
uninstall_easy.sh: предложение удалить зависимости на openwrt
install_easy.sh: предложение скачивать хостлисты в режиме фильтрации autohostlist
Багфиксы

На традиционных *nix платформах по-прежнему можно использовать основную репу без бинариков. Их можно собрать самому, имея cc, make и необходимые dev пакеты : zlib1g-dev libcap-dev libnetfilter-queue-dev. install_easy.sh при отсутствии бинариков сам запустит make. Но установка dev пакетов и компилятора - на вас.
Так же актуализирована и дока по сборке на openwrt под SDK в docs/compile

zapret v69

  • nfqws,tpws : поддержка сплита на нескольких позициях : multisplit и multidisorder
  • nfqws : переименование split => fakedsplit , disorder => fakeddisorder. старые варианты остаются как синонимы.
  • nfqws : депрекация --dpi-desync-split-http-req, --dpi-desync-split-tls. старые параметры добавляют split позиции к списку.
  • nfqws : split2 и disorder2 становятся синонимами multisplit и multidisorder. сохраняется автоматическая split позиция 2, если не указано --dpi-desync-split-pos.
  • nfqws : отмена seqovl без отмены desync в случае превышения MTU. только для Linux.
  • nfqws : seqovl берет позиционные маркеры для disorder и только число для split
  • tpws : депрекация --split-http-req , --split-tls. старые параметры добавляют split позиции к списку.
  • tpws : --tlsrec берет позиционные маркеры, а не только фиксированные смещения
  • tpws : депрекация --tlsrec-pos. старый параметр создает абсолютный положительный маркер.
  • tpws : починка не срабатывающего мультисплита через --fix-seg
  • nfqws,tpws : назначение владельца лог файлам и автохостлисту после парсинга всех опций
  • nfqws,tpws : установка переменной окружения EXEDIR для использования в @config
  • dvtws : установка рандомного поля ip_id вместо нулевого
  • repo : бинарники для android API level 21+ (Android 5.0)
  • install_easy : поддержка APK packet manager в openwrt
  • blockcheck : убран вопрос “игнорировать сертификаты”
  • blockcheck : убраны переменные IGNORE_CA, CURL_VERBOSE. вместо них добавлена переменная CURL_OPT.
  • blockcheck : поддержка новых стратегий multisplit
  • blockcheck : переработка порядка тестирования стратегий
  • blockcheck : показ всех рабочих стратегий в summary
  • багфиксы

zapret v69.1

  1. tpws : исправлена логика процессинга хостлистов в режиме --socks5-hostname и логика обработки неизвестного протокола с хостлистами.
  2. 10-keenetic-udp-fix : лечащая добавка для кинетика против отсутствия маскарада без ndmmark

zapret v69.2

  • nfqws,tpws: новый параметр --skip для временного исключения профиля без удаления параметров
  • nfqws: новый параметр --methodeol. убрать пробел после Host: и добавить \n перед методом
  • init.d: не использовать pgrep в sysv для совместимости с busybox (keenetic, прошивки, alpine)

zapret v69.4

  • nfqws: обрамление фейками обоих сегментов в fakedsplit/fakeddisorder
  • nfqws: задание содержимого фейков в fakedsplit/fakeddisorder через --dpi-desync-fakedsplit-pattern
  • багфиксы

На некоторых операторах такой зоопарк, что без обрамления обоих сегментов fakedsplit не пробивает.
Долго думал почему. Резал и по midsld. Нифига не работало.
Как он определяет какие фейки, какие нет, если все идет подряд с одинаковой длиной и sequence, а во втором куске нет полного имени хоста ? Но по факту если второй кусок тоже облепить, то работает

zapret v69.5

  • nfqws,tpws: опция проверки параметров командной строки без фактического запуска --dry-run
  • install_easy: проверка параметров командной строки tpws и nfqws

zapret v69.6

  • nfqws: Установка NETLINK_NO_ENOBUFS для NFQUEUE. Решает проблему с аварийным выходом процесса на некоторых системах (keenetic).
  • init.d: Унификация custom скриптов для linux. Удалены init.d/{openwrt,sysv}/custom.d.examples. Скрипты теперь имеют формат как раньше для sysv, примеры находятся в `init.d/custom.d.examples.linux’. Совместимость со старым openwrt вариантом сохраняется. Но копипастные инструкции немного слетят.
  • init.d: Новый custom скрипт 20-fw-extra. Например, для тех, кому нужно дурить трафик через nfqws только с одного входящего интерфейса и не дурить с остальных.
  • init.d: Новый custom скрипт 50-wg4all. Ищет в ядре udp пакеты wireguard handshake initiation на любые порты и перенаправляет на nfqws.

Пояснения на счет 20-fw-extra.
Меня не раз спрашивали что делать, если надо дурить на nfqws только одну внутреннюю сеть, а другую нет. Чтобы был публичный wifi с ограничениями и непубличный wifi для своих, например. Обычно я предлагал отказаться от скриптов и запускать руками.
Но теперь эта задача может быть решена и на уровне скриптов.
Главная проблема - отсутствие возможности в стандартном варианте задавать свои условия ip/nf tables. Вторая проблема - невозможность фильтрации по внутренним IP в варианте nftables при использовании схемы postnat.
Задача решается примерно так :

  1. Разнести их на разные подсети и интерфейсы. Так проще будет понять нужно ли им дурение. Хотя, если вы можете назначать “своим” особые IP адреса, можно и по ним тоже сечь.
  2. Сделать NFQWS_ENABLE=0 в config.
  3. Переписать init.d/custom.d.examples.linux/20-fw-extra в custom.d
  4. Настроить config :
NFQWS_ENABLE_OVERRIDE=1
FW_EXTRA_PRE_NFQWS_IPT="-m mark --mark 0x10000000/0x10000000"
FW_EXTRA_PRE_NFQWS_NFT="mark and 0x10000000 != 0"
  1. Отдельными средствами маркировать битом 0x10000000 пакеты, предназначенные для дурения на этапе до POSTROUTING. Для проходящего трафика это можно сделать в PREROUTING, для исходящего с самой системы - в OUTPUT.

50-wg4all - это простое решение для дурения любого wireguard, не требующее настройки по портам и чему-либо еще. Переписал и работает. Оверхеда на системе практически не создает.
Единственная возможная настройка - стратегия дурения в config : NFQWS_OPT_DESYNC_WG.
По умолчанию - --dpi-desync=fake. Туда можно добавить репиты по необходимости.

zapret v69.7

  • nfqws,tpws: параметр --comment. любые комментарии в любом месте.
  • nfqws: предупреждение о возможной “ТРЭШ ФЛУД” конфигурации. Когда пишите --dpi-desync-any-protocol без --dpi-desync-cutoff и используете методы с фейками. Это не всегда плохо, но когда плохо, то очень плохо.
  • winws: многократное снижение использования процессора за счет отказа от процессинга пустых TCP ACK пакетов в --wf-tcp
  • nfqws: в android версии исправлен bad system call при завершении процесса

zapret v69.8

  1. winws: обработка пустых исходящих TCP с FIN или RST в --wf-tcp для нужд conntrack
  2. repo: сборка под mips-rlx5281 (lexra)