Zapret (DPI-bypass для YouTube)
bol-van/zapret — userspace-демон nfqws, который ловит исходящие TCP-пакеты через NFQUEUE и применяет DPI-desync (fake, split2, disorder, syndata, …). В отличие от AntiDPI — пакетного SOCKS5-прокси на Go — zapret работает на уровне ядра Linux: нет промежуточного TLS-rewrite, не зависит от того, какой клиент инициирует запрос. Если на VPS «не открывается googlevideo.com» — это первый кандидат к включению.
Требования
- Linux VPS с root (или
CAP_NET_ADMINу lampac-процесса). - Ядро с поддержкой
nfnetlink_queueиnftables(любая современная Ubuntu/Debian).
Инсталляция nftables и компиляция nfqws — автоматическая при первом запуске. Никаких apt install руками.
Конфигурация
[online.zapret]
enable = true
# binary = "/opt/zapret/nfq/nfqws" # авто-локация: PATH → /opt/zapret/nfq/nfqws → /usr/sbin/nfqws → ...
# auto_install = true # default — apt install nftables + git clone + make
queue_num = 200
tcp_ports = [443, 80]
strategies = ["fake", "split2"] # см. ниже
desync_ttl = 8 # TTL для fake-пакетов (по middlebox-карте)
permissive = true # log+continue если что-то пошло не так
# extra_args = ["--dpi-desync-fake-tls=/opt/zapret/files/fake/tls_clienthello_www_google_com.bin"]
# hostlist_path = "/opt/lampac/extra_hosts.txt" # опц. — добавить свои домены к встроенному списку
# hostlist_only = false # true → ИСКЛЮЧИТЬ встроенный списокПосле перезапуска lampac в логах увидите:
zapret: nfqws not found — running auto-install
zapret/install: Reading package lists...
zapret/install: Cloning into '/opt/zapret'...
zapret/install: cc -O2 ... -o nfqws
zapret: auto-install complete bin=/opt/zapret/nfq/nfqws
zapret: nfqws supervised, nftables installedПервый запуск — 1–3 мин (apt-update + git clone + make). Дальше используется собранный бинарь, при следующих стартах поднимается за <1 сек.
Что устанавливается автоматически
auto_install = true (default) запускает Linux-only процедуру:
apt-get update+apt-get install -y nftables git make gcc libnetfilter-queue-dev libnfnetlink-dev libcap-dev zlib1g-dev(только если зависимости отсутствуют).git clone --depth=1 https://github.com/bol-van/zapret.git /opt/zapret(илиgit pull --ff-onlyесли уже клонировано).make -j -C /opt/zapret/nfq→/opt/zapret/nfq/nfqws.setcap cap_net_admin,cap_net_raw=eip nfqws(если естьsetcap).
Если apt-get отсутствует (CentOS / Alpine / Arch) — installer вернёт ошибку и в permissive режиме просто отключит zapret. Тогда установите вручную и пропишите binary = "...".
Чтобы навсегда отключить автоустановку:
[online.zapret]
auto_install = false
binary = "/opt/zapret/nfq/nfqws"Как это устроено внутри
При Start() Lampac:
- Пишет hostlist (
googlevideo.com,youtube.com, … + ваши изhostlist_path) вdatabase/zapret/hostlist.txt. - Создаёт изолированную nftables-таблицу
inet lampac_zapretс правилом:Флагmeta l4proto tcp tcp dport { 443, 80 } queue num 200 bypassbypassозначает «если nfqws не слушает — пропустить пакет», чтобы упавший демон не ронял весь сетевой стек. - Запускает
nfqws --qnum=200 --dpi-desync=fake,split2 --dpi-desync-ttl=8 --dpi-desync-fooling=md5sig,badseq --hostlist=...под supervised goroutine с экспоненциальным backoff (1с → 30с) при крэше. - На shutdown —
SIGINTпроцессу +nft delete table inet lampac_zapret(идемпотентно).
nft list table inet lampac_zapret — показывает живые правила.
Стратегии
strategies — список передаётся nfqws --dpi-desync=.... Применяются слева направо. Самые ходовые:
| Стратегия | Что делает |
|---|---|
fake | Шлёт «фальшивку» с маленьким TTL впереди реального ClientHello — DPI запоминает её и пропускает реальный. Базовый блок. |
split2 | Делит ClientHello на два TCP-сегмента так, что SNI лежит на стыке. |
disorder2 | Меняет порядок сегментов. |
syndata | Цепляет данные к SYN-пакету. |
Настройка под TSPU обычно сводится к перебору комбинаций fake,split2, fake,disorder2, syndata,fake,split2. См. оригинальный README zapret.
Сосуществование с AntiDPI
Можно включить оба — они не конфликтуют:
- zapret ловит уже исходящий TCP, без понятия кто его инициировал.
- AntiDPI — это userspace SOCKS5, в который ходит yt-dlp и наш uTLS-стек.
Если zapret «работает» (googlevideo.com отдаёт 200), AntiDPI можно выключить ([antidpi] enable = false) — он просто перестанет тратить CPU на splitting.
Диагностика
# правила установились?
sudo nft list table inet lampac_zapret
# nfqws крутится?
ps aux | grep nfqws
# что он пишет в stderr?
journalctl -u lampac -f | grep -E 'zapret|nfqws'
# тест с хоста: должно работать без таймаутов и 403
curl -v --resolve www.googlevideo.com:443:$(dig +short www.googlevideo.com | head -1) \
https://www.googlevideo.com/Если nfqws падает сразу при старте:
permissive = false→ увидите hard-fail в логе с конкретной причиной (нет CAP_NET_ADMIN, конфликт NFQUEUE-номера, и т.п.).- Запустите вручную с теми же флагами что в логе lampac — увидите его stdout без обёртки.
Ограничения
- Только Linux — nfqueue это netfilter, на macOS/Windows не работает.
- Один процесс nfqws на queue-номер — если у вас уже есть свой zapret из
install_easy.sh, нужно либо отдать lampac свой queue (поменяйтеqueue_num), либо выключить нашenable = falseи вызывать nfqws как раньше. - Если apt и nfqws — в чужом mount-namespace (контейнер без host-network), zapret не сможет ставить nft-правила. Запускайте lampac на host-network или отключайте zapret.