HydraRoute Neo — демон для раздельной маршрутизации трафика по доменам и CIDR на роутерах Keenetic.
Перехватывает DNS-ответы, добавляет полученные IP в ipset и маркирует трафик для перенаправления через нужный туннель или интерфейс. Дополнительно — параллельный L7-канал: TLS SNI, HTTP Host и QUIC Initial SNI (закрывает слепые зоны DoH/DoT, hardcoded-IP, легаси-HTTP, QUIC; совместим с zapret2/nfqws2). Написан на C, единый статически скомпилированный бинарь без внешних зависимостей кроме libc и Linux API.
.datip rule/ip route при событиях интерфейсов/var/run/hrneo.sock, hrneo --match / --dumpXtables-addons для NetfilterПоддерживаются все модели Keenetic на архитектурах mipsel / mips / aarch64, включая бюджетные SoC без аппаратного FPU.
Выполните команду в терминале роутера:
opkg update && opkg install curl && curl -Ls "https://git.zerrolabs.org/Ground-Zerro/release/pages/keenetic/install-neo.sh" | sh
Веб-интерфейс (HRweb) также будет установлен и доступен по ссылке
http://<IP роутера>:2000
Службы запустятся автоматически
curl -Ls "https://git.zerrolabs.org/Ground-Zerro/release/pages/keenetic/install-feed.sh" | sh
opkg install hrneo
Обновление:
opkg update && opkg upgrade
Файлы
hrneo.conf,domain.confиip.listсохраняются при обновлении (conffiles)
| Файл | Назначение |
|---|---|
/opt/etc/HydraRoute/hrneo.conf |
Основная конфигурация демона |
/opt/etc/HydraRoute/domain.conf |
Список доменов и политик/интерфейсов |
/opt/etc/HydraRoute/ip.list |
Статические CIDR-диапазоны |
Всего 29 параметров конфигурации, сгруппированных по назначению:
autoStart, watchlistPath, clearIPSetCIDR, CIDRfileIpsetEnableTimeout, IpsetTimeout, IpsetMaxElemlog, logfileDirectRouteEnabled, InterfaceFwMarkStart, InterfaceTableStartConntrackFlushGlobalRouting, PolicyOrderGeoIPFile, GeoSiteFile (оба повторяемые)rciToken — токен доступа Keenetic для прошивок, где локальный RCI требует авторизации; заполнять вручную не нужно — hrneo выпускает и обновляет токен самl7CaptureEnabled, l7NflogGroup, l7EnableTLS, l7EnableHTTP, l7EnableQUIC, l7WanInterface, l7ConnbytesMax, l7TcpReasmEnabled, l7TcpReasmMaxEntries, l7TcpReasmTtlSecПолное описание каждого параметра, дефолтов, поведения и взаимодействия с роутером (RCI, PolicyOrder, ConntrackFlush и т.д.) — см. docs/HRNEO.CONF.md.
Любой параметр доступен и как CLI-флаг (--имя value); приоритет: CLI > конфиг-файл > встроенные дефолты. Дефолтный hrneo.conf со всеми ключами генерируется командой hrneo --genconfig /opt/etc/HydraRoute/.
Формат строки:
домен1,домен2,geosite:tag/ПолитикаИлиИнтерфейс
.youtube.com не совпадёт ни с одним именемgeosite:TAG — загрузить домены из GeoSite .dat файла для указанного тега; работает при заданном GeoSiteFile, иначе директива пропускается с [WARN]/ — если совпадает с именем системного интерфейса: DirectRoute, иначе: политика Keenetic# или ## — комментарииПримеры:
## Через политику Keenetic
youtube.com,googlevideo.com/HydraRoute
## Через конкретный интерфейс
openai.com,chatgpt.com/nwg0
## GeoSite категория
geosite:google/HydraRoute
## GeoSite + обычные домены в одной строке
geosite:google,youtube.com,youtu.be/HydraRoute
## Несколько GeoSite категорий
geosite:google,geosite:netflix/HydraRoute
GeoSite-домены поддерживают типы Domain и Full (оба — домен + все поддомены)
Типы Plain (keyword) и Regex не поддерживаются
Записи изdomain.confимеют приоритет над GeoSite
Формат:
##Описание блока
/ПолитикаИлиИнтерфейс
10.0.0.0/8
192.168.1.1/32
2606:4700::/32
##Отключённый блок
#/ПолитикаИлиИнтерфейс
45.67.123.0/24
##GeoIP директива
/HydraRoute
geoip:ru
/ПолитикаИлиИнтерфейс — активный блок#/ПолитикаИлиИнтерфейс — отключённый блок (содержимое игнорируется)## — комментарийgeoip:ru — загрузить CIDR для страны из GeoIP-файлов (например geoip:ru, geoip:us); работает при заданном GeoIPFile, иначе директива пропускается с [WARN]/32 и /128 добавляются как хосты, остальное — как подсетиIpsetEnableTimeoutНесколько блоков одной политики, один из них отключён:
##Google CDN
/HydraRoute
10.203.14.12/28
##YouTube (временно отключено)
#/HydraRoute
172.22.48.77/26
Если
geoip:TAGсодержит записей большеIpsetMaxElem − 5000, тег автоматически переносится в раздел#/Too-big-geoip-tag
Один и тот же адрес часто принадлежит нескольким целям сразу — например, домен из domain.conf направлен на интерфейс провайдера, а его IP попадает в широкий CIDR-блок или geoip:-тег другой цели:
domain.conf: keenetic.com/eth3
ip.list: /nwg1
88.198.0.0/16
Здесь адрес keenetic.com попадает и в 88.198.0.0/16.
Кто выиграет — задаёт PolicyOrder. Политики Keenetic и DirectRoute-интерфейсы в нём равноправны, перечисляются вперемешку и разбираются автоматически:
PolicyOrder=eth3,nwg1
Цель, стоящая раньше, выигрывает — и при коллизии IP, и при коллизии домена (когда домен и его поддомен розданы разным целям или CNAME-цепочка уходит в другую цель). Цели, не перечисленные в PolicyOrder, идут после перечисленных в алфавитном порядке.
Что PolicyOrder не перекрывает. Если устройство привязано к политике в самих настройках роутера, KeeneticOS маркирует его трафик раньше hrneo, и hrneo такому устройству уступает. Это поведение по умолчанию (GlobalRouting=false); с GlobalRouting=true трафик такого устройства к адресам целей hrneo идёт через цель, а остальной — по его политике роутера; DNS остаётся на DNS-прокси политики (DNS-профиль и интернет-фильтр работают), аппаратное ускорение сохраняется.
Момент маркировки. Цель фиксируется на соединении один раз, при первом пакете (у привязанных к политике роутера устройств при GlobalRouting=true решение пересматривается на каждом пакете). Соединение, установленное до попадания адреса в нужный набор, останется на прежнем маршруте до своего завершения. Если оно шло мимо всех целей, ConntrackFlush=true сбрасывает его при первом добавлении адреса, и приложение переподключается уже через цель.
Подробности — docs/HRNEO.CONF.md.
Параллельный DNS-каналу источник имён хостов. По умолчанию выключен (l7CaptureEnabled=false); включается l7CaptureEnabled=true. Закрывает слепые зоны DNS-only схемы:
L7 видит имя хоста уже после установления соединения (выпущенного через WAN до попадания IP в ipset). При первом добавлении IP и ConntrackFlush=true (по умолчанию) Neo точечно удаляет conntrack-запись триггернувшего соединения по 5-tuple — браузер/приложение переустанавливает соединение, которое с самого начала идёт по нужной политике.
Известные ограничения:
Полный технический разбор — в docs/HRNEO.CONF.md и docs/CORE.md.
neo restart; если роутер в этот момент не отвечает, создание повторяется на следующих обновлениях правил без перезапускаdomain.conf она есть — пересоздаётся при следующем запуске Neo (neo restart)domain.conf, активных блоков ip.list и geosite:-директив; цель, у которой все строки выключены (#), не создаётсяneo stop) трафик идёт напрямую без туннелейПриоритет маршрутизации задаётся в интерфейсе Keenetic: Приоритеты подключений → Политики доступа
В одной политике можно указать несколько VPN-подключений для многопутевой маршрутизации
Отдельный компонент для визуального управления HydraRoute Neo без работы в терминале.
Установка:
opkg install hrweb
После запуска интерфейс доступен по адресу:
http://<IP роутера>:2000
Авторизация — через логин и пароль роутера Keenetic
Боковое меню — пять разделов: Правила, Сеть, Hydra, Инфо, Настройки. В шапке — графики загрузки ЦП/ОЗУ роутера, журнал уведомлений и переключатель темы; внизу — версия ОС и модель роутера, версии hrneo/hrweb (нажатие проверяет обновления).
Правила — маршрутизация:
PolicyOrder), приоритеты подключений внутри политикиСеть — подключения и инструменты (четыре вкладки):
phobos://); сторонние интерфейсы роутера; пинг и проверки доступности (HTTP 204)hrdns (ставится при включении): общий DNS, отдельные DNS для правил маршрутизации и для групп доменов, кэш, bootstrap, ECS; база DNS-серверов с проверкой; блокировка рекламы — готовые списки и списки по ссылке с автообновлением, свои правила, проверка домена, пауза; статистика и журнал запросовHydra — управление демоном:
hrneo.conf (основные, маршрутизация, IPSet и conntrack, логирование, L7-перехват) через формы с подсказками; в файл записываются только изменённые значенияИнфо — справка:
Настройки — глобальные настройки:
Также доступны сторонние решения:
neo start # Запуск HydraRoute Neo
neo stop # Остановка и очистка iptables/ip rule + NFLOG-правила L7
neo restart # Перезапуск с пересозданием политик
neo status # Проверка состояния службы
CLI hrneo (все параметры конфига доступны как --flag value):
hrneo --version # вывести версию
hrneo --help # справка по флагам
hrneo --genconfig [path] # сгенерировать дефолтный hrneo.conf
hrneo --config <path> # указать альтернативный путь к hrneo.conf
hrneo --keenetic <token> # записать токен доступа Keenetic (rciToken) в конфиг
hrneo --match <имя> # к какой цели работающий демон отнесёт имя
hrneo --dump # весь watchlist работающего демона
Работающий демон публикует watchlist через сокет /var/run/hrneo.sock для DNS-демонов и других программ — протокол в docs/WATCHLIST_API.md.
Приоритет источников значений: CLI флаги > конфиг-файл > встроенные дефолты.
Полное: включая логи, конфиги, зависимые пакеты, откат всех изменений системы (рекомендуется):
curl -Ls "https://git.zerrolabs.org/Ground-Zerro/release/pages/keenetic/hr-uninstall.sh" | sh
Будут удалены:
- пакеты:
hrneo,hrweb,smartdns-webui,ipset,iptables,jq,hydraroute,adguardhome-go,node,node-npm,xray,xray-core- папки:
/opt/etc/HydraRoute,/opt/etc/AdGuardHome,/opt/etc/xray/,/opt/etc/Phobos,/opt/etc/smartdns-webui,/opt/var/lib/hrdns,/opt/var/lib/smartdns-webui
Стандартное:
opkg remove hrneo
Релизные бинарники HRNeo иногда помечаются эвристикой антивирусов (на VirusTotal и т.п.) как угроза. Это ложные срабатывания: HRNeo — статически слинкованный stripped-ELF для MIPS/ARM, и по форме файла и набору системных вызовов (AF_PACKET, netlink, iptables/conntrack, init_module) технически неотличим от роутерного ПО, под которое заточены универсальные сигнатуры. В бинарниках нет C2, скрытой нагрузки, самораспространения, обфускации или упаковки.
Чтобы можно было убедиться в подлинности файлов, каждый GitHub Release:
SHA256SUMS с фиксированными SHA-256 всех бинарников и .ipk-пакетов;SHA256SUMS) сопровождается откреплённой GPG-подписью *.asc;Neo/RELEASE_SIGNING_KEY.asc в репозитории.Проверка на ПК с установленным gpg (из каталога со скачанными файлами релиза):
gpg --import Neo/RELEASE_SIGNING_KEY.asc
gpg --verify SHA256SUMS.asc SHA256SUMS # подпись верна → "Good signature"
sha256sum -c SHA256SUMS # хеши файлов совпадают
Хеши фиксируются на релиз и не меняются — это снижает вес «редкий/новый образец» в эвристике и позволяет вендорам белым списком убрать конкретные детекты.
Начиная с KeeneticOS 5.0 в роутере есть штатная DNS-маршрутизация (DNS-Based
Routes): списки доменов object-group fqdn направляются через выбранное
подключение. Механизм тот же — ipset плюс маркировка в mangle, — но
возможности и лимиты отличаются существенно:
| HydraRoute Neo | Keenetic DNS-маршрутизация | |
|---|---|---|
| Доменов в списке | ограничено RAM (сотни тысяч) | 300 на группу, до 256 групп |
| Клиенты с DoH/DoT/QUIC, hardcoded-IP | ловятся L7-каналом | не обрабатываются |
| GeoIP/GeoSite категории | да | нет |
| Точность матчинга | по границе метки домена | суффиксная подстрока: x.com захватывает yandex.com |
| Резерв при падении туннеля | приоритет permit global политики либо blackhole |
резерв не задаётся, трафик утекает в основной WAN |
| Охват политик доступа | один флаг GlobalRouting на все политики |
правило заводится в каждой политике вручную |
Полное сравнение с замерами на живом роутере (лимиты, механика, задержки попадания IP в ipset, поведение при обрыве интерфейса) — docs/COMPARE_KEENETIC_DNS.md.
HydraRoute Neo распространяется на условиях GNU Affero General Public License v3.0 (AGPL-3.0-only) — см. LICENSE.
Программа предоставляется «как есть», без каких-либо гарантий. Автор не несёт ответственности за последствия использования.
Поддержать проект: Boosty