Find a file
Necronicle 11f5e77c48
Some checks failed
CI / Workflow lint (push) Has been cancelled
CI / ESLint (push) Has been cancelled
CI / Shell tests (push) Has been cancelled
CI / ShellCheck (push) Has been cancelled
CI / Go mtproxy-client (push) Has been cancelled
CI / Go rt-proxy (push) Has been cancelled
CI / Go vps-relay (push) Has been cancelled
CI / Go z2k-detect (push) Has been cancelled
CI / Go z2k-verify (push) Has been cancelled
CI / Отгружаемые бинарники собираются из этого исходника (push) Has been cancelled
CI / Luacheck (push) Has been cancelled
CI / Mutation Testing (push) Has been cancelled
Release CDN (purge) / Evict jsdelivr edge cache (push) Has been cancelled
release: r-76.1 (reinstall) — Ответ «отмена» или «нет» на вопрос с подтверждением больше не принимается за согласие: раньше на роутере некоторые слова читались как «да». Имя политики Keenetic кириллицей теперь сохраняется, а переключатели в панели не сбрасываются обратно, если нажать несколько подряд. Обновление больше не сообщает об успехе, когда часть файлов установить не удалось.
2026-08-15 22:35:57 +03:00
.github fix(ci): сброс кэша CDN выселял не те файлы, а два скрипта не проверялись вовсе 2026-08-15 16:04:07 +03:00
archive/custom-detectors-rotation stage 1: restore detector library z2k-detectors.lua (load-only) 2026-05-30 09:18:14 +03:00
extras docs: Discord voice hosts fix — downloadable list + README section 2026-07-15 13:50:31 +03:00
files docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
lib fix(shell): 21 находка ревью — от «отмена» как согласия до молчащего обновления 2026-08-15 15:18:20 +03:00
mtproxy-client fix(ci): красный релиз r-76 — две мои ошибки и корневая причина обеих 2026-08-15 22:06:49 +03:00
rt-proxy fix(z2k-detect): форма ^domain в skip-списке не работала вовсе 2026-08-14 21:19:57 +03:00
scripts fix(ci): красный релиз r-76 — две мои ошибки и корневая причина обеих 2026-08-15 22:06:49 +03:00
tests fix(ci): красный релиз r-76 — две мои ошибки и корневая причина обеих 2026-08-15 22:06:49 +03:00
vps-relay docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
vps-stats fix(vps-stats): инвариант «выгрузка = сэмпл» перенесён в агрегатор 2026-08-15 11:08:32 +03:00
webpanel release: r-76.1 (reinstall) — Ответ «отмена» или «нет» на вопрос с подтверждением больше не принимается за согласие: раньше на роутере некоторые слова читались как «да». Имя политики Keenetic кириллицей теперь сохраняется, а переключатели в панели не сбрасываются обратно, если нажать несколько подряд. Обновление больше не сообщает об успехе, когда часть файлов установить не удалось. 2026-08-15 22:35:57 +03:00
z2k-detect fix(ci): красный релиз r-76 — две мои ошибки и корневая причина обеих 2026-08-15 22:06:49 +03:00
z2k-verify build: все модули на go 1.25.12, обновлены зависимости, бинарники пересобраны 2026-08-10 17:25:35 +03:00
.gitattributes fix: comprehensive code review — 40 fixes across 14 files 2026-03-19 00:38:58 +03:00
.gitignore fix(build): секрет туннеля печатался в лог и мог уехать в публичный репозиторий 2026-08-15 20:12:27 +03:00
.luacheckrc chore: delete z2k-http-strats.lua — unwired on purpose in June, still shipped 2026-08-03 16:05:29 +03:00
ARCHITECTURE.md docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
build-matrix.tsv release: неизменяемый подписанный тег, и обновление ходит по нему 2026-08-09 18:47:05 +03:00
CONTRIBUTING.md docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
debug.sh Remove unicode symbols to match z4r output 2026-01-29 10:23:28 +03:00
eslint.config.mjs refactor(webpanel): монолит app.js разрезан на 21 модуль 2026-08-15 00:02:41 +03:00
LICENSE feat(mtproxy): прозрачный Telegram прокси через Cloudflare WebSocket 2026-04-10 01:17:51 +03:00
package-lock.json ci: статическая проверка JavaScript — единственного языка без неё 2026-08-14 22:25:26 +03:00
package.json ci: статическая проверка JavaScript — единственного языка без неё 2026-08-14 22:25:26 +03:00
quic_strats.ini fix(quic): yt_quic udp_in 1->8 — unstick QUIC rotation on responding TSPU 2026-06-08 13:03:49 +03:00
README.md docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
release.sh docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
RELEASING.md fix(update): убрать тег-фоллбэк — он обходил CD-гейт (найдено ревью) 2026-08-10 13:37:24 +03:00
SECURITY.md docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
strats_new2.txt fix(rotation): revert reset+retrans=3, reorder yt_tcp (z4r strat first) 2026-06-08 23:34:56 +03:00
UPDATES.json release: r-76.1 (reinstall) — Ответ «отмена» или «нет» на вопрос с подтверждением больше не принимается за согласие: раньше на роутере некоторые слова читались как «да». Имя политики Keenetic кириллицей теперь сохраняется, а переключатели в панели не сбрасываются обратно, если нажать несколько подряд. Обновление больше не сообщает об успехе, когда часть файлов установить не удалось. 2026-08-15 22:35:57 +03:00
UPDATES.json.sig release: r-76.1 (reinstall) — Ответ «отмена» или «нет» на вопрос с подтверждением больше не принимается за согласие: раньше на роутере некоторые слова читались как «да». Имя политики Keenetic кириллицей теперь сохраняется, а переключатели в панели не сбрасываются обратно, если нажать несколько подряд. Обновление больше не сообщает об успехе, когда часть файлов установить не удалось. 2026-08-15 22:35:57 +03:00
UPSTREAM_PROPOSALS.md docs: документация разошлась с кодом в двенадцати местах 2026-08-15 20:58:57 +03:00
z2k.sh fix(webpanel): обе находки ревью разбиения — доставка и незакрытая инверсия 2026-08-15 08:06:36 +03:00
z2k_cleanup.sh perf+fix: restart 25 s -> ~1.5 s, rt-proxy review, WARP address and leftover interface 2026-07-26 19:26:40 +03:00

z2k — Zapret2 для Keenetic

Telegram-группа: @zapret2keenetic — вопросы, помощь с настройкой, обсуждение

Поддержать проект:

  • TON: UQA6Y6Mf1Qge2dVSl3_vSqb29SKrhI8VgJtoRBjgp08oB8QY
  • USDT (ERC20): 0xA1D6d7d339f05C1560ecAF0c5CB8c4dc80Dc46A9
  • USDT (TRC20): TVtWDryrowtb4MYGGtA8Q2yCAei4VFh5g5

Огромная благодарность спонсорам проекта

  • SupWgeneral
  • Alexey
  • Jet_sk_ya
  • Suharik39
  • ZyaK<-
  • Алексей Стрельцов
  • Diman86RUS
  • Alex
  • GRM
  • Dez
  • hoaxx
  • Mansurchick
  • Dkarloff - SEO отец
  • KIBERPANK
  • olmer2002

Важно: после установки применяются autocircular стратегии. Им нужно время и несколько попыток, чтобы подстроиться под сетевую среду. Если сайт не открывается сразу — дайте странице несколько раз перезагрузиться. Параметры перебираются автоматически, после чего соединение обычно стабилизируется.

Данный проект предназначен для исследования сетевых протоколов и изучения работы систем анализа трафика. Используется исключительно в учебных целях.


Что это

z2k — модульный установщик zapret2 для роутеров Keenetic с Entware.

Цель проекта: упростить установку zapret2 на Keenetic и предоставить набор сетевых стратегий с автоподбором (autocircular), персистентной памятью, телеметрией и полной поддержкой IPv4/IPv6.


Особенности

Сетевые стратегии

  • Установка zapret2 (openwrt-embedded релиз) без компиляции, с проверкой работоспособности nfqws2
  • Три TCP autocircular профиля с разными стратегиями:
    • RKN — список ресурсов (TCP/TLS + HTTP) — 50 стратегий
    • YouTube TCP — youtube.com и связанные домены — 22 стратегии
    • YouTube GV — googlevideo CDN (стриминг) — 22 стратегии
  • QUIC autocircular профили: YouTube QUIC (UDP/443) и Discord voice — с z2k morph-стратегиями (QUIC morph / timing morph)
  • Discord профили:
    • TCP: hostlist Discord включён в RKN-профиль
    • UDP voice/video: circular — стратегия закрепляется в state.tsv после первого успеха и удерживается между перезапусками
  • Hostlist режим: стратегии применяются только к доменам из списков
  • Автохостлист (меню [L]) — режим, в котором движок сам находит заблокированные домены и дописывает их в список, вместо работы по готовым спискам
  • Исключения: то, что z2k не трогает вообще. По домену — госуслуги, банки, Steam / PlayStation / Nintendo / Epic, VK, Яндекс и другие (список поставляется готовым и пополняется вручную). По адресу или подсети — для того, у чего имени в трафике нет: камеры и домофоны с P2P, часть VoIP и видеозвонков

Сеть и прокси

  • Telegram — прозрачная работа для всех устройств в сети, без настройки на клиентах (кроме роутеров на Realtek Lexra — почему)
  • IPv6 — полная поддержка: dual-stack DNS, IPv6 SO_ORIGINAL_DST, Telegram DC IPv6 CIDR
  • Игровой режим (WARP) — игры, заблокированные по IP (не по домену), обходятся через split-туннель Cloudflare WARP; списки игровых IP/CIDR редактируются в вебморде. Подробнее — раздел «Игровой режим (WARP)» ниже.

Инструменты и мониторинг

  • Веб-панель — управление и мониторинг через браузер: статус и запуск сервиса, стратегии, списки, диагностика с проверкой отдельного домена, обновление и удаление z2k. Можно включить вход по паролю — тому же, что у веб-интерфейса роутера. Открывается без интернета: шрифты и всё остальное лежат на самом роутере, ни одного обращения наружу
  • Config validator — валидация конфигурации перед применением (порты, hostlist-файлы, blob-файлы, lua-desync)
  • Rollback — откат конфигурации к предыдущему snapshot
  • Планировщик — обновление списков доменов и обслуживающие задачи по расписанию (заменяет cron, который на Entware ненадёжен)
  • Сбор статистики — анонимная отправка обезличенных данных о том, какие стратегии срабатывают; включён по умолчанию, выключается в меню [C]

Установка

1) Компоненты прошивки Keenetic

«Модули ядра подсистемы Netfilter» нужны на ЛЮБОЙ прошивке Keenetic — по умолчанию они не предустановлены, и без них z2k не запустится. Их нужно доустановить в веб-интерфейсе Keenetic (раздел «Изменить набор компонентов»):

  1. «Модули ядра подсистемы Netfilter» — обязательно, на всех прошивках и роутерах.
  2. «Протокол IPv6» — нужен только на старых прошивках (и только если вы используете IPv6). На новых прошивках IPv6 уже включён по умолчанию, и такого пункта в списке может не быть.

На части прошивок пункт «Модули ядра подсистемы Netfilter» появляется в списке только после того, как выбран компонент «Протокол IPv6».

2) Подготовка USB и установка Entware (обязательно)

Подготовьте USB-накопитель и установите Entware по официальной инструкции Keenetic: https://help.keenetic.com/hc/ru/articles/360021214160

После установки Entware выполните обновление индекса пакетов и установите зависимости:

opkg update
opkg install coreutils-sort curl grep gzip ipset iptables kmod_ndms xtables-addons_legacy openssl-util

3) Установка z2k

{ curl --resolve raw.githubusercontent.com:443:213.176.74.63 -fsSL https://raw.githubusercontent.com/necronicle/z2k/z2k-enhanced/z2k.sh || curl -fsSL https://raw.githubusercontent.com/necronicle/z2k/z2k-enhanced/z2k.sh; } | sh

Меню

Меню открывается той же командой, что и установка — если z2k уже установлен, она просто открывает меню (а если ещё нет — ставит и открывает):

{ curl --resolve raw.githubusercontent.com:443:213.176.74.63 -fsSL https://raw.githubusercontent.com/necronicle/z2k/z2k-enhanced/z2k.sh || curl -fsSL https://raw.githubusercontent.com/necronicle/z2k/z2k-enhanced/z2k.sh; } | sh
Пункт Описание
[1] Установить/переустановить zapret2
[2] Управление сервисом (старт/стоп/рестарт/статус)
[3] Обновить списки доменов
[4] Резервная копия/восстановление
[5] Удалить zapret2
[U] Проверить обновления z2k
[W] Исключения — домены, которые z2k не обрабатывает
[R] RST-фильтр — фильтрация аномальных TCP RST
[F] Silent fallback для РКН (осторожно — возможны поломки)
[E] Игровой режим WARP (Cloudflare-туннель для игр, заблоченных по IP)
[T] Telegram прокси
[S] Скрипты custom.d
[P] Веб-панель
[D] Диагностика (сводка для траблшутинга)
[I] Убрать статические IP Instagram (обход DNS-отравления)
[Y] Diagnose domain — 4-стадийная проба + рекомендация
[M] Динамический TTL для fake-пакетов — выключить для мобильных операторов
[A] Политика доступа Keenetic — фильтр устройств по NDM-политике (PBR)
[C] Сбор статистики стратегий (анонимно)
[H] Аппаратный offload — per-flow исключение (нативная ротация на Keenetic)
[L] Автохостлист — движок сам находит заблокированные домены

Автодетекция (z2k-detect)

z2k-detect — фоновый Go-демон z2k для проактивного обнаружения DPI-блокировок. Заменил сломанные z2k-probe / z2k-classify. По умолчанию выключен — включается оператором в меню [Y].

Как работает:

  1. Слушает DNS-запросы клиентов. Источник наблюдения авто-детектится: AdGuardHome querylog → dnsmasq.log → AF_PACKET sniff на UDP/53 (универсальный fallback, работает без логов)
  2. На каждый новый домен — 4-стадийная проба: DNS → TCP:443 → TLS → HTTP read 32KB
  3. Классификация по 22 типизированным кодам (tls_garbage, http_cutoff, mtls_required, tcp_refused, ...)
  4. Решение:
    • HOT — путь до сервера не работает → домен дописывается в discovered-domains.txt, nfqws2 подхватывает inotify, следующий запрос юзера уже через bypass
    • IGNORE — DNS не резолвится / сервер сам отказал политикой (typed TLS alert / mTLS)

Управление:

  • Меню [Y] — статус, диагностика конкретного домена, toggle on/off
  • Z2K_DISCOVER=0|1 в /opt/zapret2/config — флаг автозапуска
  • Логи: /var/log/z2k-detect.log
  • State: только in-memory + сам discovered-domains.txt. Никаких отдельных state-файлов на диске.

Динамический TTL (Z2K_DYNAMIC_TTL)

z2k автоматически инжектит :fool=z2k_dynamic_ttl в каждую fake-стратегию (fake, fakedsplit, fakeddisorder, hostfakesplit) TCP-профилей rkn_tcp / yt_tcp / gv_tcp. Lua-hook (files/lua/z2k-fooling-ext.lua) перед отправкой fake-пакета ставит ему ip_ttl = (TTL реального исходящего пакета) 1, чтобы fake выглядел как обычный клиентский пакет с точки зрения ТСПУ. Жёстко прибитый ip_ttl=8 от роутера в 50+ хопах от назначения сразу палится — dynamic_ttl это закрывает.

Когда выключать (меню [M]Выключить или Z2K_DYNAMIC_TTL=0 в /opt/zapret2/config):

  • Мобильные операторы с запретом раздачи (МТС, Билайн), когда на роутере включён NDM TTL-fix (ip ttl-fix через Keenetic CLI) и используется телефонная симка под маскировкой IMEI. В этой топологии NDM всё равно перебивает TTL всех исходящих на фиксированное значение, поэтому наш inject в POSTROUTING не доживает до провода — становится чистым per-fake lua-call overhead на слабом MIPS.
  • Если speedtest показывает резкую деградацию throughput при включённом z2k и top показывает nfqws2 под потолком CPU — это первый кандидат на опт-аут.

По умолчанию включён (Z2K_DYNAMIC_TTL=1). Значение переживает z2k update / reinstall. Меню [M] показывает текущий статус в шапке только если выключен.


Командная строка

После установки в /opt/bin/ появляется короткая команда z2k:

z2k <команда>
Команда Описание
menu, m Открыть меню
install, i Установить/переустановить
uninstall Удалить zapret2 (снимает и TG tunnel)
status, s Показать статус системы
check, info Показать какие списки обрабатываются
diag, d Одностраничная сводка для траблшутинга
update, u Переустановить z2k поверх — тот же путь, что и install
rollback Откатить конфигурацию к snapshot
snapshot Создать snapshot конфигурации
validate Валидация текущей конфигурации
cleanup Очистить старые бэкапы (оставить 5)
version, v Показать версию
help, h Показать справку

Как работает autocircular

Каждый TCP/QUIC профиль содержит N стратегий с номерами strategy=1..N. Модуль circular в nfqws2 отслеживает успех/неудачу per-domain и переключается на следующую стратегию при неудаче. Успешная стратегия закрепляется.

Аппаратный офлоад Keenetic. На части устройств (особенно ТВ-приставках и Smart TV) NAT-офлоад уводил соединение мимо conntrack, из-за чего десинк к нему не применялся и сайт молча не открывался, а ротация «залипала». z2k при старте сервиса выключает софт-фастпас (nf_conntrack_fastnat), поэтому обход и автоподбор стратегий работают и на офлоадных устройствах.

Детекция неудач

  • Стандартный детектор — TCP ретрансмиссии и аномальные RST
  • UDP детектор — соотношение отправленных/полученных пакетов (4+ out, ≤1 in = неудача)
  • TLS alert детектор (z2k_tls_alert_fatal) — анализирует TLS alert + HTTP redirect
  • Mid-stream stall детектор (z2k_mid_stream_stall) — ловит «тихие» разрывы посередине потока, когда DPI режет соединение без RST/alert
  • 3-state HTTP classifier — отличает positive/neutral/hard_fail на HTTP-ответе, чтобы не зачитывать редирект на блок-страницу как успех
  • IP block detector — если несколько ClientHello к одному IP не получают ответа, шлёт client RST, чтобы приложение быстрее переключилось на другой адрес. По умолчанию выключен: его порог срабатывает раньше автоподбора и мешает выбору стратегий. Включается переменной IPBLOCK_DETECT=1 в конфиге

Персистентность

Найденные рабочие стратегии сохраняются в state.tsv и переживают перезапуск сервиса. Файл защищён от конкурентной записи через lock-механизм с atomic rename.

Сбор статистики

z2k раз в сутки отправляет обезличенную сводку о том, какие стратегии на каких категориях срабатывают: имя пула, номер стратегии и время удержания. Домены, посещённые адреса и идентификаторы роутера в неё не попадают — устройство не получает даже случайного номера, чтобы отправки нельзя было связать между собой по дням. Данные нужны, чтобы понимать, какие стратегии стоит держать в пулах, а какие себя изжили.

Куда именно уходит: http://213.176.74.63:8088/stats — тот же сервер, что обслуживает Telegram-туннель.

Сейчас без TLS. Это значит, что содержимое посылки видно на пути: и провайдеру, и любому оборудованию между вами и сервером. Сама посылка обезличена, но по её виду можно опознать, что на этом адресе стоит z2k. Перевод на HTTPS — в работе.

Отдельно, чтобы не создавать ложного впечатления: «обезличено» относится к содержимому, а не к самому факту отправки. IP-адрес, с которого пришёл запрос, виден вашему провайдеру и виден серверу на сетевом уровне — сервер его не записывает и не хранит, но скрыть его отправка не может.

Включено по умолчанию, выключается в меню [C] или тумблером в разделе «Режимы» веб-панели.


Веб-панель мониторинга

Встроенная веб-панель для просмотра состояния через браузер.

Установка через меню z2k:

  1. Открыть меню через curl (раздел «Меню» выше — та же команда установки открывает меню)
  2. Выбрать [P][1] (Установить/Переустановить)

В том же подменю: [2] удалить, [3] перезапустить, [4] показать адрес, [5] адрес/порт/IPv6 (см. ниже), [6] вход по паролю (см. ниже).

После установки панель доступна в локальной сети по адресу http://ROUTER_IP:8088/ (порт 8088, без пароля — как и веб-интерфейс самого Keenetic). Пароля нет намеренно: панель рассчитана на домашнюю сеть. При этом запросы, пришедшие со страницы стороннего сайта, панель отклоняет — открытый в соседней вкладке сайт не может ничего в ней переключить.

Разделы панели: Дашборд (статус сервиса, запуск/остановка/перезапуск, баннер обновления z2k, удаление z2k — см. ниже), Режимы (переключатели функций), Стратегии (см. ниже), WARP (списки игровых IP — см. ниже), Исключения (см. ниже), Доп. домены (свой список доменов для обхода), Диагностика (проверка домена + сводка, см. ниже), Благодарности.

Адрес, порт и IPv6

По умолчанию панель слушает адрес роутера в локальной сети на порту 8088. Изменить это можно в меню: [P][5].

  • Адрес и порт вводятся вручную. Адреса роутера показаны подсказкой, но выбор ими не ограничен: можно вписать адрес, которого сейчас нет — поднимаемый позже VPN, второй мост. Если введённого адреса на роутере не окажется, об этом предупредят, но не запретят.
  • Задать можно заранее, до установки панели. Значения сохранятся и применятся при первой же установке — не придётся сперва поднимать панель не там, где нужно, а потом переселять.
  • IPv6 — отдельная строка. Панель слушает один адрес IPv4, и чтобы отвечать ещё и по IPv6, открывается второй сокет. По умолчанию выключено. Можно указать конкретный адрес или :: — все интерфейсы; во втором случае помните, что у IPv6 нет NAT и адрес виден снаружи напрямую, если открыть входящие в межсетевом экране роутера.
  • Возврат к заводским — отдельным вопросом в том же пункте.

Всё это переживает обновления. Правка lighttpd.conf руками — нет: файл собирается заново при каждой установке, и дописанное в него стирается.

Вход по паролю

По умолчанию панель работает без пароля и доверяет всей локальной сети — так же, как веб-интерфейс самого Keenetic. Снаружи она недоступна: слушает только локальный адрес, отвечает только на обращения со своей же страницы и отклоняет запросы, пришедшие с постороннего сайта.

Если этого мало — например, к сети есть доступ у гостей — включите вход: [P][6].

  • Отдельный пароль не заводится. Логин и пароль — те же, что у веб-интерфейса роутера: панель спрашивает сам роутер. Хранить нечего, сменили пароль на роутере — он сразу действует и здесь, забыли — восстанавливается штатными средствами Keenetic.
  • Пароль не передаётся по сети: страница считает одноразовый ответ на случайный запрос роутера и отправляет только его.
  • Пускаются только те учётки, которым разрешён веб-интерфейс. Пароль от сетевой папки управление обходом не откроет.
  • Запереться нельзя. Вход всегда снимается тем же пунктом меню, а терминал не зависит ни от панели, ни от веб-интерфейса роутера.

Панель работает по HTTP без шифрования. Пароль защитит от того, кто просто оказался в вашей сети, но не от того, кто слушает трафик внутри неё.

Раздел «Стратегии»

Всё, что касается стратегий, живёт в одном разделе с двумя вкладками.

«Автоподбор» — что подбор выбрал по каждому домену, и управление этим выбором:

  • Ручной выбор стратегии — в выпадающем списке напротив домена выбрать любую стратегию из пула категории (проскочить заведомо нерабочую, протестировать свою, закрепить понравившуюся). Применяется на лету (~2 с); автоподбор при этом продолжается.
  • Заморозка 🔒 — кнопка-замок фиксирует строку на текущей стратегии: автоподбор перестаёт её менять. Повторное нажатие — разморозка, подбор возобновляется.
  • Голос Discord — отдельный селектор над таблицей: голосовой пул не привязан к домену, поэтому в таблице его нет, а выбрать стратегию можно заранее, до первого звонка.
  • × (сброс) — вернуть строку к стратегии 1 и режиму «авто».

Ручной выбор и заморозка сохраняются и переживают перезагрузку роутера и обновление z2k. Выпадающий список всегда показывает полный набор стратегий категории.

«Свои стратегии» — задать свою строку параметров вместо подбора, целиком на пул (см. «Свои стратегии»).

Важно: пул, которому задана своя строка, на вкладке «Автоподбор» не появляется. Директива circular входит в саму строку стратегии, и ваша строка заменяет её целиком — подбор для этого пула выключается и записей он не создаёт. Пул при этом работает, просто ровно так, как вы написали.

Раздел «Диагностика»

Проверка домена. Вводите адрес — панель делает одну пробу мимо обхода и показывает, на какой стадии всё обрывается: имя не резолвится, соединение не устанавливается, TLS рвут или всё проходит. Рядом — адреса, на которые домен разрешился, причина отказа и вывод: блокирует ли его DPI и есть ли он уже в списках обхода. Ничего не меняет и никуда не записывает; полный текст отчёта разворачивается по ссылке — его удобно переслать в чат. То же самое доступно в терминальном меню пунктом [Y].

Сводка отвечает на вопросы, которые мы обычно задаём в чате, чтобы их не пришлось задавать. Сверху — что именно не так: список проблем явным текстом, а если их нет, одна строка об этом. Ниже детали: версия и архитектура, состояние сервиса и правил, место на диске и память, смонтирован ли /opt, доустановлены ли модули Netfilter, умеет ли ядро ipset bitmap:port (без него обход не работает целиком), не включён ли fastnat (при нём стратегии не применяются), резолвится ли DNS, состояние туннеля и выбранные стратегии. В конце — ошибки, собранные по всем логам z2k, повторы схлопнуты.

Если сервис не запустился, сводка называет причину, а не только сам факт. Строка «причина отказа» показывает то, что сказал сам движок: не найден файл списка, неверный параметр, и так далее. Если движок промолчал, сводка переспрашивает его отдельно и говорит прямо, когда конфигурация в порядке — значит искать надо не в ней. Раньше в этом месте стояло только «не запущен», и дальше начиналась переписка.

Правила обхода считаются двумя половинами — исходящие и входящие. Обе нужны: без входящих обход продолжает работать, но стратегии перестают переключаться сами, потому что признаки блокировки приходят именно во входящих пакетах. Снаружи это выглядит не как поломка, а как «стратегия залипла», поэтому пропажа входящей половины попадает в список проблем отдельной строкой.

Две кнопки для отправки:

  • «Копировать» — компактная сводка, помещается в одно сообщение.
  • «Скачать файл» — полный отчёт с логами. В сообщение он не влезает, поэтому отправляется вложением. Это предпочтительный вариант, когда что-то не работает.

Отдельного раздела «Логи» больше нет: он показывал первый попавшийся файл из трёх под общим заголовком «Сервисный лог», без выбора и без подписи, а остальные логи из панели были недоступны вовсе. Теперь их читает сводка.

WARP — списки игровых IP

Раздел «WARP» управляет ipset'ом игрового трафика (см. «Игровой режим (WARP)»):

  • Тумблер WARP — включает/выключает split-туннель (переехал сюда из «Режимов»).
  • Списки — просмотр и правка пользовательских списков IP/CIDR: дописать строки, удалить, отредактировать целиком, выгрузить список в .txt и загрузить свой.
  • Изменения применяются на лету; ваши правки не затираются автообновлением базового списка.

Раздел «Исключения»

Всё, что сюда попало, z2k не трогает — как будто обход выключен именно для этого. Две вкладки, потому что механизма два и работают они по-разному.

Домены. Исключение по имени сайта. Подходит для обычных сайтов и приложений, которые ходят по HTTPS: госуслуги, банки, игровые магазины. Здесь же лежит список, который z2k ставит готовым. Применяется сразу, перезапускать сервис не нужно.

Адреса. Исключение по IP-адресу или подсети (203.0.113.7, 203.0.113.0/24, работает и IPv6). Нужно там, где имени в трафике нет вообще и по домену исключить нечего: камеры и домофоны с P2P, часть VoIP и видеозвонков. Такие приложения иногда ломаются от любого вмешательства в их пакеты — впишите сюда адрес их сервиса, и они заработают, а обход для остального останется. Применяется сразу и переживает перезагрузку роутера.

Что выбрать: если знаете имя сайта — вкладка «Домены». Если приложение ломается, а имени у него не видно — «Адреса».

Локальная сеть (192.168.x, 10.x, 172.1631.x и подобные) исключена всегда и без этого списка — добавлять её не нужно.

Домены во вкладку «Адреса» не принимаются: в списке адресов имя выразить нечем. Если вы добавляли туда домены раньше, панель покажет их отдельно и предложит удалить — они никогда не действовали.

Файл со списком адресов — /opt/zapret2/ipset/zapret-hosts-user-exclude.txt. Если правите его вручную, пишите только записи, по одной на строку: комментарии и пустые строки туда добавлять нельзя. Программа, которая читает этот файл, принимает каждую строку за адрес и ругается в журнал на всё остальное. Пояснение к формату лежит рядом, в файле zapret-hosts-user-exclude.README.txt.


Telegram

Telegram работает для всех устройств в сети автоматически, без настройки на клиентах. Включается при установке или через меню [T].

Кроме роутеров на Realtek Lexra. Там Telegram не заработает, и это не поломка, а ограничение инструментов: компилятор Go не умеет собирать под эту разновидность MIPS, поэтому клиента туннеля под неё просто не существует — как и детектора блокировок, и проверяльщика подписи. Сам обход при этом работает: движок собирает апстрим своим тулчейном, у него Lexra есть.

Установка на такой модели молча пропустит шаг с Telegram, а в сводке z2k diag раздел туннеля останется пустым. Если у вас Lexra и Telegram не идёт — искать нечего, причина эта.


Игровой режим (WARP)

Часть игр блокируется по IP-адресам серверов (а не по домену/SNI) — пакетный обход (desync) тут бессилен. Для таких игр z2k поднимает split-туннель через Cloudflare WARP: трафик к игровым серверам из списка заворачивается в MASQUE-туннель (пакет usque, интерфейс opkgtun0), а весь остальной трафик роутера идёт напрямую. Десинка и автоподбора здесь нет — только маршрутизация нужных подсетей в туннель.

  • Списки по играм — берутся из открытого проекта medvedeff-true/ru-gaming-blocklist и обновляются автоматически. На свежей установке не включён ни один — выберите нужные игры в разделе «WARP» вебморды, иначе в туннель ничего не пойдёт. Раньше вместо этого был один общий список на ~14 тыс. подсетей; он покрывал 15% интернета вместе с чужими сервисами, поэтому заменён на выбор по играм и вычищается при обновлении.
  • Свои адреса — там же можно вести собственный список IP/CIDR: добавлять, удалять, редактировать, выгружать и загружать .txt. Он отдельный от апстримных, поэтому их обновление его не трогает.
  • Включение — тумблером в разделе «WARP» вебморды либо пунктом меню [E]. Клиент usque z2k скачивает сам при первом включении.

Discord — голосовые каналы (фикс на ПК)

Веб и текст Discord z2k тянет на роутере сам. А вот голос иногда виснет на «Connecting» — провайдер душит финские голосовые серверы Discord. На уровне роутера это не лечится (нужно было бы ~200 DNS-записей — почти весь лимит Keenetic), поэтому фикс делается на самом ПК: пином финского диапазона в hosts-файл на рабочий Cloudflare-адрес.

Готовый список (200 строк finlandNNNNN.discord.media104.25.158.178):

  • скачать: https://cdn.jsdelivr.net/gh/necronicle/z2k@z2k-enhanced/extras/discord-voice-hosts.txt
  • зеркало: https://raw.githubusercontent.com/necronicle/z2k/z2k-enhanced/extras/discord-voice-hosts.txt

Куда добавить (строки из файла — в конец системного hosts):

  • Windows: C:\Windows\System32\drivers\etc\hosts — открыть Блокнотом от имени администратора.
  • Linux / macOS: /etc/hosts — через sudo.

После правки — сбросить DNS-кэш и перезапустить Discord:

  • Windows: ipconfig /flushdns
  • Linux: sudo resolvectl flush-caches
  • macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Адрес 104.25.158.178 со временем может смениться. Если голос снова отвалился — скачайте список заново (свежий держит проект Flowseal/zapret-discord-youtube, кнопка «Update hosts file»).


Пользовательские домены

В большинстве случаев чтобы заблокированный сайт начал обходиться через z2k — достаточно добавить его в extra-список, без всяких своих стратегий. autocircular сам подберёт рабочую стратегию из пула (50 вариантов для TLS, 8 для обычного HTTP) и закрепит её в state.tsv после первого успеха.

Файл со списком:

/opt/zapret2/lists/extra-domains.txt

Формат: один домен на строку, без http:// / www., поддоменов писать не надо (example.com автоматически покрывает foo.example.com):

forum.ru-board.com
example.com
some-blocked-site.org

После редактирования файл подхватывается live, без перезапуска сервиса z2k (см. ниже про политику апдейтов хост-листов). Через несколько секунд z2k начнёт пытаться обходить блокировку на этих доменах — по профилю rkn_tcp для HTTPS/TLS и по HTTP-профилю для порта 80. К YouTube-профилям и к QUIC ваш список не подключается: QUIC-обход работает по собственному списку доменов.

Стандартные списки (RKN-блок, YouTube, Discord, Instagram, etc.) обновляет планировщик z2k в 04:00, а также меню → [3] Обновить списки доменов. Свои добавки в extra-domains.txt через обновление не перезаписываются.

Дубликаты не принимаются

Домен, который уже есть в любом другом списке — РКН, YouTube, Discord, исключения, найденное автоматически, — в свой список добавить нельзя: панель откажет и скажет, в каком именно списке он уже лежит. Смысла в такой записи нет, обход для этого домена и так работает, а лишняя строка создаёт впечатление сделанной настройки.

Совпадением считается сам домен или любой его родитель: если в списке YouTube есть youtube.com, то www.youtube.com добавить не дадут — хост-листы и так покрывают все поддомены. Обратное разрешено: example.com шире, чем www.example.com, и его добавить можно.

Записи, попавшие в файл раньше (когда проверки не было), убираются автоматически при старте сервиса — в журнал пишется, сколько их было.

Вкладка «Автохостлист»

При включённом автохостлисте (меню [L] или переключатель в панели) в разделе «Доп. домены» появляется вторая вкладка — «Автохостлист». Там видно, что движок определил как заблокированное сам, без вашего участия.

Эти домены хранятся отдельно (/opt/zapret2/lists/autohostlist-domains.txt) и переживают обновление основного списка блокировок. Если движок ошибся и записал туда сайт, которому обход не нужен, — удалите его во вкладке: он уйдёт и из накопленного, и из рабочего списка, и обратно не вернётся.

Пока автохостлист выключен, вкладки нет — показывать в ней нечего.


Свои стратегии

Обычно z2k подбирает стратегию сам: перебирает варианты и закрепляет тот, что заработал (см. «Как работает autocircular»). Своя строка нужна редко — если автоподбор не справился или вы уже нашли рабочую комбинацию и хотите зафиксировать именно её.

Сначала попробуйте способ попроще. Не открывается конкретный сайт — добавьте его в extra-domains.txt. Залипла стратегия на одном домене — выберите или заморозьте её на вкладке «Автоподбор». Свои стратегии — уровень ниже: они меняют поведение сразу для целой группы трафика.

Стратегия задаётся не на домен, а на пул. Пулов четыре:

Пул Что покрывает Стратегий в автоподборе
rkn_tcp Заблокированные сайты (TCP/TLS) 50
yt_tcp YouTube (TCP) 22
gv_tcp YouTube видео, googlevideo (TCP) 22
yt_quic YouTube (QUIC/UDP) 9

Профили Telegram, Discord и HTTP так не настраиваются.

Своя строка заменяет пул целиком и выключает для него автоподбор: директива circular входит в саму строку, и если вы её не написали — ротации не будет, отработает ровно то, что задано. Остальные три пула продолжат подбираться сами.

Через веб-панель

Раздел «Стратегии» в веб-панели, вкладка «Свои стратегии»:

  1. Напротив нужного пула нажать «Своя стратегия» — откроется поле ввода.
  2. Вписать параметры nfqws2. Можно в несколько строк и с комментариями через # — при сборке конфига всё склеится в одну строку.
  3. «Проверить» — прогнать строку через движок, ничего не применяя. При ошибке показывается ответ самого nfqws2.
  4. «Сохранить и применить» — сохранить, пересобрать конфиг и перезапустить сервис.

Кнопка «Вернуть авто» удаляет вашу строку и возвращает пул на автоподбор.

За основу удобно взять штатную строку пула — она лежит в /opt/zapret2/extra_strats/ (TCP/RKN/Strategy.txt, TCP/YT/Strategy.txt, TCP/YT_GV/Strategy.txt, UDP/YT/Strategy.txt). Сами эти файлы править не нужно: они перезаписываются при обновлении.

Почему проверка обязательна. nfqws2 разбирает все профили как одну строку опций и при ошибке в любой её части не стартует вообще. Опечатка в строке для rkn_tcp уронит не «сайты», а весь обход — вместе с YouTube и Telegram. Поэтому кандидат прогоняется через nfqws2 --dry-run на полной собранной конфигурации во временном файле, и только пройдя её — сохраняется. Рабочий конфиг при неудачной проверке не трогается.

Через SSH

Панель хранит строки обычными файлами, по одному на пул:

/opt/zapret2/lists/custom-strategies/rkn_tcp.txt
/opt/zapret2/lists/custom-strategies/yt_tcp.txt
/opt/zapret2/lists/custom-strategies/gv_tcp.txt
/opt/zapret2/lists/custom-strategies/yt_quic.txt

Генератор читает их напрямую, так что править можно и руками — но этот путь не проходит проверку движком, и об ошибке вы узнаете по тому, что сервис не поднялся. Проще отредактировать файл по SSH, затем открыть раздел «Стратегии» в панели (ваш текст уже будет в поле) и нажать «Сохранить и применить» — проверка, пересборка и перезапуск произойдут сами.

Пустой файл или файл из одних комментариев игнорируется. Удалить файл — то же, что вернуть пул на автоподбор.

Свои строки не теряются. Они читаются заново при каждой пересборке конфига, поэтому переживают и переключение тумблеров в панели, и обновление z2k, и переустановку.


Управление сервисом

/opt/etc/init.d/S99zapret2 start
/opt/etc/init.d/S99zapret2 stop
/opt/etc/init.d/S99zapret2 restart
/opt/etc/init.d/S99zapret2 status

Удаление z2k

Два равноценных пути, оба удаляют одно и то же.

Из веб-панели. Внизу «Дашборда» — карточка «Удаление z2k». Кнопка открывает окно со списком того, что исчезнет, и полем, куда нужно набрать слово УДАЛИТЬ: пока оно не набрано, кнопка удаления неактивна. Слово проверяет не только страница, но и сам роутер — панель работает без пароля и доверяет всей домашней сети, поэтому единственная необратимая команда во всём её интерфейсе не срабатывает от случайного запроса.

Панель удаляется вместе со всем остальным, поэтому примерно на середине страница перестанет отвечать — это нормальное завершение, а не сбой. Журнал удаления при этом не теряется: он лежит в /tmp и переживает исчезновение дерева.

Из меню в терминале. Пункт [5] Удалить zapret2, подтверждение вопросом.

Удаляются: служба обхода и её автозапуск, правила iptables и netfilter-хуки, настройки, списки доменов, подобранные стратегии и сама веб-панель. Интернет после этого работает, но уже без обхода блокировок. Отмены нет — вернуть можно только установкой заново.

Если удаление когда-то прошло некорректно и остались зависшие процессы или мусорные правила — ниже отдельный скрипт зачистки.


Полная зачистка (z2k_cleanup)

Если zapret или zapret2 были удалены некорректно, остались зависшие процессы или мусорные правила — используйте скрипт полной зачистки:

{ curl --resolve raw.githubusercontent.com:443:213.176.74.63 -fsSL https://raw.githubusercontent.com/necronicle/z2k/z2k-enhanced/z2k_cleanup.sh || curl -fsSL https://raw.githubusercontent.com/necronicle/z2k/z2k-enhanced/z2k_cleanup.sh; } | sh

ВНИМАНИЕ: Скрипт удаляет ВСЁ связанное с zapret и zapret2:

  • Останавливает все процессы nfqws и nfqws2
  • Удаляет init-скрипты, netfilter хуки, iptables цепочки
  • Полностью удаляет директории /opt/zapret и /opt/zapret2 (включая конфиги, списки, стратегии)
  • Очищает ipset и временные файлы

После зачистки можно выполнить чистую установку z2k.


Поддерживаемые архитектуры

Архитектура определяется автоматически. Поддерживаются все платформы из zapret2 openwrt-embedded:

Архитектура Роутеры
arm64 / aarch64 Keenetic Hero, Ultra, Giga, Hopper и другие на ARM Cortex-A
arm Более старые модели на ARM
mipsel Keenetic на MT7621 (Extra, Start, Air и др.)
mips Older MIPS big-endian
mips64 MIPS64 (big-endian)
mips64el MIPS64 (little-endian)
lexra Realtek Lexra — обход работает, но без Telegram, детектора и проверки подписи (почему)
x86 / x86_64 x86-роутеры и виртуальные машины
riscv64 RISC-V
ppc PowerPC

Структура проекта

z2k/
├── z2k.sh                      # Bootstrap / main installer
├── z2k_cleanup.sh              # Complete uninstall
├── strats_new2.txt             # TCP strategy database (RKN 50 / YT 22 / GV 22)
├── quic_strats.ini             # UDP/QUIC strategy database (yt_quic + discord_voice)
├── lib/                        # Core modules (загружаются z2k.sh)
│   ├── utils.sh                # Utilities, safe_config_read, z2k_fetch с 5-layer fallback
│   ├── install.sh              # 16-step install + rollback
│   ├── strategies.sh           # Strategy parsing & management
│   ├── config.sh               # Configuration management
│   ├── config_official.sh      # nfqws2 config generation
│   ├── webpanel.sh             # CGI веб-панель installer
│   ├── menu.sh                 # Interactive menu (21 действие + выход)
│   └── auto_update.sh          # Self-update z2k через UPDATES.json
├── files/
│   ├── S99zapret2.new          # Init script
│   ├── 000-zapret2.sh          # ndmc hook
│   ├── init.d/                 # Дополнительные init-скрипты (TG watchdog и др.)
│   ├── ndm/                    # Keenetic ndmc-интеграция
│   ├── fake/                   # Binary protocol blobs
│   ├── lua/
│   │   ├── z2k-state-persist.lua   # Persistent strategy memory (state.tsv)
│   │   ├── z2k-detectors.lua       # Failure detectors (TLS alert, mid-stream stall, ...)
│   │   ├── z2k-modern-core.lua     # IP frag, QUIC morph, TLS shuffle, ECH
│   │   ├── z2k-fooling-ext.lua     # Dynamic-TTL fooling hook
│   │   └── z2k-range-rand.lua      # Randomised range injection
│   ├── lists/                  # Domain & IP lists (RKN, YouTube, Telegram, WARP game IPs, extra-domains)
│   ├── z2k-warp.sh             # Game-mode WARP split-tunnel (routing)
│   ├── z2k-scheduler.sh        # Periodic tasks (list update, self-heal) — replaces cron
│   ├── z2k-config-validator.sh # Config validation
│   ├── z2k-update-lists.sh     # Auto domain list updater
│   ├── z2k-auto-update.sh      # Self-update cron entry
│   ├── z2k-geosite.sh          # Geosite ru-blocked import
│   ├── z2k-diag.sh             # Single-page troubleshooting summary
│   ├── z2k-blocked-monitor.sh  # Watch nfqws2 logs for blocked sessions
│   ├── z2k-tg-watchdog.sh      # Telegram tunnel health watchdog
│   └── z2k-fix-tg-watchdog.sh  # TG watchdog hotfix
├── webpanel/                   # Веб-панель (установщик, CGI-бэкенд, фронтенд)
├── z2k-detect/                 # Демон автодетекции блокировок (Go)
├── rt-proxy/                   # Прокси для RuTracker (Go)
├── vps-relay/                  # Серверный релей туннелей (Go)
├── vps-stats/                  # Приём и агрегация анонимной статистики
├── extras/                     # discord-voice-hosts.txt и прочие вспомогательные файлы
├── UPDATES.json                # Манифест обновлений: версии + sha256 каждого файла
├── mtproxy-client/             # Telegram tunnel (Go)
│   ├── main.go                 # Entry point
│   ├── tunnel.go               # Tunnel client
│   └── listener.go             # SO_ORIGINAL_DST (IPv4 + IPv6)
├── tests/                      # Test framework (lua + shell fixtures, see tests/run_all.sh)
└── .github/workflows/
    ├── ci.yml                  # shellcheck + go + luacheck + cross-arch build
    ├── publish.yml             # Публикация релиза: двигает z2k-enhanced после зелёного CI
    ├── security.yml            # Еженедельный скан: govulncheck, zizmor, CodeQL, gitleaks
    └── jsdelivr-purge.yml      # Сбросить jsdelivr CDN после релиза

Примечания

  • Если вы используете IPv6 в сети, убедитесь что он включён в прошивке (см. требования выше).
  • Автообновление списков доменов — планировщиком z2k в 04:00 (/opt/zapret2/z2k-update-lists.sh).
  • Если конкретный сайт не открывается — добавь домен в /opt/zapret2/lists/extra-domains.txt (через webpanel «Доп. домены» или вручную); autocircular подберёт страту в течение нескольких TLS-handshake'ов.
  • Обратный случай: что-то работало без z2k и сломалось с ним — вынеси это в «Исключения». Сайт исключается по домену, приложение без видимого имени (камера, домофон, видеозвонки) — по адресу его сервиса.
  • RST_FILTER по умолчанию выключен для совместимости с Cloudflare; если у провайдера подтверждены fake-RST инжекты ТСПУ, добавь RST_FILTER=1 в /opt/zapret2/config и перезапусти сервис.
  • Для траблшутинга пришли вывод z2k diag — это одностраничная сводка о состоянии всех компонентов.
  • Валидация конфигурации: z2k validate. Откат: z2k rollback.

Подпись обновлений

Начиная с этой версии манифест обновлений подписывается, и роутер проверяет подпись перед тем, как что-либо применить. Приватный ключ в репозитории отсутствует — в этом и смысл: тот, кто получит доступ к репозиторию, подписать обновление не сможет.

Публичный ключ едет вместе с установкой (files/etc/z2k-update-pub.pem). Его отпечаток:

1041720fa0dff53e2babbf547a705c2f43c30bca2c6ca2ddf7144cfe3b470a01

Когда это может понадобиться. Если ключ придётся сменить, установка на роутере, который уже принимал подписанные обновления, остановится и покажет отпечаток нового ключа. Молча подменять ключ, которому вы уже доверяете, она не станет. Сверьте показанный отпечаток с тем, что здесь, и если совпадает — повторите установку, подтвердив замену:

Z2K_TRUST_NEW_KEY=<отпечаток> sh z2k.sh install

Если отпечаток не совпадает — не подтверждайте: значит установщик пришёл не от нас.

Отказ проверки подписи останавливает только автообновление. Обход при этом продолжает работать, и установка из README доступна всегда — так сделано намеренно, чтобы потеря ключа не могла запереть роутер навсегда.


Для тех, кто собирается править код

Документ О чём
ARCHITECTURE.md Из чего состоит, граф подключения модулей, что переживает обновление
RELEASING.md Как выпустить релиз: рабочая ветка против канала доставки, patch против reinstall, откат
CONTRIBUTING.md Правила правок: где допустим fail-open, особенности BusyBox ash и MIPS
SECURITY.md Модель угроз честно: что защищено, что нет и почему

Лицензия

MIT