Zapret (DPI-bypass для YouTube)

Zapret (DPI-bypass для YouTube)

0.4 NEW — kernel-level обход DPI для всего трафика к YouTube CDN. Заменяет/дополняет AntiDPI, работает с любыми клиентами на хосте (yt-dlp, наш uTLS, OS-resolver).

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 процедуру:

  1. apt-get update + apt-get install -y nftables git make gcc libnetfilter-queue-dev libnfnetlink-dev libcap-dev zlib1g-dev (только если зависимости отсутствуют).
  2. git clone --depth=1 https://github.com/bol-van/zapret.git /opt/zapret (или git pull --ff-only если уже клонировано).
  3. make -j -C /opt/zapret/nfq/opt/zapret/nfq/nfqws.
  4. 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:

  1. Пишет hostlist (googlevideo.com, youtube.com, … + ваши из hostlist_path) в database/zapret/hostlist.txt.
  2. Создаёт изолированную nftables-таблицу inet lampac_zapret с правилом:
    meta l4proto tcp tcp dport { 443, 80 } queue num 200 bypass
    Флаг bypass означает «если nfqws не слушает — пропустить пакет», чтобы упавший демон не ронял весь сетевой стек.
  3. Запускает nfqws --qnum=200 --dpi-desync=fake,split2 --dpi-desync-ttl=8 --dpi-desync-fooling=md5sig,badseq --hostlist=... под supervised goroutine с экспоненциальным backoff (1с → 30с) при крэше.
  4. На 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 падает сразу при старте:

  1. permissive = false → увидите hard-fail в логе с конкретной причиной (нет CAP_NET_ADMIN, конфликт NFQUEUE-номера, и т.п.).
  2. Запустите вручную с теми же флагами что в логе 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.