|
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
|
||
|---|---|---|
| .github | ||
| archive/custom-detectors-rotation | ||
| extras | ||
| files | ||
| lib | ||
| mtproxy-client | ||
| rt-proxy | ||
| scripts | ||
| tests | ||
| vps-relay | ||
| vps-stats | ||
| webpanel | ||
| z2k-detect | ||
| z2k-verify | ||
| .gitattributes | ||
| .gitignore | ||
| .luacheckrc | ||
| ARCHITECTURE.md | ||
| build-matrix.tsv | ||
| CONTRIBUTING.md | ||
| debug.sh | ||
| eslint.config.mjs | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| quic_strats.ini | ||
| README.md | ||
| release.sh | ||
| RELEASING.md | ||
| SECURITY.md | ||
| strats_new2.txt | ||
| UPDATES.json | ||
| UPDATES.json.sig | ||
| UPSTREAM_PROPOSALS.md | ||
| z2k.sh | ||
| z2k_cleanup.sh | ||
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 (раздел «Изменить набор компонентов»):
- «Модули ядра подсистемы Netfilter» — обязательно, на всех прошивках и роутерах.
- «Протокол 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].
Как работает:
- Слушает DNS-запросы клиентов. Источник наблюдения авто-детектится: AdGuardHome querylog → dnsmasq.log → AF_PACKET sniff на UDP/53 (универсальный fallback, работает без логов)
- На каждый новый домен — 4-стадийная проба: DNS → TCP:443 → TLS → HTTP read 32KB
- Классификация по 22 типизированным кодам (
tls_garbage,http_cutoff,mtls_required,tcp_refused, ...) - Решение:
- HOT — путь до сервера не работает → домен дописывается в
discovered-domains.txt, nfqws2 подхватывает inotify, следующий запрос юзера уже через bypass - IGNORE — DNS не резолвится / сервер сам отказал политикой (typed TLS alert / mTLS)
- HOT — путь до сервера не работает → домен дописывается в
Управление:
- Меню
[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:
- Открыть меню через curl (раздел «Меню» выше — та же команда установки открывает меню)
- Выбрать
[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.16–31.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]. Клиентusquez2k скачивает сам при первом включении.
Discord — голосовые каналы (фикс на ПК)
Веб и текст Discord z2k тянет на роутере сам. А вот голос иногда виснет на «Connecting» — провайдер душит финские голосовые серверы Discord. На уровне роутера это не лечится (нужно было бы ~200 DNS-записей — почти весь лимит Keenetic), поэтому фикс делается на самом ПК: пином финского диапазона в hosts-файл на рабочий Cloudflare-адрес.
Готовый список (200 строк finlandNNNNN.discord.media → 104.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 входит в саму строку, и если вы её не написали — ротации не будет, отработает ровно то, что задано. Остальные три пула продолжат подбираться сами.
Через веб-панель
Раздел «Стратегии» в веб-панели, вкладка «Свои стратегии»:
- Напротив нужного пула нажать «Своя стратегия» — откроется поле ввода.
- Вписать параметры nfqws2. Можно в несколько строк и с комментариями через
#— при сборке конфига всё склеится в одну строку. - «Проверить» — прогнать строку через движок, ничего не применяя. При ошибке показывается ответ самого nfqws2.
- «Сохранить и применить» — сохранить, пересобрать конфиг и перезапустить сервис.
Кнопка «Вернуть авто» удаляет вашу строку и возвращает пул на автоподбор.
За основу удобно взять штатную строку пула — она лежит в /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