Bumps the actions group with 3 updates: [actions/setup-node](https://github.com/actions/setup-node), [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action). Updates `actions/setup-node` from 7.0.0 to 7.1.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits]( |
||
|---|---|---|
| .github | ||
| archive/custom-detectors-rotation | ||
| docs | ||
| extras | ||
| files | ||
| lib | ||
| mtproxy-client | ||
| rt-proxy | ||
| scripts | ||
| tests | ||
| vps | ||
| vps-relay | ||
| webpanel | ||
| z2k-detect | ||
| z2k-verify | ||
| z2k-warpd | ||
| .gitattributes | ||
| .gitignore | ||
| .gitleaks.toml | ||
| .gitleaksignore | ||
| .luacheckrc | ||
| ARCHITECTURE.md | ||
| build-matrix.tsv | ||
| CONTRIBUTING.md | ||
| 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 | ||
| 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
- TiaMax
- Denis
- Mega Man
- TheGreatYogo
- logistik77
- b11d11
- BloodKnife39
- SIGogelon
- yozh
- Altaec
- DIDIQ Rawa
- GregMSK
- Кожевников
- bootnet
- ewgen911
- cmfifty
- Ret80
Windows: если на iPhone или Mac сайты открываются, а на компьютере с Windows висят — включите метки времени TCP одной командой.
Важно: после установки применяются 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 на собственном движке z2k; списки игровых IP/CIDR, устройства «целиком в WARP» и, отдельно, клиенты WDTT настраиваются в вебморде. Ставится только по кнопке. Подробнее — раздел «Игровой режим (WARP)» ниже.
Инструменты и мониторинг
- Веб-панель — управление и мониторинг через браузер: статус и запуск сервиса, стратегии, списки, диагностика с проверкой отдельного домена, обновление и удаление z2k. Можно включить вход по паролю — тому же, что у веб-интерфейса роутера. Открывается без интернета: шрифты и всё остальное лежат на самом роутере, ни одного обращения наружу
- Config validator — валидация конфигурации перед применением (порты, hostlist-файлы, blob-файлы, lua-desync)
- Rollback — откат конфигурации к предыдущему snapshot
- Планировщик — обновление списков доменов и обслуживающие задачи по расписанию (заменяет cron, который на Entware ненадёжен)
Установка
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
Если opkg update висит или обрывается
У части провайдеров сервер пакетов Entware (bin.entware.net) обрывает загрузку на первых десятках килобайт, и opkg висит без конца. Возьмите пакеты через зеркало на узле проекта z2k — оно отдаёт только bin.entware.net и больше ничего:
sed -i 's|http://bin.entware.net|http://213.176.74.63/entware|g' /opt/etc/opkg.conf
opkg update
opkg install coreutils-sort curl grep gzip ipset iptables kmod_ndms xtables-addons_legacy openssl-util
sed -i 's|http://213.176.74.63/entware|http://bin.entware.net|g' /opt/etc/opkg.conf
Последняя строка возвращает основной сервер в настройки opkg.
Сам установщик z2k ставит и обновляет пакеты через узел и без этого шага.
Стороннее зеркало вместо узла подойдёт, только если у вас стоит полноценный wget (пакет wget-ssl): встроенный в Entware busybox wget не умеет https, а по http зеркало ему отказывает.
sed -i 's|http://bin.entware.net|https://mirrors.bfsu.edu.cn/entware|g' /opt/etc/opkg.conf
opkg update
Вернуть основной сервер: sed -i 's|https://mirrors.bfsu.edu.cn/entware|http://bin.entware.net|g' /opt/etc/opkg.conf
Если Entware не устанавливается
Официальный установщик Entware во время установки сам качает пакеты с того же bin.entware.net, поэтому на таких линиях установка обрывается. Для этого случая есть офлайн-установщики: официальный установщик с пакетами внутри, сеть при установке не нужна. Архивы для всех архитектур, инструкция и контрольные суммы — в репозитории entware-offline.
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
4) Windows: если сайты висят и не открываются
Если на iPhone или Mac сайты открываются, а на Windows-компьютере долго грузятся и падают, включите в Windows метки времени TCP. Откройте командную строку от имени администратора и выполните:
netsh interface tcp set global timestamps=enabled
Вернуть как было:
netsh interface tcp set global timestamps=disabled
Зачем это нужно: часть стратегий портит метку времени в поддельном пакете, чтобы сервер его отбросил. В Windows метки по умолчанию выключены, поэтому сервер принимает подделку, и соединение зависает. На iPhone и Mac метки включены, там всё работает. От блокировки по IP это не помогает.
Меню
Меню открывается той же командой, что и установка — если 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 не обрабатывает |
| [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) |
| [H] | Аппаратный offload — per-flow исключение (нативная ротация на Keenetic) |
| [L] | Автохостлист — движок сам находит заблокированные домены |
Проверка домена (z2k-detect)
Меню [Y] и диагностика в веб-панели проверяют выбранный домен:
DNS → TCP → TLS → HTTP. Результат показывает, на какой стадии произошёл
отказ и есть ли домен в действующих списках. Проверка ничего в них не записывает.
Для запуска из консоли: /opt/sbin/z2k-detect probe example.com.
Также доступны отдельные проверки classify, quic, voice, tcp16 и dnsms.
Экспериментальная фоновая автодетекция удалена. При обновлении или переустановке
её демон останавливается, автозапуск и накопленный discovered-domains.txt
удаляются. Пользовательские списки сохраняются. Отдельный автохостлист nfqws2
в меню [L] остаётся выключенным по умолчанию.
Обрыв на 16 КБ (подбор имени по сетям)
Отдельный вид блокировки, который не лечится перебором стратегий: сайт открывается, соединение живое, но страница обрывается на середине — приходит первые 15–16 КБ и дальше тишина до таймаута. Перебор плеч тут бесполезен, потому что рукопожатие проходит успешно: коробка провайдера пропускает начало и режет поток дальше.
Пробивается тем, что вместе с настоящим приветствием отправляется поддельное — с именем сайта, который у провайдера в белом списке. Поддельное — это копия настоящего приветствия с заменённым именем (см. «Фейковый ClientHello — клон настоящего» ниже). Настоящее имя остаётся настоящим (шифрование не ломается), а коробка перестаёт смотреть внутрь потока.
Это отдельная система, не ротация. Автоподбор стратегий про этот блок ничего
не знает и на него не реагирует. Есть ли блок на линии и какое имя берёт какую
сеть, выясняет проба линии (z2k-tcp16-probe.sh): она ходит на опорные
адреса в разных сетях, ищет обрыв и подбирает каждой сети с обрывом своё имя.
Имя подбирается не для сайта, а для сети (автономной системы): у одного
провайдера пробивает одно имя на всю сеть Hetzner, другое — на DigitalOcean, а
для некоторых сетей не работает ни одно. Результат — state/tcp16_sni.txt,
карта сетей — lists/tcp16_nets.txt; в рантайме lua/z2k-tcp16.lua только
подставляет имя по этой карте.
Когда проверяется. Раз в сутки в 03:30, при первом запуске службы — и вручную: на дашборде панели карточка «Обрыв на 16 КБ» показывает вердикт последней пробы (с давностью), число сетей с обрывом и подобранных имён и доехал ли обход до конфига; кнопка «Пробить 16 КБ» запускает пробу сейчас и показывает её журнал. Проверка занимает две-три минуты и трафик пользователя не трогает. Сетям, где обрыва нет, никакое имя не подставляется.
Замер на линии автора: сеть Hetzner отдавала 15 994 байта и вставала, с подобранным именем — 163 654 байта за 0.64 с, полная страница.
Динамический 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), поэтому обход и автоподбор стратегий работают и на офлоадных устройствах.
Детекция неудач
Базовые RST, исходящие ретрансмиссии и пороги прогресса обслуживает
zapret-auto.lua. z2k-alert.lua добавляет разбор ранних TLS/HTTP-ответов,
а z2k-quic-silence.lua — ограниченное по времени наблюдение QUIC v1/v2.
- TCP: две ретрансмиссии байтов первого запроса (
retrans=2,maxseq=32768) или входящий RST в первых 4 КБ (inseq=4096). Продолжения ClientHello/HTTP-заголовков учитываются, повторы последующих запросов и входящие ретрансмиссии сами по себе не вызывают ротацию. - TLS: открытый fatal alert до ServerHello считается неудачей, в том числе при разделении записи между пакетами. Зашифрованные записи и алерты после ServerHello этим правилом не классифицируются.
- HTTP: неудачей считаются редиректы на явно перечисленные порталы блокировки и характерные маркеры в 4xx/5xx. Заголовки и начало тела собираются в пределах 4096 байт. Обычные ошибки и редиректы на другой сайт нейтральны; 2xx/304 и редирект на тот же хост сбрасывают счётчик неудач.
- QUIC в пуле
quic: один Initial запускает таймер на 5 с. Новый этап рукопожатия продлевает ожидание, но суммарно не более 15 с. Retry, Initial и произвольный UDP-ответ не означают успех. Наблюдаемый обмен short-header пакетами в обе стороны завершает проверку успешно; исчерпание окна перехвата — нейтрально. Пределы окна передаются генератором конфигурации. Неизвестные версии QUIC и остальные UDP-пулы используют штатные счётчики. - Штатный успех: TCP-пакет с новыми данными за
inseq/maxseq, без RST/FIN; для UDP — число входящих пакетов вышеudp_in. Это признаки транспортного прогресса, а не гарантия работающего приложения. - Ротация: три неудачи с зазором не более 60 с (
fails=3,time=60), для видео — 300 с. Соединение сохраняет стратегию, выбранную при его начале. Ротация выбирает стратегию для новых соединений; результаты старого поколения не меняют её счётчики, даже после полного обхода круга. reset: RST клиенту отправляется только после принятой неудачи по исходящим ретрансмиссиям. Отключается черезZ2K_CIRCULAR_RESET=0.
Пороги и проводка сейчас экспериментальные; сетевой прогон на роутере ещё
не заменён результатами Lua-тестов. retrans=2 не меняет кворум fails=3.
Ретрансмиссии не задают фиксированное число секунд до решения.
Состояние ведётся по полному hostname. Только поддомены googlevideo.com
в GV/QUIC (и объединённом Google-профиле) используют общий ключ CDN.
Старые агрегированные записи автоматически не распространяются на поддомены:
части хостов потребуется повторный подбор и повторное ручное закрепление.
Состояние IPv4/IPv6 разделено (family_split). Таймерная ротация сохраняется
на диск и без следующего пакета. Слой сохранения больше не отменяет ротацию
по недавнему успеху соседнего соединения; явное закрепление оператором сохраняется.
TTL и несколько ответов от соседних соединений не позволяют достоверно отличить блокировку от обычного сетевого события, поэтому такие запреты ротации удалены. RST, ранний TLS alert и таймаут QUIC всё ещё могут иметь обычные сетевые или серверные причины. QUIC здесь не расшифровывается. Если видимость закончилась, детектор предпочитает пропустить случай, а не наказывать стратегию. ACK на ClientHello с последующим полным молчанием TCP отдельным таймером не покрыт. Обрыв на 16 КБ обслуживается своей системой и в эту ротацию не входит.
Изменения требуют согласованной поставки Lua ядра и обёрток; см. заметку для выпуска.
Фейковый ClientHello — клон настоящего
Каждое плечо с фейком (fake, а также подстановка имени при обрыве на 16 КБ)
шлёт не заготовленный снимок чужого браузера, а копию ClientHello самого
устройства с заменённым именем (tls_client_hello_clone из zapret2: sni_del
sni_first=<имя>). Отпечаток фейка совпадает с отпечатком настоящего трафика этого клиента, и DPI не может отличить фейк по телу — только по имени. Замер на линии автора (ЭР-Телеком): там, где встроенный снимок уже «спалился» и первый ClientHello падал, клон открывал сайт.
Прежние снимки (files/fake/tls_clienthello_*.bin) остались у каждого плеча
запасным (fallback=): если ClientHello не разобрался, движок берёт снимок.
Многосегментные ClientHello (Chrome и Firefox с постквантовым ключом, на линии
автора 18 из 30 за минуту) движок собирает целиком, и клон строится с них
тоже. Раньше сборка была выключена: большие ClientHello к серверам с
крошечным начальным окном (анти-DDoS reg.ru) висли, потому что SYN-ACK не
доходил до движка и его защита по окну не срабатывала — правило очереди
connbytes 1:N на ядре Keenetic не отдаёт первый ответный пакет. Починено в
форке (connbytes 0:N), выключатель снят.
Персистентность
Найденные рабочие стратегии сохраняются в state.tsv и переживают перезапуск сервиса. Файл защищён от конкурентной записи через lock-механизм с atomic rename.
Статистика стратегий
Проект не собирает и не отправляет статистику срабатывания стратегий. Сохранение локального состояния ротации в state.tsv продолжает работать.
Веб-панель мониторинга
Встроенная веб-панель для просмотра состояния через браузер.
Установка через меню z2k:
- Открыть меню через curl (раздел «Меню» выше — та же команда установки открывает меню)
- Выбрать
[P]→[1](Установить/Переустановить)
В том же подменю: [2] удалить, [3] перезапустить, [4] показать адрес, [5] адрес/порт/IPv6 (см. ниже), [6] вход по паролю (см. ниже).
После установки панель доступна в локальной сети по адресу http://ROUTER_IP:8088/ (порт 8088, без пароля — как и веб-интерфейс самого Keenetic). Пароля нет намеренно: панель рассчитана на домашнюю сеть. При этом запросы, пришедшие со страницы стороннего сайта, панель отклоняет — открытый в соседней вкладке сайт не может ничего в ней переключить.
Разделы панели: Дашборд (статус сервиса, запуск/остановка/перезапуск, карточка «Обрыв на 16 КБ» с кнопкой «Пробить 16 КБ», баннер обновления z2k, удаление z2k — см. ниже), Режимы (переключатели функций), Стратегии (см. ниже), WARP (списки игровых IP — см. ниже), Исключения (см. ниже), Доп. домены (свой список доменов для обхода), Диагностика (проверка домена + сводка, см. ниже), Благодарности.
Адрес, порт и IPv6
По умолчанию панель слушает адрес роутера в локальной сети на порту 8088. Изменить это можно в меню: [P] → [5].
- Адрес и порт вводятся вручную. Адреса роутера показаны подсказкой, но выбор ими не ограничен: можно вписать адрес, которого сейчас нет — поднимаемый позже VPN, второй мост. Если введённого адреса на роутере не окажется, об этом предупредят, но не запретят.
- Задать можно заранее, до установки панели. Значения сохранятся и применятся при первой же установке — не придётся сперва поднимать панель не там, где нужно, а потом переселять.
- IPv6 — отдельная строка. Панель слушает один адрес IPv4, и чтобы отвечать ещё и по IPv6, открывается второй сокет. По умолчанию выключено. Можно указать конкретный адрес или
::— все интерфейсы; во втором случае помните, что у IPv6 нет NAT и адрес виден снаружи напрямую, если открыть входящие в межсетевом экране роутера. - Возврат к заводским — отдельным вопросом в том же пункте.
Всё это переживает обновления. Правка lighttpd.conf руками — нет: файл собирается заново при каждой установке, и дописанное в него стирается.
Вход по паролю
По умолчанию панель работает без пароля и доверяет всей локальной сети — так же, как веб-интерфейс самого Keenetic. Снаружи она недоступна: слушает только локальный адрес, отвечает только на обращения со своей же страницы и отклоняет запросы, пришедшие с постороннего сайта.
Если этого мало — например, к сети есть доступ у гостей — включите вход: [P] → [6].
- Отдельный пароль не заводится. Логин и пароль — те же, что у веб-интерфейса роутера: панель спрашивает сам роутер. Хранить нечего, сменили пароль на роутере — он сразу действует и здесь, забыли — восстанавливается штатными средствами Keenetic.
- Пароль не передаётся по сети: страница считает одноразовый ответ на случайный запрос роутера и отправляет только его.
- Пускаются только те учётки, которым разрешён веб-интерфейс. Пароль от сетевой папки управление обходом не откроет.
- В разделе «Режимы» можно выбрать срок входа: 2 или 12 часов, сутки либо 7 дней. По умолчанию — 24 часа; настройка применяется при следующем входе.
- Запереться нельзя. Вход всегда снимается тем же пунктом меню, а терминал не зависит ни от панели, ни от веб-интерфейса роутера.
Панель работает по HTTP без шифрования. Пароль защитит от того, кто просто оказался в вашей сети, но не от того, кто слушает трафик внутри неё.
Раздел «Стратегии»
Всё, что касается стратегий, живёт в одном разделе с тремя вкладками.
«Автоподбор» — что подбор выбрал по каждому домену, и управление этим выбором:
- Ручной выбор стратегии — в выпадающем списке напротив домена выбрать любую стратегию из пула категории (проскочить заведомо нерабочую, протестировать свою, закрепить понравившуюся). Применяется на лету (~2 с); автоподбор при этом продолжается.
- Заморозка 🔒 — кнопка-замок фиксирует строку на текущей стратегии: автоподбор перестаёт её менять. Повторное нажатие — разморозка, подбор возобновляется.
- Голос Discord — отдельный селектор над таблицей: голосовой пул не привязан к домену, поэтому в таблице его нет, а выбрать стратегию можно заранее, до первого звонка.
- × (сброс) — вернуть строку к стратегии 1 и режиму «авто».
Вверху вкладки есть экспериментальная кнопка «Создать уникальный набор». Для YouTube она подбирает стратегию по i.ytimg.com, а для видеопотока — по googlevideo.com; для каждого имени используются два IPv4-адреса с исходным доменом в SNI. Классификатор по очереди ищет кандидатов с каждого адреса, проверяет каждый найденный вариант на всей паре и продолжает поиск после несовпадения. В режиме «И те, и другие» кандидат должен пройти и современный, и старый TLS ClientHello на обоих IP. Различие первых найденных стратегий не останавливает подбор. Если DNS вернул меньше двух адресов или общий кандидат не найден, весь набор останавливается без изменения пулов. Затем измеряется instagram.com по QUIC и проверяется общий TCP-приём только на современном TLS 1.3 (tcp13, новое приветствие) для discord.com, instagram.com и rutor.org. Старое TLS-приветствие для этих трёх проверок не замеряется. Если первые найденные строки совпали на всех трёх доменах, общий результат идёт в rkn_tcp; иначе включается Discord-fallback и используется измеренная строка Discord (также TLS 1.3). Поиск использует штатную методику классификатора и её набор гипотез; результат относится к проверенным адресам и не обещает работу на будущих CDN-узлах.
Весь прогон занимает в среднем около 20 минут, но на сложной линии может идти заметно дольше. Панель показывает фактическую длительность завершённого подбора и сохраняет её после перезагрузки страницы. Результаты сохраняются сразу в четыре пользовательских пула: yt_tcp, gv_tcp, quic и rkn_tcp. Перед запуском панель предупреждает, если любой из этих пулов уже настроен вручную: новая строка меняет поведение соответствующего пула целиком, а не только проверенного домена. Все четыре строки сначала проверяются вместе; при ошибке замеры не записываются. Успешный набор регенерирует конфиг один раз и перезапускает работающий сервис один раз. Если сервис выключен, конфиг сохранится, но для применения сервис нужно запустить.
Кнопка «Вернуть все категории к автоматике» удаляет пользовательские переопределения всех пяти пулов — yt_tcp, gv_tcp, quic, rkn_tcp и discord_udp, — затем пересобирает конфиг и один раз перезапускает работающий сервис. Перед сбросом панель спрашивает подтверждение.
Ручной выбор и заморозка сохраняются и переживают перезагрузку роутера и обновление z2k. Выпадающий список всегда показывает полный набор стратегий категории.
«Свои стратегии» — задать свою строку параметров вместо подбора, целиком на пул (см. «Свои стратегии»).
Важно: пул, которому задана своя строка, на вкладке «Автоподбор» не появляется. Директива circular входит в саму строку стратегии, и ваша строка заменяет её целиком — подбор для этого пула выключается и записей он не создаёт. Пул при этом работает, просто ровно так, как вы написали.
Раздел «Диагностика»
Проверка домена. Вводите адрес — панель делает одну пробу мимо обхода и показывает, на какой стадии всё обрывается: имя не резолвится, соединение не устанавливается, TLS рвут или всё проходит. Рядом — адреса, на которые домен разрешился, причина отказа и вывод: блокирует ли его DPI и есть ли он уже в списках обхода. Ничего не меняет и никуда не записывает; полный текст отчёта разворачивается по ссылке — его удобно переслать в чат. То же самое доступно в терминальном меню пунктом [Y].
Сводка отвечает на вопросы, которые мы обычно задаём в чате, чтобы их не пришлось задавать. Сверху — что именно не так: список проблем явным текстом, а если их нет, одна строка об этом. Ниже детали: версия и архитектура, состояние сервиса и правил, место на диске и память, смонтирован ли /opt, доустановлены ли модули Netfilter, умеет ли ядро ipset bitmap:port (без него обход не работает целиком), не включён ли fastnat (при нём стратегии не применяются), резолвится ли DNS, состояние туннеля и выбранные стратегии. В конце — ошибки, собранные по всем логам z2k, повторы схлопнуты.
Если сервис не запустился, сводка называет причину, а не только сам факт. Строка «причина отказа» показывает то, что сказал сам движок: не найден файл списка, неверный параметр, и так далее. Если движок промолчал, сводка переспрашивает его отдельно и говорит прямо, когда конфигурация в порядке — значит искать надо не в ней. Раньше в этом месте стояло только «не запущен», и дальше начиналась переписка.
Правила обхода считаются двумя половинами — исходящие и входящие. Обе нужны: без входящих обход продолжает работать, но стратегии перестают переключаться сами, потому что признаки блокировки приходят именно во входящих пакетах. Снаружи это выглядит не как поломка, а как «стратегия залипла», поэтому пропажа входящей половины попадает в список проблем отдельной строкой.
Две кнопки для отправки:
- «Копировать» — компактная сводка, помещается в одно сообщение.
- «Скачать файл» — полный отчёт с логами. В сообщение он не влезает, поэтому отправляется вложением. Это предпочтительный вариант, когда что-то не работает.
Отдельного раздела «Логи» больше нет: он показывал первый попавшийся файл из трёх под общим заголовком «Сервисный лог», без выбора и без подписи, а остальные логи из панели были недоступны вовсе. Теперь их читает сводка.
WARP — списки адресов и доменов
Раздел «WARP» управляет ipset'ом игрового трафика (см. «Игровой режим (WARP)»):
- Тумблер WARP — включает/выключает split-туннель (переехал сюда из «Режимов»).
- Списки — просмотр и правка пользовательских списков IPv4/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. Править его руками можно: одна запись на строку, комментарии после # и пустые строки не мешают. Строки с доменами пропускаются, при старте z2k сообщает, сколько их пропущено. Правка файла вступает в силу после перезапуска z2k, панель применяет сразу. Пояснение к формату лежит рядом, в файле 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: трафик к игровым серверам из списка и трафик выбранных устройств заворачивается в туннель, всё остальное идёт напрямую. Десинка и автоподбора здесь нет — только маршрутизация.
- Движок свой —
z2k-warpd, часть z2k. Транспорт выбирает сам: WireGuard по UDP (быстрый, с запасными портами на случай блокировки), а если провайдер режет UDP целиком — MASQUE по TCP 443. Живость туннеля проверяется по факту (handshake, счётчики, сквозная проба), мёртвый туннель не держит трафик: он уходит напрямую, пока движок переподключается. - Ставится только по кнопке. Пока вы не нажали «Установить WARP» в разделе «WARP» вебморды (или
[I]в меню[E]), на роутере нет ни движка, ни демона, ни интерфейса. Установка скачивает бинарь (~7 МБ) и регистрирует устройство у Cloudflare; ничего не запускается. Тумблер включает и выключает туннель; «Удалить WARP» убирает движок, оставляя 1 КБ ключа устройства — повторная установка не заводит новое устройство. - Списки по играм — берутся из очищенного проекта
YOZH3G/ru-gaming-blocklistи обновляются автоматически. На свежей установке не включён ни один — выберите нужные игры в разделе «WARP», иначе в туннель ничего не пойдёт. Общий IP-список апстрима не подключается ко всем играм сразу; свои адреса добавляются отдельными списками там же. - Домены в списках — точное имя
example.comи маска*.example.com(только поддомены, не самexample.com) разрешены наряду с IPv4/CIDR. Имена с национальными символами вводятся в ASCII/Punycode. Поведение следует принципу Cloudflare One domain-based Split Tunnels: после DNS-ответа IP временно направляется через туннель. В z2k DNS-ответ пассивно наблюдается на роутере, поэтому клиенту не нужно ставить программу, но устройство должно использовать DNS роутера или обычный незашифрованный DNS, проходящий через него. Собственный DoH/DoT приложения, ранее закэшированные адреса, AAAA-only и IPv6 на этом этапе не покрываются. Правила действуют только для получившего ответ LAN-устройства и истекают по TTL (не дольше часа). Если несколько сайтов делят IP, другое соединение того же устройства к нему тоже может попасть в WARP. - Устройства — блок «Устройства» в разделе «WARP»: IP или MAC по строке, весь трафик устройства идёт в WARP независимо от списков (консоль, телефон).
- Клиенты WDTT — отдельный выключенный по умолчанию переключатель направляет весь трафик клиентов, прошедший декапсуляцию на интерфейсе
wdtt0, через WARP. Внешнее соединение самого WDTT-туннеля не затрагивается. Опция действует при включённом WARP и наличииwdtt0; при выключении WARP его маршрут снимается. - Интерфейс туннеля —
z2ktunN; в веб-интерфейсе Keenetic он не показывается и с чужими туннелями (opkgtunN) не конфликтует.
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 |
quic |
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/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 (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-alert.lua # поправки к штатному детектору неудач
│ │ ├── z2k-quic-silence.lua # детектор молчания для QUIC
│ │ ├── 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
│ │ └── z2k-tcp16.lua # подстановка имени по сети (обрыв на 16 КБ), рантайм пробы
│ ├── lists/ # Domain & IP lists (RKN, YouTube, Telegram, WARP game IPs, extra-domains, tcp16_nets)
│ ├── z2k-warp.sh # Game-mode WARP: install/enable/remove + routing over z2k-warpd
│ ├── z2k-scheduler.sh # Periodic tasks (list update, self-heal) — replaces cron
│ ├── z2k-tcp16-probe.sh # Проба линии: ищет сети с обрывом на 16 КБ и подбирает им имя
│ ├── 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/ # Эксплуатация узла релея: модель, сверка, раскатка, регламент (vps/README.md)
├── 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). - Проба линии на обрыв 16 КБ — тем же планировщиком в 03:30 (
/opt/zapret2/z2k-tcp16-probe.sh). - Если конкретный сайт не открывается — добавь домен в
/opt/zapret2/lists/extra-domains.txt(через webpanel «Доп. домены» или вручную); autocircular подберёт страту в течение нескольких TLS-handshake'ов. - Обратный случай: что-то работало без z2k и сломалось с ним — вынеси это в «Исключения». Сайт исключается по домену, приложение без видимого имени (камера, домофон, видеозвонки) — по адресу его сервиса.
- Для траблшутинга пришли вывод
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