Zapret2 для новичков — 03: перехват пакетов и вердикты (NFQUEUE/WinDivert)

Цель: понять “где” стоит zapret2 и что значит PASS/MODIFY/DROP.

1) Где стоит программа в системе

Linux (nfqws2)

Обычно схема такая:

  1. правила nftables/iptables направляют некоторые пакеты в NFQUEUE
  2. nfqws2 читает их в userspace
  3. программа решает: пропустить/изменить/дропнуть
  4. ядро применяет решение и продолжает обработку

По коду это видно в nfq2/nfqws.c: callback NFQUEUE получает raw байты и вызывает обработчик, который возвращает вердикт.

Windows (winws2)

Аналогичная идея, но вместо NFQUEUE используется перехват на уровне драйвера WinDivert:

  1. драйвер отдаёт пакеты в userspace
  2. winws2 решает, что делать
  3. пакет либо возвращается обратно (modified/unmodified), либо отбрасывается

2) Что такое “вердикт”

В zapret2 есть три ключевых исхода для перехваченного пакета:

  • PASS: “пропусти пакет дальше как есть”
  • DROP: “не отдавай этот пакет дальше” (он как будто “потерялся”)
  • MODIFY: “пропусти, но с изменёнными байтами”

Важно:

  • MODIFY обычно означает, что пакет пересобран из диссекта (reconstruct), а не “чуть поправлен в сыром виде”.

3) Почему отправка фейков не равна MODIFY

fake и похожие функции часто делают:

  • отправляют дополнительный пакет “сами” (rawsend),
  • но не обязаны менять перехваченный пакет.

Поэтому возможна типичная комбинация:

  • fake отправил “лишний” пакет,
  • перехваченный пакет дальше пошёл как обычно (PASS), если его никто не дропнул.

Это нормальная модель: “сделали дополнительный шум” и “не трогали оригинал” (или трогали другим инстансом).

4) Почему нужно ограничивать перехват (производительность)

Перехватывать “весь порт” — дорого:

  • каждый пакет будет идти в userspace,
  • Lua будет запускаться часто,
  • CPU может улететь в 100%.

Поэтому в zapret2 активно используют:

  • фильтры --filter-*
  • --payload=...
  • --in-range/--out-range
  • cutoff (чтобы перестать вызываться после “критической фазы”)

5) Мини‑практика: “увидеть вердикты в логах”

Самое простое для обучения:

  • включить --debug
  • добавить --lua-desync=pass или --lua-desync=pktdebug

Цель: заметить, что каждый перехваченный пакет даёт лог “что пришло” → “какие Lua инстансы вызвались” → “какой verdict вернулся”.