zapret-core: Go-бэкенд для обхода DPI, который сам ищет рабочую стратегию
Если вы пользовались zapret-discord-youtube, то знаете этот сценарий. Скачал, запустил первый батник — не работает. Запустил второй — нет. На пятом YouTube наконец открылся. Через неделю провайдер что-то обновил, и всё по новой.
Меня это утомило. Не потому что сложно — просто каждый раз одно и то же, вручную. Так появился zapret-core: Go-бэкенд, который сам перебирает стратегии, находит рабочую для вашего провайдера и запоминает её. Если провайдер что-то меняет — перебирает снова.
Что внутри и откуда взялось
Бинарники (winws, WinDivert, fake-пакеты) и списки доменов/IP взяты из zapret-discord-youtube, они лежат в assets/ и lists/. Но на этом сходство заканчивается.
В ZDY стратегии — это батники с фиксированными параметрами, которые пользователь запускает сам. Здесь стратегия — это StrategyVector: структура с полями вроде метода TCP desync, fooling-режима, позиции сплита, TLS-настроек и ещё десятка параметров. Из этих полей генератор собирает аргументы для winws по девяти правилам — под разные протоколы и сценарии. Итого: 137 возможных комбинаций.
Основной сценарий использования — бэкенд для GUI-обёрток через HTTP API. Но и как самостоятельный инструмент через CLI тоже работает нормально.
Как ищется рабочая стратегия
Простой перебор по порядку здесь не подойдёт: хотелось, чтобы инструмент побыстрее находил что-то рабочее, не тратя время на заведомо плохие комбинации. Поэтому внутри используется UCB1 (Upper Confidence Bound) — один из классических алгоритмов многоруких бандитов, придуманный для задач, где нужно балансировать между «проверить знакомое» и «попробовать новое».
Идея такая: у каждой стратегии есть средний результат по прошлым тестам и «бонус за неизученность» — чем реже стратегию тестировали, тем выше этот бонус. Алгоритм каждый раз выбирает ту, у которой сумма выше:
для каждой стратегии-кандидата:
если ещё не тестировалась → приоритет бесконечный
иначе → score = avg_score + sqrt(2 * ln(total_pulls) / pulls)
выбрать стратегию с максимальным score
протестировать, обновить статистику
если score >= порог → принять
Сначала тестируются стратегии, которые уже работали для вашего ASN (они берутся из встроенной knowledge base), потом идут новые кандидаты — сначала высокоприоритетные комбинации DesyncMethod × Fooling × TLSMode, потом 64 случайных вектора для длинного хвоста.
Результат сохраняется в data/knowledge.json с учётом ASN провайдера, score и количества подтверждений. При следующем запуске сразу стартует лучшая известная стратегия — поиск не нужен.
За состоянием следит watchdog: каждые N секунд проверяет YouTube и Discord, и если оба недоступны fail_threshold раз подряд — запускает поиск заново. Большинство пользователей находят рабочую стратегию за первые 10–20 попыток, обычно это несколько минут. В худшем случае до двух часов.
Требования и установка
Что нужно:
Windows 7 и новее (x64)
Права администратора — WinDivert устанавливает драйвер ядра
Подключение к интернету
Установка: скачать последний релиз, распаковать, запустить от имени администратора.
Структура архива:
zapret-core.exe
winws.exe
WinDivert.dll
WinDivert64.sys
cygwin1.dll
assets/
fake/
lists/
config.json
knowledge.json
zapret.log
Папка data/ создаётся сама при первом запуске.
Сборка из исходников (нужны Go 1.26.3 и Windows):
git clone https://github.com/elev1e1nSure/zapret-core.git
cd zapret-core
go build -o zapret-core.exe .
Или через build.bat — результат окажется в dist/. Локальные сборки запускаются с консолью, релизные собираются с флагом -H windowsgui и консоли не показывают.
После скачивания стоит проверить SHA256 хэши из checksums.txt.
Быстрый старт
# Найти рабочую стратегию для вашего провайдера
zapret-core.exe --find
# Запустить с лучшей известной стратегией
zapret-core.exe
# Запустить как HTTP API сервер (для GUI-обёрток)
zapret-core.exe --server
# Мониторинг с автовосстановлением
zapret-core.exe --watch
⚠️
--watchи--serverнельзя запускать одновременно — оба управляют winws независимо и конфликтуют. Если нужен watchdog при работающем сервере, используйтеPOST /api/watchdog.
HTTP API
При запуске с --server поднимается HTTP-сервер на 127.0.0.1:7432. Всё локально, наружу ничего не торчит.
Метод | Путь | Описание |
|---|---|---|
GET |
| Проверка работоспособности, версия, аптайм |
GET |
| Статус winws, watchdog, текущая стратегия |
GET |
| ASN, организация, регион |
GET |
| Все стратегии для текущего ASN по убыванию score |
POST |
| Запустить лучшую известную стратегию |
POST |
| Остановить winws |
GET |
| Текущая конфигурация |
PUT/PATCH |
| Обновить конфигурацию без перезапуска сервера |
POST |
| Запустить watchdog в фоне |
DELETE |
| Остановить watchdog и winws |
SSE-эндпоинты для долгих операций:
POST /api/find— поиск стратегии с прогрессом в реальном времениPOST /api/update— обновление IP и доменных списков с GitHubPOST /api/update-self— самообновление бинарникаGET /api/events— постоянный стрим изменений состоянияGET /api/logs— постоянный стрим логов
Все SSE-события используют единый JSON-конверт: type, message и опциональное data.
Если запрос пришёл во время уже выполняющейся операции — сервер вернёт 409 Conflict. Нужно либо дождаться завершения, либо вызвать POST /api/stop.
Конфигурация
Файл config.json, также доступен через API без перезапуска сервера.
Параметр | По умолчанию | Описание | Когда менять |
|---|---|---|---|
| 0.6 | Минимальный score для принятия стратегии | Снизить до 0.4, если рабочая долго не находится |
| 3 | Сколько неудач подряд до триггера watchdog | Увеличить до 5, если watchdog срабатывает слишком часто |
| 60 | Интервал проверок watchdog (сек) | — |
| 5 | Задержка перед первой проверкой (сек) | — |
| 8 | Таймаут одного теста (сек) | Увеличить при медленном соединении, уменьшить при быстром |
| 2 | Количество прогонов при поиске | Снизить до 1 для ускорения поиска, поднять для строгого отбора |
Архитектура
GUI-клиент
│
│ HTTP + SSE
▼
zapret-core.exe
├── HTTP API
├── Watchdog
├── Optimizer (перебор 137 комбинаций)
└── Knowledge (data/knowledge.json)
│
│ управление процессом
▼
winws.exe
└── WinDivert (драйвер ядра)
zapret-core не трогает пакеты сам — этим занимается winws через WinDivert. Разделение намеренное: winws отвечает за работу с трафиком на уровне ядра, zapret-core — за логику поиска, запуск нужных параметров и наблюдение за происходящим. Так проще тестировать каждую часть отдельно и строить GUI-обёртки поверх стабильного API.
Известные ограничения
Конфликты с другим ПО. WinDivert может конфликтовать с:
GoodbyeDPI
AdGuardSvc
discordfix_zapret
другими экземплярами winws
Killer NIC / Intel Connectivity Network Service
Check Point
SmartByte
zapret-core обнаруживает конфликты перед запуском и прерывается со списком проблемных процессов. Достаточно отключить их и попробовать снова.
Только Windows. WinDivert — Windows-специфичный драйвер. Linux и macOS не поддерживаются.
Права на запись. Нужен write-доступ к директории для data/, config.json, knowledge.json, zapret.log. Не кладите в read-only папки.
Сеть. Нужен исходящий HTTPS для: определения провайдера через ipinfo.io, тестирования YouTube/Discord/Google, обновления списков и самообновления с GitHub.
Итого
Инструмент делает одно: убирает ручной перебор из цикла «провайдер обновил блокировки — ничего не работает». Нашёл стратегию, запомнил, следит.
Если хотите делать GUI поверх него — HTTP API для этого готов. Если хотите просто чтобы YouTube работал — достаточно --find и --watch.
Буду рад, если потестируете на редких провайдерах — это самое ценное, что сейчас не хватает knowledge base. Ну и PR приветствуются.
Проект на GitHub: elev1e1nSure/zapret-core
Построено поверх zapret-discord-youtube от Flowseal. Оригинальный движок zapret и winws — bol-van.