Что такое Zapret 2 (nfqws2)?
Определение автора (bol-van)
zapret2 является пакетным манипулятором, основная задача которого — совершение различных автономных атак на DPI в реальном времени с целью преодоления ограничений (блокировок) ресурсов или сетевых протоколов. Однако этим возможности zapret2 не ограничиваются. Архитектура позволяет выполнять и другие виды пакетных манипуляций. Например, двусторонняя (клиент+сервер) обфускация протоколов с целью их сокрытия от DPI. Возможны и иные применения.
Zapret 2 (nfqws2 на Linux, winws2 на Windows) — авторства bol-van. Автор сознательно называет его не «обходчиком блокировок», а пакетным манипулятором: обход DPI — лишь самое известное, но не единственное его применение. Разберём определение по частям — так становится понятно, что это за инструмент на самом деле.
«Пакетный манипулятор». В основе лежит не «магия обхода», а универсальная способность: перехватывать сетевые пакеты на лету и как угодно их изменять, подменять, разрезать, дублировать, отправлять свои собственные. Всё остальное — надстройки над этим. Поэтому zapret2 не привязан к какой-то одной блокировке или протоколу: он умеет работать с трафиком вообще.
«Автономные атаки на DPI в реальном времени». DPI (Deep Packet Inspection, системы глубокого анализа трафика) — оборудование, которое читает содержимое пакетов и по сигнатурам (домен в SNI у TLS, Host: у HTTP) решает, пропустить соединение или заблокировать. В России это ТСПУ (технические средства противодействия угрозам). «Атака» здесь — не взлом DPI, а приёмы дурения (desync): пакеты формируются так, что DPI собирает из потока искажённую или неполную картину и не находит сигнатуру, тогда как сервер-получатель по правилам TCP/IP восстанавливает всё корректно. «Автономные» — потому что zapret2 работает сам, на стороне клиента, не требуя ни сервера-посредника, ни изменений в приложении: не VPN и не прокси. «В реальном времени» — решение по каждому пакету принимается прямо в момент его прохождения.
«Преодоление ограничений ресурсов или сетевых протоколов». Цель — не только разблокировать конкретный сайт, но и снять ограничения на уровне целых протоколов (например, когда DPI душит или рвёт QUIC, WireGuard, соединения мессенджеров по их сигнатуре, а не по адресу).
«Возможности не ограничиваются обходом». Ключевая мысль автора: та же архитектура пакетного манипулятора годится и для другого. Как пример bol-van называет двустороннюю (клиент + сервер) обфускацию протоколов — маскировку трафика так, чтобы DPI вообще не распознал, что за протокол идёт (в отличие от обхода, где протокол виден, но анализ сбивается). Возможны и иные применения — определение намеренно оставляет их открытыми.
Проще говоря
Zapret 2 — это инструмент, который сидит между вашим приложением и сетью и на ходу переделывает уходящие/приходящие пакеты. Чаще всего его используют, чтобы запутать цензурный DPI и открыть заблокированный сайт. Но по сути это конструктор для манипуляций пакетами, и обход блокировок — только одна из задач, которые он умеет решать.
Технически программа перехватывает сетевые пакеты и модифицирует их так, чтобы DPI не смог их правильно проанализировать, но сервер-получатель понял всё корректно. Официальная документация — docs/manual.md в репозитории автора.
Чем Zapret2 лучше обычного Zapret (winws, nfqws)?
В старом Zapret все методы обхода блокировок зашиты прямо в код на языке C. Программа делает ровно то, что в неё заложил разработчик при сборке. Хочешь что-то изменить — разбирайся в исходниках, правь C-код, компилируй заново. Для большинства пользователей это невозможно, поэтому при каждом обновлении ТСПУ приходится просто ждать, когда автор выпустит новую версию с исправлениями.
В Zapret 2 архитектуру разделили на две части. Ядро на C осталось — оно отвечает за перехват и отправку пакетов, и работает так же быстро, как раньше. А вот вся логика обмана DPI вынесена в отдельные скрипты на языке Lua. Это обычные текстовые файлы с инструкциями: как подменять пакет, как его разрезать, как запутать анализатор. Их можно открыть в любом редакторе, подправить пару строк или полностью заменить на чужой скрипт — и всё заработает без перекомпиляции программы.
На практике это меняет всё. Роскомнадзор обновил ТСПУ и старый трюк сломался — достаточно поправить скрипт и проверить, не дожидаясь нового релиза. Кто-то нашёл рабочий способ обхода — он оформляет его как Lua-файл и делится с сообществом, а остальные просто кидают его в папку. Плюс в комплекте уже идёт библиотека готовых скриптов для работы с TLS, QUIC и HTTP, которые можно свободно комбинировать между собой.
Дополнительно наш GUI делает точно также с пресетами - чтобы быстро обмениваться ими между сообществом и люди сами находили способы решения полностью автономно и могли делиться ими с другими (даже если вдруг с автором что-то случится) без перелопатывания исходного lua-кода. Наш Zapret 2 GUI решает главную проблему любого большого инструмента обхода цензуры — фактора автобуса.
По сути старый Zapret — это заводской инструмент, который делает только то, что в него заложили на этапе сборки. Zapret 2 — конструктор, где способы обхода можно собирать, менять и подстраивать под любые изменения блокировок прямо на ходу.
Установка на Windows | Установка на роутеры | Установка на Android
Начните изучать в следующем направлении (от самого большого объекта к меньшему):
Подробнее прочитайте про стратегии и другие “понятия” Запрета 2:
- структура проекта
- схема обработки трафика
- структура desync и диссекта
- жизненный цикл desync-функции
- основные флаги
- wf
- filter
- exclusions
- out-range
- payload
- desync
- blob
Некоторые интересные факты: последовательность аргументов распознавание mtproto roadmap обучения zapret2_start_cutoff
Как работает Запрет 2:
manual
Учебник (для новичков)
Zapret2 для новичков — 01: сетевой стек (L2–L7) простыми словами ack, окно, MSS) понятным языком WinDivert) reconstruct и что такое desync replay и маркеры Zapret2 для новичков — 06: Lua pipeline (инстансы, аргументы, дебаг) cutoff и почему n2<n3 “вдруг” попадает на ClientHello
Ссылка на оригинал
Техники дурения (стратегии)
syndata fake multisplit multidisorder
start "zapret: http,https,quic" /min "%~dp0winws2.exe" ^
--wf-tcp-out=80,443 ^
--lua-init=@"%~dp0lua\zapret-lib.lua" --lua-init=@"%~dp0lua\zapret-antidpi.lua" ^
--lua-init="fake_default_tls = tls_mod(fake_default_tls,'rnd,rndsni')" ^
--blob=quic_google:@"%~dp0files\quic_initial_www_google_com.bin" ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.discord_media.txt" ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.stun.txt" ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.wireguard.txt" ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.quic_initial_ietf.txt" ^
--filter-tcp=80 --filter-l7=http ^
--out-range=-d10 ^
--payload=http_req ^
--lua-desync=fake:blob=fake_default_http:ip_autottl=-2,3-20:ip6_autottl=-2,3-20:tcp_md5 ^
--lua-desync=fakedsplit:ip_autottl=-2,3-20:ip6_autottl=-2,3-20:tcp_md5 ^
--new ^
--filter-tcp=443 --filter-l7=tls --hostlist="%~dp0files\list-youtube.txt" ^
--out-range=-d10 ^
--payload=tls_client_hello ^
--lua-desync=fake:blob=fake_default_tls:tcp_md5:repeats=11:tls_mod=rnd,dupsid,sni=www.google.com ^
--lua-desync=multidisorder:pos=1,midsld ^
--new ^
--filter-tcp=443 --filter-l7=tls ^
--out-range=-d10 ^
--payload=tls_client_hello ^
--lua-desync=fake:blob=fake_default_tls:tcp_md5:tcp_seq=-10000:repeats=6 ^
--lua-desync=multidisorder:pos=midsld ^
--new ^
--filter-udp=443 --filter-l7=quic --hostlist="%~dp0files\list-youtube.txt" ^
--out-range=-d10 ^
--payload=quic_initial ^
--lua-desync=fake:blob=quic_google:repeats=11 ^
--new ^
--filter-udp=443 --filter-l7=quic ^
--out-range=-d10 ^
--payload=quic_initial ^
--lua-desync=fake:blob=fake_default_quic:repeats=11 ^
--new ^
--filter-l7=wireguard,stun,discord ^
--out-range=-d10 ^
--payload=wireguard_initiation,wireguard_cookie,stun_binding_req,discord_ip_discovery ^
--lua-desync=fake:blob=0x00000000000000000000000000000000:repeats=2🎉 Да! Теперь можем добавить “упрощённые” варианты стратегий!
🆕 Новые стратегии с tcpseg (без резки)
1️⃣ Простой seqovl без dup и без split
# ============================================================
# TCPSEG: ЧИСТЫЙ SEQOVL (БЕЗ РЕЗКИ, БЕЗ ДУБЛИРОВАНИЯ)
# ============================================================
"tcpseg_211_simple": {
"name": "SeqOvl 211 (Simple, No Split)",
"description": "Только overlap 211 байт, без резки и дублирования",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls5:@{BIN_FOLDER}\\tls_clienthello_5.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=211:seqovl_pattern=bin_tls5"""
},
"tcpseg_226_simple": {
"name": "SeqOvl 226 (Simple, No Split)",
"description": "Только overlap 226 байт, без резки и дублирования",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls18:@{BIN_FOLDER}\\tls_clienthello_18.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=bin_tls18"""
},
"tcpseg_286_simple": {
"name": "SeqOvl 286 (Simple, No Split)",
"description": "Только overlap 286 байт, без резки и дублирования",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls11:@{BIN_FOLDER}\\tls_clienthello_11.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=286:seqovl_pattern=bin_tls11"""
},
"tcpseg_308_simple": {
"name": "SeqOvl 308 (Simple, No Split)",
"description": "Только overlap 308 байт, без резки и дублирования",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls9:@{BIN_FOLDER}\\tls_clienthello_9.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=308:seqovl_pattern=bin_tls9"""
},2️⃣ SeqOvl + Dup (БЕЗ резки)
# ============================================================
# TCPSEG: SEQOVL + DUP (БЕЗ РЕЗКИ)
# ============================================================
"tcpseg_211_dup_d1": {
"name": "SeqOvl 211 + Dup (No Split)",
"description": "Overlap 211 + дублирование 1-го пакета, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls5:@{BIN_FOLDER}\\tls_clienthello_5.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d1 --lua-desync=send:repeats=2 --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=211:seqovl_pattern=bin_tls5"""
},
"tcpseg_226_dup_d1": {
"name": "SeqOvl 226 + Dup (No Split)",
"description": "Overlap 226 + дублирование 1-го пакета, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls18:@{BIN_FOLDER}\\tls_clienthello_18.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d1 --lua-desync=send:repeats=2 --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=bin_tls18"""
},
"tcpseg_226_dup_n3": {
"name": "SeqOvl 226 + Dup n3 (No Split)",
"description": "Overlap 226 + дублирование первых 3 пакетов, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls18:@{BIN_FOLDER}\\tls_clienthello_18.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-n3 --lua-desync=send:repeats=2 --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=bin_tls18"""
},
"tcpseg_286_dup_n3": {
"name": "SeqOvl 286 + Dup n3 (No Split)",
"description": "Overlap 286 + дублирование первых 3 пакетов, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls11:@{BIN_FOLDER}\\tls_clienthello_11.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-n3 --lua-desync=send:repeats=2 --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=286:seqovl_pattern=bin_tls11"""
},
"tcpseg_308_dup_n3": {
"name": "SeqOvl 308 + Dup n3 (No Split)",
"description": "Overlap 308 + дублирование первых 3 пакетов, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls9:@{BIN_FOLDER}\\tls_clienthello_9.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-n3 --lua-desync=send:repeats=2 --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=308:seqovl_pattern=bin_tls9"""
},3️⃣ С динамической генерацией (Google SNI)
# ============================================================
# TCPSEG: ДИНАМИЧЕСКИЕ (БЕЗ ФАЙЛОВ)
# ============================================================
"tcpseg_226_google_simple": {
"name": "SeqOvl 226 Google (Simple, No Split)",
"description": "Overlap 226 с Google SNI, без резки и дублирования",
"author": "hz",
"label": LABEL_RECOMMENDED, # Рекомендуется - не требует файлов
"args": f"""--lua-init="tls_google = tls_mod(fake_default_tls,'sni=www.google.com')" {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=tls_google"""
},
"tcpseg_226_google_dup_d1": {
"name": "SeqOvl 226 Google + Dup (No Split)",
"description": "Overlap 226 с Google SNI + дублирование 1-го пакета, БЕЗ резки",
"author": "hz",
"label": LABEL_RECOMMENDED,
"args": f"""--lua-init="tls_google = tls_mod(fake_default_tls,'sni=www.google.com')" {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d1 --lua-desync=send:repeats=2 --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=tls_google"""
},
"tcpseg_226_google_dup_n3": {
"name": "SeqOvl 226 Google + Dup n3 (No Split)",
"description": "Overlap 226 с Google SNI + дублирование первых 3 пакетов, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--lua-init="tls_google = tls_mod(fake_default_tls,'sni=www.google.com')" {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-n3 --lua-desync=send:repeats=2 --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=tls_google"""
},4️⃣ С различными fooling параметрами
# ============================================================
# TCPSEG: С FOOLING
# ============================================================
"tcpseg_226_datanoack": {
"name": "SeqOvl 226 + DataNoAck (No Split)",
"description": "Overlap 226 с убиранием ACK флага, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls18:@{BIN_FOLDER}\\tls_clienthello_18.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=bin_tls18:tcp_flags_unset=ack"""
},
"tcpseg_226_ttl": {
"name": "SeqOvl 226 + TTL (No Split)",
"description": "Overlap 226 с TTL=5, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls18:@{BIN_FOLDER}\\tls_clienthello_18.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=bin_tls18:ip_ttl=5:ip6_ttl=5"""
},
"tcpseg_226_badseq": {
"name": "SeqOvl 226 + BadSeq (No Split)",
"description": "Overlap 226 с badseq, БЕЗ резки",
"author": "hz",
"label": None,
"args": f"""--blob=bin_tls18:@{BIN_FOLDER}\\tls_clienthello_18.bin {RUTRACKER_BASE_ARG} --payload=tls_client_hello --out-range=-d10 --lua-desync=tcpseg:pos=0,-1:seqovl=226:seqovl_pattern=bin_tls18:tcp_ack=-66000"""
},📊 Сравнительная таблица: multisplit vs tcpseg
| Параметр | multisplit + seqovl | tcpseg(pos=0,-1) + seqovl |
|---|---|---|
| Количество пакетов | 2 (резка по умолчанию на pos=2) | 1 (без резки) |
| Сложность | Средняя | Минимальная |
| Нагрузка на сеть | Выше | Ниже |
| Эффективность | Высокая (запутывание + резка) | Средняя (только запутывание) |
| CPU нагрузка | Выше | Ниже |
🎯 Когда использовать какую стратегию?
Используй multisplit:
- ✅ Когда DPI анализирует целостность пакетов
- ✅ Для агрессивного обхода
- ✅ Когда tcpseg не помогает
Используй tcpseg (pos=0,-1):
- ✅ Для начала тестирования (проще)
- ✅ Когда достаточно “запутать” DPI мусором
- ✅ Для экономии ресурсов
- ✅ Когда резка не нужна
💡 Рекомендуемая стратегия тестирования:
# Шаг 1: Самая простая (tcpseg без dup)
"tcpseg_226_google_simple"
# Шаг 2: Добавить дублирование
"tcpseg_226_google_dup_d1"
# Шаг 3: Если не помогло - добавить резку
"multisplit_226_seqovl_dynamic"
# Шаг 4: Если не помогло - агрессивная стратегия
"multisplit_286_pattern" (dup n3 + резка)📝 Полная структура новых стратегий:
# ============================================================
# КАТЕГОРИЯ: TCPSEG (SEQOVL БЕЗ РЕЗКИ)
# ============================================================
TCPSEG_STRATEGIES = {
# Простые (без dup)
"tcpseg_211_simple": {...},
"tcpseg_226_simple": {...},
"tcpseg_286_simple": {...},
"tcpseg_308_simple": {...},
# С дублированием (dup -d1)
"tcpseg_211_dup_d1": {...},
"tcpseg_226_dup_d1": {...},
# С дублированием (dup -n3)
"tcpseg_226_dup_n3": {...},
"tcpseg_286_dup_n3": {...},
"tcpseg_308_dup_n3": {...},
# Динамические (без файлов)
"tcpseg_226_google_simple": {...}, # ← РЕКОМЕНДУЕТСЯ для начала
"tcpseg_226_google_dup_d1": {...}, # ← РЕКОМЕНДУЕТСЯ для YouTube
"tcpseg_226_google_dup_n3": {...},
# С fooling
"tcpseg_226_datanoack": {...},
"tcpseg_226_ttl": {...},
"tcpseg_226_badseq": {...},
}✅ Преимущества добавления tcpseg стратегий:
- ✅ Больше вариантов для тестирования
- ✅ Меньше нагрузки (1 пакет vs 2+)
- ✅ Проще для понимания (нет резки)
- ✅ Быстрее работает (меньше операций)
- ✅ Градация сложности (от простого к сложному)
Да, определённо стоит добавить эти стратегии! Они дадут пользователям “мягкий вход” - начать с простых вариантов и постепенно усложнять. 🚀
"multidisorder_badseq_pos": {
"name": "original bol-van v2 (badsum)",
"description": "Дисордер стратегия с фуллингом badseq нарезкой и повтором 6",
"author": "hz",
"label": None,
"args": f"""--payload=tls_client_hello --out-range=-d10 --lua-desync=fake:blob=fake_default_tls:repeats=6:tcp_ack=-66000 --lua-desync=multidisorder:pos=1,midsld:tcp_ack=-66000"""
},
"fake_fakedsplit_autottl_2": {
"name": "fake fakedsplit badseq (рекомендуется для 80 порта)",
"description": "",
"author": "hz",
"label": None,
"args": f"""--payload=http_req --out-range=-d10 --lua-desync=fake:blob=fake_default_http:ip_autottl=2,3-20:ip6_autottl=2,3-20:tcp_ack=-66000:tcp_ts_up --lua-desync=fakedsplit:ip_autottl=2,3-20:ip6_autottl=2,3-20:tcp_ack=-66000:tcp_ts_up"""
},