# 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 вернулся”.