Ground-Zerro / HydraRoute Public
Code Issues Pull requests Actions Releases View on GitHub ↗
Mirror — read-only view
docs
source
LICENSE 33.7 KB
README.md 28.9 KB
README.md

HydraRoute Neo

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.


Оглавление


Возможности

  • Не требует отключения системного DNS-сервера роутера
  • Не встраивается в цепочку DNS, не использует сторонних компонентов
  • Совместим с любой конфигурацией DNS на роутере: системный резолвер, DNS-маршрутизация Keenetic, AdGuard Home
  • Маршрутизация через политики доступа Keenetic
  • Прямая маршрутизация трафика на сетевые интерфейсы (DirectRoute)
  • Поддержка статических CIDR-диапазонов с IPv4 и IPv6
  • Работа с базами GeoIP и GeoSite в формате v2ray/xray .dat
  • Перехват DNS-ответов LAN- и VPN-клиентов роутера (Ethernet, PPP, WireGuard, VPN-сервер, IPsec, туннели)
  • Параллельный L7-канал (опц.): TLS SNI, HTTP Host и QUIC Initial SNI через NFLOG с реассамблецией длинных постквантовых ClientHello (Kyber/MLKEM) — TCP-сегменты и многодатаграммный QUIC Initial (CRYPTO-фрагменты) поверх общего пула
  • Корректная маршрутизация без переподключения (опц. ConntrackFlush)
  • Устойчивость к перезаписи netfilter прошивкой: KeeneticOS переписывает таблицы целиком и в произвольный момент, Neo отслеживает это через штатные хуки роутера и восстанавливает свои правила автоматически, включая ip rule/ip route при событиях интерфейсов
  • Публикация watchlist для сторонних программ (например, DNS-демона): сокет /var/run/hrneo.sock, hrneo --match / --dump
  • Управление через веб-интерфейс

Системные требования

  • Роутер Keenetic с прошивкой выше v4.3.6
  • Установленная Entware
  • Добавлен системный компонент Keenetic Xtables-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
Службы запустятся автоматически

Установка вручную
  1. Добавьте репозиторий:
curl -Ls "https://git.zerrolabs.org/Ground-Zerro/release/pages/keenetic/install-feed.sh" | sh
  1. Установите Neo:
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-диапазоны

Параметры hrneo.conf

Всего 29 параметров конфигурации, сгруппированных по назначению:

  • Основные: autoStart, watchlistPath, clearIPSet
  • CIDR: CIDR, CIDRfile
  • IPSet: IpsetEnableTimeout, IpsetTimeout, IpsetMaxElem
  • Логирование: log, logfile
  • DirectRoute: DirectRouteEnabled, InterfaceFwMarkStart, InterfaceTableStart
  • Conntrack: ConntrackFlush
  • Маршрутизация: GlobalRouting, PolicyOrder
  • GeoIP / GeoSite: GeoIPFile, GeoSiteFile (оба повторяемые)
  • RCI: rciToken — токен доступа Keenetic для прошивок, где локальный RCI требует авторизации; заполнять вручную не нужно — hrneo выпускает и обновляет токен сам
  • L7-перехват: 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/.


Работа с доменами (domain.conf)

Формат строки:

домен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


Работа с CIDR (ip.list)

Формат:

##Описание блока
/ПолитикаИлиИнтерфейс
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 добавляются как хосты, остальное — как подсети
  • CIDR-записи добавляются как постоянные (без таймаута), даже при включённом IpsetEnableTimeout
  • Длина строки не ограничена

Несколько блоков одной политики, один из них отключён:

##Google CDN
/HydraRoute
10.203.14.12/28

##YouTube (временно отключено)
#/HydraRoute
172.22.48.77/26

Если geoip:TAG содержит записей больше IpsetMaxElem − 5000, тег автоматически переносится в раздел #/Too-big-geoip-tag


Коллизии целей и PolicyOrder

Один и тот же адрес часто принадлежит нескольким целям сразу — например, домен из 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.


L7-перехват (TLS SNI / HTTP Host / QUIC)

Параллельный DNS-каналу источник имён хостов. По умолчанию выключен (l7CaptureEnabled=false); включается l7CaptureEnabled=true. Закрывает слепые зоны DNS-only схемы:

  • клиенты с DoH/DoT/DoQ (DNS зашифрован)
  • hardcoded-IP с TLS SNI (без DNS-резолва)
  • легаси-HTTP
  • тёплый DNS-кэш устройства (TTL ещё не истёк)
  • quic / http-3 (UDP/443)

L7 видит имя хоста уже после установления соединения (выпущенного через WAN до попадания IP в ipset). При первом добавлении IP и ConntrackFlush=true (по умолчанию) Neo точечно удаляет conntrack-запись триггернувшего соединения по 5-tuple — браузер/приложение переустанавливает соединение, которое с самого начала идёт по нужной политике.

Известные ограничения:

  • ECH (Encrypted ClientHello) — нерешаемо без MITM
  • iCloud Private Relay — by design зашифрованный туннель

Полный технический разбор — в docs/HRNEO.CONF.md и docs/CORE.md.


Политики доступа

  • Создаются автоматически при запуске Neo или по neo restart; если роутер в этот момент не отвечает, создание повторяется на следующих обновлениях правил без перезапуска
  • Если политика удалена, но в domain.conf она есть — пересоздаётся при следующем запуске Neo (neo restart)
  • Политика создаётся для целей из активных строк domain.conf, активных блоков ip.list и geosite:-директив; цель, у которой все строки выключены (#), не создаётся
  • При остановке Neo (neo stop) трафик идёт напрямую без туннелей

Приоритет маршрутизации задаётся в интерфейсе Keenetic: Приоритеты подключений → Политики доступа
В одной политике можно указать несколько VPN-подключений для многопутевой маршрутизации


Веб-интерфейс (HRweb)

Отдельный компонент для визуального управления HydraRoute Neo без работы в терминале.

Установка:

opkg install hrweb

После запуска интерфейс доступен по адресу: http://<IP роутера>:2000
Авторизация — через логин и пароль роутера Keenetic

Возможности HRweb

Боковое меню — пять разделов: Правила, Сеть, Hydra, Инфо, Настройки. В шапке — графики загрузки ЦП/ОЗУ роутера, журнал уведомлений и переключатель темы; внизу — версия ОС и модель роутера, версии hrneo/hrweb (нажатие проверяет обновления).

Правила — маршрутизация:

  • Правила для политик Keenetic и DirectRoute-интерфейсов: создание, удаление, переименование, порядок целей (PolicyOrder), приоритеты подключений внутри политики
  • Домены и CIDR правила в одном поле, разбитые на группы с описанием; источники: каталог сервисов, теги GeoIP/GeoSite, категории Geo-Aggregator и сторонние geo-файлы, загрузка по ссылке
  • Валидация записей, поиск пересечений и дублей между правилами, очистка списка от мусора и агрегация записей
  • Экспорт и импорт: CSV-файл и объект-группы FQDN роутера
  • Изменения копятся в черновике и применяются кнопкой «Сохранить», «Отменить» откатывает их

Сеть — подключения и инструменты (четыре вкладки):

  • Подключения — установка и управление xRay; интерфейсы из share-ссылок и подписок (VLESS, VMess, Trojan, Shadowsocks, Hysteria2, SOCKS5, HTTP) в режиме OpkgTun или SOCKS5 (компонент «Клиент прокси»); балансировщики (наименьший пинг, наименьшая нагрузка, случайный, по кругу); выбор серверов, исключения и автообновление подписок; mux, шумовой трафик, фрагментация TLS, случайный TLS-отпечаток; PhobosWG/PhobosS5 (phobos://); сторонние интерфейсы роутера; пинг и проверки доступности (HTTP 204)
  • DNS — DNS-серверы роутера (Do53/DoT/DoH, из готового списка или вручную) и DNS провайдера; Служба DNS — собственный резолвер hrdns (ставится при включении): общий DNS, отдельные DNS для правил маршрутизации и для групп доменов, кэш, bootstrap, ECS; база DNS-серверов с проверкой; блокировка рекламы — готовые списки и списки по ссылке с автообновлением, свои правила, проверка домена, пауза; статистика и журнал запросов
  • Монитор — фоновая проверка доступности подключений в политиках Keenetic с автоматическим переключением на резервное и возвратом после восстановления; интервал, таймаут и пороги настраиваются, журнал событий
  • Терминал — веб-терминал и файловый браузер (загрузка перетаскиванием, скачивание, переименование, удаление)

Hydra — управление демоном:

  • Запуск/остановка службы hrneo
  • GeoIP/GeoSite: загрузка файлов, индексация тегов, автообновление по расписанию, сброс
  • DANGER ZONE — параметры hrneo.conf (основные, маршрутизация, IPSet и conntrack, логирование, L7-перехват) через формы с подсказками; в файл записываются только изменённые значения
  • Диагностика — пошаговая проверка маршрутизации домена или IP-адреса со стороны роутера

Инфо — справка:

  • Полезные ссылки (портал «УтЪ», Domain Inspector, HydraRoute Manager, Keenetic SSH, Flashkeen)
  • Рекомендуемые хостинги, благодарности, отказ от ответственности

Настройки — глобальные настройки:

  • Виджет производительности, отключение проверки DNS устройства
  • Узел проверки доступности (авто, готовый узел или свой URL), интервал опроса серверов балансировщиков
  • HTTP-заголовки для загрузки подписок
  • Источник Geo-файлов и репозитория пакетов: GitHub или RU Zerrolabs
  • Токен доступа Keenetic (RCI) — для прошивок, требующих токен

Также доступны сторонние решения:


Управление

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                  # хеши файлов совпадают

Хеши фиксируются на релиз и не меняются — это снижает вес «редкий/новый образец» в эвристике и позволяет вендорам белым списком убрать конкретные детекты.


Отличия от DNS-маршрутизации Keenetic

Начиная с 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