Если вы пользовались 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

/api/health

Проверка работоспособности, версия, аптайм

GET

/api/status

Статус winws, watchdog, текущая стратегия

GET

/api/provider

ASN, организация, регион

GET

/api/knowledge

Все стратегии для текущего ASN по убыванию score

POST

/api/start

Запустить лучшую известную стратегию

POST

/api/stop

Остановить winws

GET

/api/config

Текущая конфигурация

PUT/PATCH

/api/config

Обновить конфигурацию без перезапуска сервера

POST

/api/watchdog

Запустить watchdog в фоне

DELETE

/api/watchdog

Остановить watchdog и winws

SSE-эндпоинты для долгих операций:

  • POST /api/find — поиск стратегии с прогрессом в реальном времени

  • POST /api/update — обновление IP и доменных списков с GitHub

  • POST /api/update-self — самообновление бинарника

  • GET /api/events — постоянный стрим изменений состояния

  • GET /api/logs — постоянный стрим логов

Все SSE-события используют единый JSON-конверт: type, message и опциональное data.

Если запрос пришёл во время уже выполняющейся операции — сервер вернёт 409 Conflict. Нужно либо дождаться завершения, либо вызвать POST /api/stop.


Конфигурация

Файл config.json, также доступен через API без перезапуска сервера.

Параметр

По умолчанию

Описание

Когда менять

score_threshold

0.6

Минимальный score для принятия стратегии

Снизить до 0.4, если рабочая долго не находится

fail_threshold

3

Сколько неудач подряд до триггера watchdog

Увеличить до 5, если watchdog срабатывает слишком часто

check_interval

60

Интервал проверок watchdog (сек)

init_delay

5

Задержка перед первой проверкой (сек)

test_timeout

8

Таймаут одного теста (сек)

Увеличить при медленном соединении, уменьшить при быстром

test_runs

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.