AntiGoblin — это панель управления для Keenetic + Entware + XKeen/xray + sing-box, которая живет на самом роутере.
После установки рабочий сценарий пользователя:
- Открыть UI на
http://<router-ip>:8899/. - Заполнить
VLESS Reality. - Создать routing-группы.
- Нажать
Сохранить и применить. - В Keenetic web UI назначить нужные устройства в политику
xkeenв разделе «Приоритеты подключений».
После этого роутер использует:
- политику Keenetic
xkeenдля выбора устройств; iptablesдля перехватаTCPиUDPустройств изxkeen;xrayдля маршрутизацииTCPвvless-realityилиdirect;sing-boxдля маршрутизацииUDPв VLESS Reality (через локальный SS-relay вxray).
Текущая живая модель runtime:
- любая UI-группа с outbound
vless-realityгонит иTCP, иUDPчерез VPN — отдельных флагов для UDP нет; - группы с outbound
bypassобходятxrayполностью черезRETURN; - группы с outbound
directвходят вxray, но уходят напрямую без VPN; - общий
UDPустройств вне VPN-групп идет напрямую; - локалка и discovery обходят
xrayчерезRETURN.
- Подготовка Keenetic (один раз руками)
- Установка одной командой
- Что делать после установки
- Где брать списки IP / CIDR / доменов для популярных сервисов
- Структура проекта
- Источник истины
- Runtime-файлы на роутере
- Обновление
- Удаление
- Разработка
- Инварианты проекта
- Правила проекта
- Что под капотом и кому спасибо
- Лицензия и пользовательское соглашение
Подходит любой Keenetic c USB-портом и поддержкой Entware. Live-инсталляция, на которой проект разрабатывался и проверялся — Netcraze Giga (ARM-сборка KeeneticOS). На других ARM-роутерах Keenetic должно работать без изменений. MIPS-модели (Lite/4G/Air) формально совместимы, но xray + sing-box под MIPS ставить тяжелее и performance скромнее.
Минимальные требования:
- USB-порт (USB 2.0 хватает, USB 3.0 быстрее)
- KeeneticOS 3.5+ (показывается в web UI в разделе «Системный монитор»)
- USB-флешка 4 ГБ+ (Entware занимает ~150 МБ, остальное под логи и кэш opkg)
Архитектуру процессора можно проверить уже после первого SSH через uname -m: aarch64 / armv7l / mipsel / mips.
В web UI Keenetic зайти в Управление → Общие настройки → Изменить набор компонентов и добавить (всё это обязательно):
- «Поддержка открытых пакетов» (раздел «Пакеты OPKG») — открывает менеджер OPKG в web UI.
- «Файловая система Ext4» (раздел «Файловые системы») — Entware ставится только на ext-разделы.
- «Модули ядра подсистемы Netfilter» (раздел «Сетевые функции») — нужно для
iptables. - «Пакет расширения Xtables-addons для Netfilter» — нужно для
TPROXY,xt_set,connmark. - «Доступ через SSH» (раздел «Сетевые функции») — без него
install.shзапустить негде.
Желательно дополнительно:
- «Модули ядра подсистемы Traffic Control» — некоторые netfilter-модули тянут её зависимостью.
Применить, дождаться перепрошивки и автоматического reboot.
Флешку готовим целиком на компьютере: форматируем в EXT4, кладём правильный installer-tarball, и только потом втыкаем в роутер. Web UI Keenetic сам Entware из интернета не качает — он распакует уже подготовленный installer на первом reboot.
1. Узнать архитектуру роутера.
Архитектуру можно посмотреть в web UI Keenetic в Системный монитор → Системная информация (показывает процессор) или ориентироваться по модели:
| Модель / процессор | Папка на bin.entware.net | Имя installer-tarball |
|---|---|---|
| Netcraze Giga, KN ARM64 (Hopper, Peak, Skipper, Hero, Speedster, Ultra KN-1811) | aarch64-k3.10 |
aarch64-installer.tar.gz |
| Старшие ARMv7 | armv7sf-k3.2 |
armv7sf-installer.tar.gz |
| Lite / 4G / Air (LE-MIPS) | mipsel-k3.4 |
mipsel-installer.tar.gz |
| Старые BE-MIPS | mips-k3.4 |
mips-installer.tar.gz |
2. Скачать installer-tarball на PC.
Собрать URL вида https://bin.entware.net/<папка>/installer/<имя>.tar.gz. Для Netcraze Giga это https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz. Сохранить файл к себе на PC.
3. Отформатировать флешку в EXT4.
Windows нативно ext-разделы не создаёт, нужен сторонний инструмент:
- MiniTool Partition Wizard Free — самый дружелюбный к новичкам (выбрать диск → Format → File system: Ext4 → Apply).
- DiskGenius Free — аналог.
- WSL или Linux:
sudo mkfs.ext4 /dev/sdX1.
Файловая система — EXT4, метку (label) задать осмысленную, например OPT.
4. Скопировать installer на флешку.
В корне отформатированной флешки создать каталог install/ и положить туда скачанный <arch>-installer.tar.gz как есть, без распаковки. Структура должна быть такая:
<USB root>/
└── install/
└── aarch64-installer.tar.gz (пример для Netcraze Giga)
Почему именно
install/. Это Keenetic-специфика. Когда ты в web UI сохраняешь настройкиМенеджера пакетов OPKG, демонnpkgвнутри KeeneticOS монтирует флешку и ищет в корне раздела папкуinstall/с архивом<arch>-installer.tar.gz. Если находит — сам распаковывает его в/optи поднимает окружение Entware. В системном логе при этом видно строку видаnpkg: inflating aarch64-installer.tar.gz. Если положить tarball в любую другую папку или сразу распаковать —npkgего не подхватит.
Безопасно извлечь флешку из PC и воткнуть в USB-порт роутера.
В web UI: Приложения → Менеджер пакетов OPKG.
- В поле «Накопитель» выбрать только что вставленную флешку (она показывается с EXT4-меткой и UUID).
- Поле «Сценарий initrc» оставить как есть:
/opt/etc/init.d/rc.unslung. - В таблице «Пользователь» дать галку доступа
admin(и/или отдельно созданномуroot). - Сохранить и перезагрузить роутер.
На первом reboot Keenetic автоматически распакует tarball из install/ в файловую систему /opt на флешке и подготовит окружение Entware.
После reboot подключиться по SSH и проверить:
ssh admin@192.168.1.1
/opt/bin/opkg --versionЕсли opkg отвечает версией — подготовка закончена, можно ставить AntiGoblin.
На некоторых прошивках Keenetic (с включённым SSH-компонентом) порт SSH —
222, а пользователь по умолчанию —rootс паролемkeenetic. Еслиssh admin@192.168.1.1не пускает, попробуйssh root@192.168.1.1 -p 222.
SSH на роутер и выполнить:
wget -O - https://raw.githubusercontent.com/MaksimSamarin/AntiGoblin/main/install.sh | shили, если хочется сначала посмотреть скрипт:
wget -O install.sh https://raw.githubusercontent.com/MaksimSamarin/AntiGoblin/main/install.sh
sh install.shСкрипт:
- проверяет
Entware/OPKGв/opt; - ставит пакеты Entware (
xray,uhttpd_kn,jq,iptables,ipset,conntrack,ca-bundle,wget,tar,gzipи др.); - скачивает
sing-boxmusl-бинарь под архитектуру роутера и кладет в/opt/sbin/sing-box; - скачивает свежий tarball репозитория с GitHub и распаковывает во временный каталог;
- создает UI-видимую политику Keenetic
xkeenкакPolicy42+, если ее еще нет; - раскладывает sample-конфиги
xrayиsing-box(существующие конфиги не трогаются — для перезаписи использоватьANTIGOBLIN_FORCE=1); - кладет UI и backend в
/opt/share/xkeen-manager/; - ставит init-скрипты
S20antigoblin-sysctl,S24antigoblin-singbox,S25antigoblin-selfheal,S26antigoblin; - ставит cron и
ndm/fs.d/ndm/usb.dхуки для авто-восстановления после reboot и USB-событий; - запускает первый цикл
xkeen-selfheal.sh --forceи поднимает UI на:8899.
Скрипт идемпотентный: повторный запуск обновит исходники без затирания пользовательской конфигурации. Чтобы пересеять и sample-конфиги:
ANTIGOBLIN_FORCE=1 sh install.shПосле установки скрипт сам напишет URL для UI. Логин и пароль — от web UI Keenetic.
В UI:
- заполнить
VLESS Reality(адрес сервера, порт, UUID, public key, short ID, SNI); - создать или включить routing-группы. У каждой группы выбрать outbound:
vless-reality— TCP и UDP этой группы идут через VPN;direct— трафик группы входит вxrayи выходит без VPN;bypass— трафик группы обходитxrayполностью (черезRETURN).
- нажать
Сохранить и применить.
В web UI Keenetic в разделе «Приоритеты подключений» — назначить нужные устройства в политику xkeen. Только устройства из этой политики попадают под управление AntiGoblin; остальные политики (например, личная no_vpn) не трогаются.
Для routing-групп удобно набивать не только домены, но и CIDR-диапазоны — особенно для сервисов с UDP/RTC (Discord voice, FaceTime, Zoom), у которых пакеты часто идут на голые IP без TLS-SNI. Полезные источники:
- iplist.opencck.org — open-source агрегатор. По одному эндпоинту отдает актуальные списки IP/CIDR/доменов для Discord, Telegram, ChatGPT, Cloudflare, Twitter, Meta, Google, YouTube, Apple, Spotify и других популярных сервисов. Формат: текст, JSON, CIDR. Удобно копировать прямо в UI-группу. Сам сервис — open-source проект rekryt/iplist под MIT-лицензией; если он вам помог, поставьте звезду и автору.
- bgp.he.net — поиск по AS-номеру или организации, выдает все BGP-префиксы. Полезно, когда нужно найти все CIDR конкретного провайдера/CDN (например, Cloudflare AS13335, Discord AS49544).
- ipinfo.io — лукап одного IP. Покажет ASN, организацию, страну.
- Официальные списки CDN:
- Cloudflare: https://www.cloudflare.com/ips/
- Apple iCloud Private Relay: https://mask-api.icloud.com/egress-ip-ranges.csv
- GitHub: https://api.github.com/meta
- dnscheck.tools — посмотреть, на какие IP резолвится домен у разных DNS-резолверов. Помогает при отладке «работает у меня, не работает на роутере».
Практическое правило: если сервис только TCP (сайт, API) — обычно хватает домена. Если есть UDP/QUIC/RTC/voice — добавляй и CIDR из iplist.opencck.org, иначе routing-rule по домену не успеет сработать (у пакета нет SNI).
- docs/architecture.md — текущая архитектура на Keenetic, Entware, xray и sing-box.
- docs/project-map.md — где лежит код, скрипты, конфиги и документация.
- docs/troubleshooting.md — типовые проблемы и как их решить.
- docs/xkeen-manager-ui.md — как пользоваться UI и как выкатывать проект.
Единственный источник истины для UI:
/opt/share/xkeen-manager/xkeen-ui-state.json
Из него backend генерирует:
/opt/etc/xray/configs/04_outbounds.json/opt/etc/xray/configs/05_routing.json
UI и backend:
/opt/share/xkeen-manager/index.html,app.js,styles.css/opt/share/xkeen-manager/api/routing.cgi/opt/share/xkeen-manager/api/xkeen-selfheal.sh/opt/share/xkeen-manager/api/xkeen-runtime.sh
Bypass собирается только из UI-групп с типом трафика Bypass. Их домены и CIDR попадают в runtime xkeen_bypass и обходят xray через RETURN.
UDP-маршрутизация привязана к outbound группы автоматически: для любой включенной группы с outbound vless-reality ее домены/CIDR попадают в xkeen_udp_route, и совпавший UDP уходит через TPROXY → sing-box (61221) → xray SS-relay (127.0.0.1:62640) → xray VLESS Reality. Группы с outbound direct или bypass UDP не трогают.
Общая сборка runtime живет в xkeen-runtime.sh: и apply из UI, и self-heal используют один и тот же код для iptables/ipset.
Повторный прогон установщика подтянет последнюю версию из main:
wget -O - https://raw.githubusercontent.com/MaksimSamarin/AntiGoblin/main/install.sh | shUI state и существующие xray/sing-box конфиги не пересеваются. Чтобы откатить sample-конфиги к версии из репозитория, добавь ANTIGOBLIN_FORCE=1.
/opt/etc/init.d/S26antigoblin stop
/opt/etc/init.d/S25antigoblin-selfheal stop
/opt/etc/init.d/S24antigoblin-singbox stop
rm -f /opt/etc/init.d/S20antigoblin-sysctl /opt/etc/init.d/S24antigoblin-singbox \
/opt/etc/init.d/S25antigoblin-selfheal /opt/etc/init.d/S26antigoblin
rm -f /opt/etc/cron.1min/50-antigoblin-selfheal
rm -f /opt/etc/ndm/fs.d/50-antigoblin.sh /opt/etc/ndm/usb.d/50-antigoblin.sh
rm -rf /opt/share/xkeen-managerПолитика Keenetic xkeen, конфиги в /opt/etc/xray/configs/ и /opt/etc/sing-box/ не удаляются автоматически.
Если хочется хакать локально и пушить изменения на роутер прямо с Windows:
.env (gitignored)
ROUTER_HOST=192.168.1.1
ROUTER_SSH_USER=root
ROUTER_SSH_PASSWORD=ssh-пароль-роутера
ROUTER_SSH_PORT=22
ANTIGOBLIN_UI_PORT=8899
.\scripts\xkeen\deploy_xkeen_manager_stack_to_router.ps1Эти PowerShell-скрипты используют paramiko (Python) для SSH/SCP и не нужны конечному пользователю — он ставит всё одной командой install.sh через SSH на роутер. Подробнее: docs/xkeen-manager-ui.md.
AntiGoblinимеет право трогать только устройства из политикиxkeen.- Любые другие политики Keenetic (например,
no_vpn) не должны попадать вxray. xkeenсоздается как дополнительная политикаPolicy42+, чтобы она была видна в Keenetic UI.- UI-группы AntiGoblin не являются политиками Keenetic и не меняют назначение устройств.
- Проект должен оставаться generic для любого совместимого Keenetic.
- В репозиторий нельзя класть live-снапшоты роутера, секреты и личные черновики.
- После каждого подтвержденного бага и решения нужно обновлять docs/troubleshooting.md.
- После изменения архитектуры нужно обновлять:
AntiGoblin — это управляющий слой и UI поверх готовых open-source инструментов. Сам проект ничего из этих компонентов не редистрибутирует: пользователь скачивает их сам через opkg и wget с upstream-источников. Юридических обязательств у нас по их лицензиям нет, но все они достойны того, чтобы быть упомянутыми — без них этого проекта не существовало бы.
| Компонент | Роль в AntiGoblin |
Лицензия |
|---|---|---|
| XTLS/Xray-core | TCP transparent proxy на :61219, VLESS Reality outbound к VPN-серверу, локальный Shadowsocks-relay для UDP. |
MPL-2.0 |
| SagerNet/sing-box | TPROXY UDP inbound на :61221 для voice/RTC-трафика, проксирует UDP в локальный xray relay. |
GPL-3.0 |
| Entware | Linux-окружение /opt на роутере: opkg, базовые утилиты, init-инфраструктура. |
GPL-2.0 |
| uhttpd_kn | HTTP-сервер, на котором живёт UI на порту :8899. |
ISC |
| iptables + ipset | Mark-based selective routing для устройств политики xkeen. |
GPL-2.0 |
| conntrack-tools | Точечный сброс conntrack-записей при controlled-restart xray (предотвращает orphan-сокеты). |
GPL-2.0 |
jq, gawk, coreutils-base64, net-tools-netstat |
Парсинг state.json, парсинг ndmc, JSON-API в backend, вспомогательные утилиты. |
разные FOSS-лицензии |
| KeeneticOS | Базовый сетевой стек, политики маршрутизации, UI-видимая политика xkeen. |
проприетарная (предоставляется производителем) |
rekryt/iplist (iplist.opencck.org) |
Не часть стека, но рекомендуется в README как источник готовых IP/CIDR-листов для популярных сервисов. | MIT |
Проект распространяется под лицензией MIT. По ней:
- Использовать, копировать, модифицировать, встраивать в личные и коммерческие продукты — можно свободно.
- При любом использовании (и в личном проекте, и в коммерческом) нужно сохранять текст лицензии и копирайт автора. Это и есть та самая «подпись» — она уже зашита в файл LICENSE, и его достаточно положить рядом с проектом или упомянуть автора в about/credits.
- Никаких гарантий нет: проект делает то, что делает. Ответственность за работу VPN-стека на конкретном роутере несет тот, кто его поставил.
Если проект пригодился — поставь, пожалуйста, ⭐ репозиторию MaksimSamarin/AntiGoblin. Это единственная просьба сверх лицензии: помогает понять, что проект кому-то нужен, и мотивирует развивать его дальше.
Если используешь в коммерческой услуге (продаёшь как часть провайдер-сервиса, ставишь клиентам за деньги, и т.п.) — кратко упомяни origin: «based on AntiGoblin by MaksimSamarin» в любом подходящем месте (about, документация, чек, договор — на твой выбор).
