nfqws2 / zapret2 — справочник для zapret-gui

SkillDev tools

Complete reference for nfqws2 / zapret2 in the zapret-gui project (Keenetic routers on Entware). Use for any queries about: nfqws2/zapret2 strategies, catalogs/* directories, the strategy scanner (strategy_scanner), argument building (nfqws_manager, strategy_builder, blob_registry, lua_manager), fir

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the nfqws2 / zapret2 — справочник для zapret-gui skill

What this skill tells your AI

The instructions your AI receives, as published by avatardd/zapret-gui in .claude/skills/nfqws2-strategies/SKILL.md and read by ahel’s review.

Этот файл — единый источник истины о том, как nfqws2 (zapret2) реально работает и как с ним правильно обращаться в проекте zapret-gui. Читать перед тем, как трогать сборку аргументов, сканер стратегий, firewall, каталоги или объяснять пользователю «почему не работает».

Источники истины (в порядке убывания авторитета):

  1. bol-van/zapret2 — движок nfqws2: docs/manual.md, lua/zapret-antidpi.lua (комментарий перед каждой функцией = спецификация её аргументов), lua/zapret-auto.lua, lua/zapret-lib.lua, lua/zapret-obfs.lua, init.d/custom.d.examples.linux/, config.default.
  2. nfqws2 -? (v1.0.4, актуальный релиз на 2026-08) — дамп опций CLI, §3 ниже.
  3. nfqws2-keenetic — поведенческий эталон под Keenetic (НЕ путать пути — у них своя раскладка S51nfqws2 / /opt/etc/nfqws2/…; у нас её НЕТ).
  4. Наш код в core/nfqws_manager.py, strategy_scanner.py, strategy_builder.py, blob_registry.py, firewall.py, diagnostics.py, blockcheck2.py, autostart_manager.py, lua_manager.py, hostlist_manager.py, catalog_loader.py, config_manager.py.

0. Версии zapret2: что изменилось после 0.9.5.2

Актуальный релиз — v1.0.4 (2026-07-31). Master после него (2026-08-02) — только правки документации, кода не трогали. Предыдущий ориентир этого справочника был v0.9.5.2 (2026-04-30).

Главное для нас: набор CLI-опций НЕ менялся между 0.9.5.2 и 1.0.4 — единственная переименованная опция --writeable--writable. Набор C-функций Lua (103 штуки) и таблицы --filter-l7 / --payload тоже не менялись. То есть §3–§7 остаются валидными; поменялась семантика таймеров, send:delay, поведение при недоступном blob и реасме.

0.1 Хронология релизов (docs/changes.txt)

ВерсияДатаЧто важно для zapret-gui
1.02026-06-07lua_compat_ver 5→6: WRITEABLEWRITABLE (опция --writeable--writable, env WRITABLE, хелпер writeable_file_namewritable_file_name). Параметр delay у send. Фикс oob при urp=b в rawsend_dissect_segmented.
1.0.12026-06-08Фикс use-after-free, если таймер удаляют изнутри его же таймер-функции.
1.0.22026-06-16Фикс дефолта --lua-gc: было 60 мс вместо 60 с. В 1.0 и 1.0.1 GC Lua крутился ~16 раз в секунду — заметная лишняя нагрузка на CPU роутера. Повод не сидеть на 1.0/1.0.1.
1.0.32026-07-20timer_set() принимает не только строку-имя, но и саму функцию (запоминается по ссылке). Очередь отложенных пакетов реасма ограничена 64 пакетами (анти-DDoS). 50-discord-media: добавлен UDP-диапазон 19294-19344.
1.0.42026-07-31nfqws2 обрывает execution plan в C-коде, если blob недоступен (раньше падало уже в Lua). desync_timer_name() включает имя инстанса. blockcheck2: graceful shutdown по TERM/QUIT. Откат cygstart-эксперимента из 1.0.3.
master после 1.0.42026-08-02Только docs. Плюс в blockcheck2 (ещё не в релизе): в BATCH=1 тесты TLS1.3 / HTTP3 автоматически выключаются с WARNING, если curl их не умеет.

0.2 Что из этого меняет наши инварианты

  1. Совместимость lua↔бинарник — по-прежнему NFQWS2_COMPAT_VER, сейчас 6. Наши bundled-lua (import/lua/zapret-lib.lua:1) уже на 6 — паритет с 1.0.x есть.
  2. ⚠️ Ловушка _protected_core_lua. core/asset_importer.py защищает core-lua на диске, только если её NFQWS2_COMPAT_VER_REQUIRED строго больше нашей bundled. Внутри одной compat-версии (все 1.0…1.0.4 = 6) защиты нет — bundle затирает upstream-копию. То есть отставший бандл молча откатывает пользователю апстримный фикс, не изменив ни одной проверяемой версии. Единственная защита — держать core-lua дословной копией релиза. Сейчас все шесть файлов (zapret-lib, zapret-antidpi, zapret-auto, zapret-obfs, zapret-pcap, zapret-tests) побайтово равны v1.0.4; sha256 запиннены в tests/test_asset_importer_lua_compat.py (_UPSTREAM_LUA_TAG / _UPSTREAM_LUA_SHA256), там же — инструкция по обновлению на новый релиз. Наши собственные функции живут в отдельных файлах (custom_funcs.lua, zapret-multishake.lua, …) — core-lua правится только синхронизацией с апстримом.
  3. --intercept=0 + таймеры — см. §12.1: валидация больше не гарантирует мгновенный выход.
  4. Недоступный blob (1.0.4) — инстанс сносится в C-коде, до Lua дело не доходит. --intercept=0 этого по-прежнему не ловит (блобы резолвятся по-пакетно), но в --debug теперь видно раньше и однозначнее.
  5. Discord UDP 19294-19344 — апстрим догнал наш дефолт nfqws.ports_udp (см. §10.4), расхождения больше нет.

1. nfqws2 vs nfqws1 — ключевые отличия

nfqws2 не имеет хардкод-стратегий. Параметров --dpi-desync=fake,split2, --dpi-desync-split-pos=, --dpi-desync-fooling= больше нет — это синтаксис старого nfqws1 / winws. Всё дурение живёт в Lua-скриптах, а CLI лишь загружает их и вызывает функции.

Что изменилось:

  • Ядро nfqws2 (dvtws2 на BSD, winws2 на Windows) — только перехват и диссекция; «дурение» вынесено в Lua. Это даёт радикально большую гибкость.
  • Параметры --dpi-desync-* заменены на:
    • --lua-desync=<function>[:arg1[=val1]:argN[=valN]] — вызов Lua-инстанса (десинк-функции из zapret-antidpi.lua или своей);
    • --lua-init=@file.lua | <lua_code> — однократная инициализация (можно несколько раз, порядок сохраняется, поддержан .gz);
    • --blob=<name>:[+ofs]@file | 0xHEX — загрузка двоичных данных в Lua-переменную.
  • Понятие payload type (tls_client_hello, http_req, quic_initial, …) пришло на смену «протоколу соединения» в фильтрах.
  • Десинхронизации больше не «фаза 1 / фаза 2». Каждый --lua-desync — отдельный инстанс, выполняются последовательно, можно вызывать одну функцию много раз с разными параметрами.
  • Старые start/cutoff стали диапазонами: --in-range и --out-range.
  • Профили (мультистратегия) и хостлисты сохранены, разделитель — --new. Логика автохостлиста изменена: профиль с автолистом захватывает только соединения с известным hostname; до его получения — мимо.
  • --server инвертирует трактовку направлений и фильтрации.
  • Автоматическая TCP-сегментация в zapret-lib.lua: размер blob не важен, всё нарезается по MSS.
  • Поддержка многопакетных пейлоадов (kyber в tls_client_hello, многопакетный quic_initial) с авто-reasm и replay.

Состав стандартной Lua-библиотеки (/opt/zapret2/lua/)

ФайлСодержимое
zapret-lib.luaБазовые примитивы. ПЕРВЫМ среди --lua-init: rawsend, tcpseg, send, drop, диссекторы TLS/QUIC, маркеры, утилиты.
zapret-antidpi.luaГотовые desync-аналоги nfqws1: fake, multisplit, multidisorder, fakedsplit, fakeddisorder, hostfakesplit, tcpseg, oob, wsize, wssize, syndata, rst, synack, synack_split, udplen, dht_dn, http_*, pktmod, pass, luaexec. Без неё --lua-desync=fake:... — вызов несуществующей функции: тихий 0%.
zapret-auto.luaОркестраторы (circular, repeater, condition, per_instance_condition, stopif) и iff-функции (cond_random, cond_payload_str, cond_lua, …).
zapret-obfs.luaОбфускаторы: wgobfs, ippxor, udp2icmp, synhide. Надмножество zapret-wgobfs.lua — если грузим obfs, то wgobfs.lua грузить НЕ надо (двойное определение).
zapret-pcap.luaЗапись pcap. Требует --writable (до 1.0 — --writeable).
zapret-tests.luaТесты C-функций.

Наши расширения (import/lua/, разворачиваются на lua_path через core/asset_importer.py)

ФайлЭкспорт
zapret-multishake.luahostfakesplit_stealth/chaos/multi/gradual/decoy/blend/soft, snifakesplit
fakemultisplit.luafakemultisplit
fakemultidisorder.luafakemultidisorder
zapret-16kb.luaflood_white, ttl_ladder, white_sandwich, seqovl_white
zapret-rst-flood.luarst_flood
zapret-auto.luacircular/condition/repeater/stopif/per_instance_condition + детекторы/хосткеи (standard_*_detector, cond_*, automate_*). Триггер-загрузка по этим функциям; companion-bundle зависит от его standard_*_detector, поэтому zapret-auto до-грузится и в orchestrator-блоке (для circular_with_preload, которого нет в его экспорте)
custom_funcs.luaрасширенный каталог приёмов проекта (http_*/tls_*/discord_*/multisplit_tls/tlsrec/rst_desync/…); зависит только от core
custom_diag.luadiag_once, diag_always (диагностические no-op)
Companion'ы оркестратора circular (грузятся bundle'ом, см. §10): combined-detector.lua, domain-grouping.lua, strategy-stats.lua, strategy-lock-manager.lua, silent-drop-detector.lua

Core = только zapret-lib.lua + zapret-antidpi.lua (как эталонный blockcheck2 pktws_start): грузятся при наличии любого --lua-desync. Всё остальное — включая zapret-auto/custom_funcs/custom_diag/init_vars — условно (раньше эти четыре были в core «всегда»).

init_vars.lua — value-триггер (НЕ в _EXTENSION_LUA_FILES): объявляет именованные паттерн-переменные (tls_google, tls_rnd*, bin_max, fake_inverted_tls, …), используемые как blob=/pattern=/seqovl_pattern=<NAME>. Грузится сразу после core ТОЛЬКО если стратегия ссылается на такое имя (см. _INIT_VARS_NAMES/_NAMED_PATTERN_RE в nfqws_manager.py). Встроенные блобы (fake_default_*) его не требуют. Сторож — TestInitVarsTrigger.

Инвариант: набор-триггер каждого файла (карта _EXTENSION_LUA_FILES в nfqws_manager.py:56) обязан совпадать с его глобальными функциями (grep '^function ' import/lua/<file>.lua) — иначе вызов «выпавшей» функции = тихий 0%. Сторож — tests/test_nfqws_lua_map.py.


2. Архитектура обработки пакета

ядро ОС
  └── iptables/nftables → NFQUEUE №X (= --qnum)
        └── nfqws2
              ├── dissect (ip/ip6/tcp/udp/icmp + payload)
              ├── conntrack (счётчики, направления, MSS, scale, hostname)
              ├── распознавание payload type
              ├── reasm / decrypt (для tls_client_hello, quic_initial)
              ├── выбор профиля по фильтрам (1..N → default 0)
              ├── последовательно: Lua-инстансы (--lua-desync)
              │     каждый возвращает вердикт PASS / MODIFY / DROP
              │     (агрегация: DROP > MODIFY > PASS)
              └── возврат пакета в ядро

Цикл выбора профиля повторяется при изменении L7-протокола и при получении hostname (макс. 2 «перескока»). Если все инстансы профиля вошли в cutoff или вышли за range — соединение помечается lua cutoff по направлению и больше не дёргает Lua.

Обязательные инварианты (нарушение = тихий 0%)

  1. zapret-lib.lua грузится --lua-init ПЕРВЫМ — он определяет базовые примитивы, на которые опирается zapret-antidpi.lua и наши расширения.
  2. zapret-antidpi.lua подключён, если стратегия вызывает fake, multisplit, multidisorder, … (см. список выше).
  3. Extension-скрипты грузятся ТОЛЬКО при упоминании их функций — карта _EXTENSION_LUA_FILES в nfqws_manager.py. Дедуп --lua-init выполняется в _build_lua_init_args.
  4. circular-оркестратор тащит весь bundle (_ORCHESTRATOR_LUA_FILES). Companion'ы (combined-detector, domain-grouping, strategy-stats, strategy-lock-manager, silent-drop-detector) — НЕ desync-действия, это аргументы detector=/success=/hostkey=/preload= у circular. Грузятся идемпотентно, без require(), существующие — guard'ом.
  5. --qnum N == firewall queue num N. Оба значения берутся из nfqws.queue_num (дефолт 300). Расходящиеся — пакеты идут в очередь, которую никто не слушает → тихий 0%.
  6. Все --blob=NAME:@file декларируются ДО первого --new (декларации глобальные). Иначе fake уходит пустым.

Встроенные блобы (НЕ требуют --blob)

  • fake_default_tls — TLS ClientHello от Firefox без kyber, SNI = www.microsoft.com.
  • fake_default_http — HTTP-запрос на www.iana.org.
  • fake_default_quic0x40 + 619 × 0x00.

Любые другие имена (tls_google, stun_pat, quic_vk, …) обязаны иметь --blob=NAME:@bin/file.bin. Дозаявка по имени в проекте автоматизирована — core/blob_registry.build_blob_declarations().

Поведение при недоступном блобе (изменено в 1.0.4): если подстановка %blob / #blob в аргументах инстанса не резолвится, C-код обрывает execution plan ещё до входа в Lua (раньше падало внутри Lua с blob '<name>' unavailable). Практически: незаявленный блоб = инстанс молча не выполняется, соседние инстансы профиля тоже не отрабатывают. --intercept=0 это НЕ ловит (блобы резолвятся по-пакетно) — ловит только --debug на живом трафике либо наш blob_registry.


3. Полный CLI nfqws2 (nfqws2 -?, v1.0.4)

Дамп v1.0.4 движка bol-van/zapret2. Версия печатается: github version v1.0.4 (<git-hash>) lua_compat_ver 6. Опции с [0|1]/ [=val] имеют необязательный аргумент (без него — дефолт, обычно =1).

Набор опций идентичен v0.9.5.2, кроме переименования --writeable--writable. Новых опций в 1.0.x не появилось.

⚠️ Совместимость lua↔бинарник (NFQWS2_COMPAT_VER). zapret2 1.0 сменил lua_compat_ver 5→6 (несовместимое изменение: везде WRITEABLEWRITABLE, т.е. флаг --writeable--writable и env WRITABLE; плюс delay в send и фикс oob при urp=b). zapret-lib.lua:1 проверяет NFQWS2_COMPAT_VER_REQUIRED и падает с «Incompatible NFQWS2_COMPAT_VER», если lua и бинарник из разных релизов. Наши bundled-lua (import/lua/) должны совпадать по compat с устанавливаемым бинарником; core/asset_importer не понижает core-lua, если на диске уже лежит более новый релиз (см. _protected_core_lua, issue #151). Но защита работает только на переходах compat-версии — внутри одной (все 1.0…1.0.4 = 6) bundle перезаписывает upstream-lua, поэтому core-lua держим дословной копией релиза с sha256-пиннингом в тестах, см. §0.2.

3.1 Общие / служебные

ОпцияНазначение
@<config_file> / $<config_file>Читать опции из файла. Должен быть единственным аргументом — остальные игнорируются. Используется nfqws2@.service (systemd). У нас НЕ используется (всё inline через compose_command).
--debug=0|1|syslog|android|@<file>Уровень/назначение отладочного лога. Бэйр --debug=1. Файл --debug=@file можно удалить — продолжит писать с нуля.
--versionПечать версии и lua_compat_ver, выход.
--dry-runПроверить параметры и выйти с кодом 0 при успехе. Lua-синтаксис НЕ проверяется (только наличие файлов и парсинг опций).
--comment=<text>No-op, для читабельности конфига.
--intercept=0|10 = выполнить только lua-init и выйти, NFQUEUE не открывается. У нас на этом построена валидация стратегий — NFQWSManager.dry_run(), API POST /api/strategies/<sid>/validate (см. §12.1). ⚠️ Если lua-init завёл таймеры, процесс НЕ выходит сразу: он обслуживает таймеры, пока не останется ни одного (периодический = никогда).
--qnum=<n>Номер NFQUEUE (== firewall queue num).
--daemonДемонизироваться. GUI запускает БЕЗ него (foreground-child + Popen). С ним работает только автозапуск S99zapret (свой --pidfile).
--chdir[=path]Без аргумента — EXEDIR.
--pidfile=<file>PID-файл. У S99zapret/var/run/zapret-nfqws.pid.
--user=<name> / --uid=uid[:gid,…]Сброс root-привилегий. На Entware --user nobody работает (есть в read-only /etc/passwd); кастомных юзеров там нет.
--bind-fix4 / --bind-fix6Фикс выбора исходящего интерфейса для генерируемых пакетов (PBR / multi-WAN). Добавляются в _build_base_args при нескольких WAN.
--fwmark=<int|0xHEX>fwmark anti-loop. Дефолт 0x40000000 (1073741824) — совпадает с нашим nfqws.desync_mark. Не путать с firewall MARK_PROCESSED / MARK_EXCLUDE.
--ctrack-timeouts=S:E:F[:U]Внутр. conntrack: TCP SYN, ESTABLISHED, FIN, UDP. Дефолт 60:300:60:60.
--ctrack-disable[=0|1]Отключить внутренний conntrack.
--payload-disable[=t1,…]Не детектировать типы payload (без аргумента — все).
--reasm-disable[=t1,…]Отключить reasm для tls_client_hello, quic_initial.
--server[=0|1]Серверный режим (инверсия направлений и фильтров).
--ipcache-lifetime=<sec>TTL hop-count / hostname-кэша (дефолт 7200, 0 = вечно).
--ipcache-hostname[=0|1]Кэшировать ip→hostname (нужно стратегиям нулевой фазы).
--filter-ssid=ssid1[,…]Wi-Fi SSID-фильтр (Linux).

3.2 DESYNC ENGINE INIT

ОпцияНазначение
--writable[=dir]Создать каталог для Lua (env WRITABLE). До zapret2 1.0 — --writeable/WRITEABLE.
--blob=<name>:[+ofs]@<file>|0xHEXГлобальная декларация именованного блоба. Поддержан offset +ofs. До первого --new.
--lua-init=@<file>|<lua_text>Загрузить Lua. Порядок сохраняется. Поддержаны gzip-файлы.
--lua-gc=<sec>Интервал GC Lua в секундах (дефолт 60, 0 — отключить). ⚠️ В 1.0 и 1.0.1 дефолт по факту был 60 мс — GC крутился ~16 раз/сек и жёг CPU роутера. Починено в 1.0.2.

3.3 MULTI-STRATEGY (профили)

ОпцияНазначение
--new[=<name>]Разделитель профилей.
--skipНе использовать профиль.
--name=<name>Имя профиля.
--template[=<name>]Сделать профиль шаблоном (для --import).
--cookie[=<str>]Значение desync.cookie для всех инстансов профиля.
--import=<name>Импорт настроек из шаблона. Простые параметры замещаются, списочные (--hostlist=, --filter-tcp=, --lua-desync=) добавляются в конец.
--filter-l3=ipv4|ipv6Фильтр версии IP.
--filter-tcp=[~]p1[-p2]|*Фильтр TCP-портов; ~ = инверсия. Список через запятую.
--filter-udp=[~]p1[-p2]|*Аналогично UDP.
--filter-icmp=type[:code]|*Автоматически включает ICMPv6 (типы/коды разные).
--filter-ipp=proto|*Raw IP-протоколы (НЕ относится к tcp/udp/icmp — для них нужен свой filter).
--filter-l7=p1[,p2…]L7-протокол потока. Полный список — §3.6.
--ipset=<file> / --ipset-ip=<list>Include по IP/CIDR (ipv4+ipv6, gzip, несколько файлов).
--ipset-exclude=<file> / --ipset-exclude-ip=<list>Exclude по IP.
--hostlist=<file> / --hostlist-domains=<list>Десинк только для перечисленных хостов. Поддомены автоматически, ^ в начале — отключает учёт поддоменов, # — комментарий, gzip, несколько.
--hostlist-exclude=<file> / --hostlist-exclude-domains=<list>Исключения.
--hostlist-auto=<file>Автохостлист.
--hostlist-auto-fail-threshold=<n>Фейлов для добавления (дефолт 3).
--hostlist-auto-fail-time=<sec>В пределах N сек (дефолт 60).
--hostlist-auto-retrans-threshold=<n>Ретрансмиссий = провал (дефолт 3).
--hostlist-auto-retrans-reset=0|1RST ретрансмиттеру (дефолт 1).
--hostlist-auto-retrans-maxseq=<n>Дефолт 32768.
--hostlist-auto-incoming-maxseq=<n>Успех если входящий rel-seq > N (дефолт 4096).
--hostlist-auto-udp-out=<n>UDP-провал (дефолт 4).
--hostlist-auto-udp-in=<n>UDP-провал (дефолт 1).
--hostlist-auto-debug=<file>Лог срабатываний (глобальный).

3.4 LUA PACKET PASS MODE (внутрипрофильные фильтры)

Действуют до следующего переопределения того же типа или до конца профиля. В новом профиле сбрасываются на default.

ОпцияDefaultНазначение
--payload=t1[,t2]allКакие payload-типы обрабатывают следующие Lua-функции.
--out-range=<spec>a (всегда)Диапазон по исходящему направлению.
--in-range=<spec>x (никогда)Диапазон по входящему направлению.

3.5 LUA DESYNC ACTION

ОпцияНазначение
--lua-desync=<fn>[:p1[=v1]:p2[=v2]…]Вызов Lua-инстанса. Несколько подряд — последовательно.

3.6 Справочные списки значений

--filter-l7: all unknown known http tls dtls quic wireguard dht discord stun xmpp dns mtproto bt utp_bt.

--payload (типы): all unknown empty known ipv4 ipv6 icmp http_req http_reply tls_client_hello tls_server_hello dtls_client_hello dtls_server_hello quic_initial wireguard_initiation wireguard_response wireguard_cookie wireguard_keepalive wireguard_data dht discord_ip_discovery stun xmpp_stream xmpp_starttls xmpp_proceed xmpp_features dns_query dns_response mtproto_initial bt_handshake utp_bt_handshake.

--reasm-disable: tls_client_hello, quic_initial.

3.7 Правила построения фильтров профиля

  • Профили проверяются строго слева направо, побеждает первый подошедший.
  • Профиль 0 (default) — пустой, никаких действий.
  • Группы фильтров tcp / udp / icmp / ipp объединяются OR между собой. Указание любого блокирует остальные группы — нужно явно прописать --filter-tcp=* если хочешь TCP + что-то ещё.
  • filter-ipp НЕ относится к tcp/udp/icmp.
  • Без автохостлиста профиль с хостлистами не выбирается до получения hostname. Если хост в exclude — стратегия не применяется. С автохостлистом — работает всегда при наличии hostname (счётчики через --hostlist-auto-*).
  • ipset-ы могут смешивать ipv4+ipv6.

4. Диапазоны (--in-range / --out-range)

Формат: [mode<int>](-|<)[mode<int>].

  • - — верхняя граница включительная, < — исключительная.
  • mode:
    • a — always (без числа)
    • x — never (без числа)
    • n — номер пакета
    • d — номер пакета с данными (рекомендуется на Windows из-за --wf-tcp-empty=0)
    • b — байт-позиция переданных данных
    • s — relative sequence (TCP) от начала пакета
    • p — relative sequence верхней границы пакета (s+payload)

Примеры: --out-range=-d10 (первые 10 пакетов с данными), --in-range=-s5556, --out-range=s100-s1000, --in-range=s1<d1 (только до первого с данными).


5. Распознаваемые пейлоады (payload types)

L7-протоколL4Payload-типы
httptcphttp_req, http_reply
tlstcptls_client_hello, tls_server_hello
xmpptcpxmpp_stream, xmpp_starttls, xmpp_proceed, xmpp_features
mtprototcpmtproto_initial
bttcpbt_handshake
quicudpquic_initial
wireguardudpwireguard_initiation, _response, _cookie, _keepalive, _data
dhtudpdht
utp_btudputp_bt_handshake
discordudpdiscord_ip_discovery
stunudpstun
dnsudpdns_query, dns_response
dtlsudpdtls_client_hello, dtls_server_hello
icmp*ipv4, ipv6, icmp

Спец-типы: empty (пустой), unknown. В фильтрах поддерживаются all и known (не empty/unknown).

⚠️ Таблица в docs/manual.mdmanual.en.md) не перечисляет wireguard_data, хотя тип существует и принимается — см. nfq2/protocol.c:60 (l7payload_name[]). Источник истины по именам пейлоадов — именно эта таблица в C-коде, а не мануал. Полный список проверен на v1.0.4 и с 0.9.5.2 не менялся.


6. Маркеры позиции (для pos= в split/disorder/tcpseg)

  • Абсолютный положительный — число с начала пейлоада: 100.
  • Абсолютный отрицательный — от конца: -1 (последний байт), -10.
  • Относительный — относительно логических позиций в известных пейлоадах:
    • method — начало HTTP-метода
    • host, endhost — начало/конец имени хоста
    • sld, endsld, midsld — second-level domain
    • sniext — поле данных SNI extension в TLS
    • extlen — поле длины TLS extensions
  • Арифметика: method+2, endhost-2, sniext+1.
  • Список через запятую: 1,midsld,endhost-2,-10.

7. Передача параметров в Lua-инстансы и блобы

--lua-desync=fn[:arg[=value]:arg=value:…]
  • Каждый arg — строка. Если value не задано — пустая строка.
  • Подстановки C-кода в значениях:
    • %var → значение desync.var (или global var).
    • #var → длина desync.var или global var.
    • Эскейп: \: \% \#.

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
133
Forks
10
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
nfqws2-strategies
Source
github.com/avatardd/zapret-gui