nfqws2 / zapret2 — справочник для zapret-gui
SkillDev toolsComplete 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.
No other account needed.
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,
каталоги или объяснять пользователю «почему не работает».
Источники истины (в порядке убывания авторитета):
- 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. nfqws2 -?(v1.0.4, актуальный релиз на 2026-08) — дамп опций CLI, §3 ниже.- nfqws2-keenetic — поведенческий эталон под Keenetic (НЕ путать пути —
у них своя раскладка
S51nfqws2//opt/etc/nfqws2/…; у нас её НЕТ). - Наш код в
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.0 | 2026-06-07 | lua_compat_ver 5→6: WRITEABLE→WRITABLE (опция --writeable→--writable, env WRITABLE, хелпер writeable_file_name→writable_file_name). Параметр delay у send. Фикс oob при urp=b в rawsend_dissect_segmented. |
| 1.0.1 | 2026-06-08 | Фикс use-after-free, если таймер удаляют изнутри его же таймер-функции. |
| 1.0.2 | 2026-06-16 | Фикс дефолта --lua-gc: было 60 мс вместо 60 с. В 1.0 и 1.0.1 GC Lua крутился ~16 раз в секунду — заметная лишняя нагрузка на CPU роутера. Повод не сидеть на 1.0/1.0.1. |
| 1.0.3 | 2026-07-20 | timer_set() принимает не только строку-имя, но и саму функцию (запоминается по ссылке). Очередь отложенных пакетов реасма ограничена 64 пакетами (анти-DDoS). 50-discord-media: добавлен UDP-диапазон 19294-19344. |
| 1.0.4 | 2026-07-31 | nfqws2 обрывает execution plan в C-коде, если blob недоступен (раньше падало уже в Lua). desync_timer_name() включает имя инстанса. blockcheck2: graceful shutdown по TERM/QUIT. Откат cygstart-эксперимента из 1.0.3. |
| master после 1.0.4 | 2026-08-02 | Только docs. Плюс в blockcheck2 (ещё не в релизе): в BATCH=1 тесты TLS1.3 / HTTP3 автоматически выключаются с WARNING, если curl их не умеет. |
0.2 Что из этого меняет наши инварианты
- Совместимость lua↔бинарник — по-прежнему
NFQWS2_COMPAT_VER, сейчас 6. Наши bundled-lua (import/lua/zapret-lib.lua:1) уже на 6 — паритет с 1.0.x есть. - ⚠️ Ловушка
_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 правится только синхронизацией с апстримом. --intercept=0+ таймеры — см. §12.1: валидация больше не гарантирует мгновенный выход.- Недоступный blob (1.0.4) — инстанс сносится в C-коде, до Lua дело не
доходит.
--intercept=0этого по-прежнему не ловит (блобы резолвятся по-пакетно), но в--debugтеперь видно раньше и однозначнее. - 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.lua | hostfakesplit_stealth/chaos/multi/gradual/decoy/blend/soft, snifakesplit |
fakemultisplit.lua | fakemultisplit |
fakemultidisorder.lua | fakemultidisorder |
zapret-16kb.lua | flood_white, ttl_ladder, white_sandwich, seqovl_white |
zapret-rst-flood.lua | rst_flood |
zapret-auto.lua | circular/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.lua | diag_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%)
zapret-lib.luaгрузится--lua-initПЕРВЫМ — он определяет базовые примитивы, на которые опираетсяzapret-antidpi.luaи наши расширения.zapret-antidpi.luaподключён, если стратегия вызываетfake,multisplit,multidisorder, … (см. список выше).- Extension-скрипты грузятся ТОЛЬКО при упоминании их функций — карта
_EXTENSION_LUA_FILESвnfqws_manager.py. Дедуп--lua-initвыполняется в_build_lua_init_args. 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'ом.--qnum N== firewallqueue num N. Оба значения берутся изnfqws.queue_num(дефолт 300). Расходящиеся — пакеты идут в очередь, которую никто не слушает → тихий 0%.- Все
--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_quic—0x40 + 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 (несовместимое изменение: везде WRITEABLE→
WRITABLE, т.е. флаг --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|1 | 0 = выполнить только 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|1 | RST ретрансмиттеру (дефолт 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-протокол | L4 | Payload-типы |
|---|---|---|
| http | tcp | http_req, http_reply |
| tls | tcp | tls_client_hello, tls_server_hello |
| xmpp | tcp | xmpp_stream, xmpp_starttls, xmpp_proceed, xmpp_features |
| mtproto | tcp | mtproto_initial |
| bt | tcp | bt_handshake |
| quic | udp | quic_initial |
| wireguard | udp | wireguard_initiation, _response, _cookie, _keepalive, _data |
| dht | udp | dht |
| utp_bt | udp | utp_bt_handshake |
| discord | udp | discord_ip_discovery |
| stun | udp | stun |
| dns | udp | dns_query, dns_response |
| dtls | udp | dtls_client_hello, dtls_server_hello |
| icmp | * | ipv4, ipv6, icmp |
Спец-типы: empty (пустой), unknown. В фильтрах поддерживаются all и
known (не empty/unknown).
⚠️ Таблица в docs/manual.md (и manual.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 domainsniext— поле данных SNI extension в TLSextlen— поле длины 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(или globalvar).#var→ длинаdesync.varили globalvar.- Эскейп:
\:\%\#.
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