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.3

  1. nfqws,tpws: фиксированные hostlist и ipset. значения указываются в командной строке через запятую и не меняются. --hostlist-domains --hostlist-exclude-domains --ipset-ip --ipset-exclude-ip
  2. номера релизов и commit hash при сборке на github. дата/время сборки при самостоятельной сборке.
  3. облегченный релиз для openwrt и прошивок
  4. sha256sum: контрольные суммы всех файлов внутри binaries