0xkee Posted April 15 Posted April 15 (edited) Всем привет! Это проект для раздельной geo-маршрутизации трафика на Keenetic-роутерах с Entware. Проект состоит из нескольких opkg-пакетов. По сути это набор shell (sh)-скриптов, которые автоматизируют типовые задачи — всё это можно сделать вручную, но тогда потребуется постоянное сопровождение при изменении конфигурации сети. Информация для администраторов — в README.md пакетов. Руководство пользователя — в docs/user-manual.ru.md пакетов. Changelog — в CHANGELOG.md пакетов. Список поддерживаемых интерфейсов Spoiler Keenetic Network Interfaces Reference Developer reference for network interface prefixes on Keenetic routers (KeeneticOS 5.0+). Used in api-router.lua blacklist and lib/ip.sh tunnel detection. Interface Table Prefix Description Type Show in UI Example br0, br1 LAN / Guest bridge user ✅ br0 (Home) eth[0-9] Physical Ethernet (IPoE WAN) user ⚠️ label eth3 → ISP ppp[0-9], pppoe[0-9] PPPoE WAN user ✅ ppp0 lte_br* 3G/4G USB modem user ✅ lte_br0 nwg* WireGuard (NDM-managed) tunnel ✅ nwg0 awg* AmneziaWG tunnel ✅ awg0 wg* WireGuard (manual) tunnel ✅ wg0 ovpn* OpenVPN tunnel ✅ ovpn0 l2tp* L2TP VPN tunnel ✅ l2tp0 pptp* PPTP VPN tunnel ✅ pptp0 sstp* SSTP VPN tunnel ✅ sstp0 ipsec* IPsec tunnel tunnel ✅ ipsec0 tun[0-9]* Generic TUN device tunnel ✅ tun0 tap* Generic TAP device tunnel ✅ tap0 wwan* WiFi client (WISP) user ⚠️ label wwan0 usb* USB tethering user ⚠️ label usb0 lo Loopback infra ❌ lo ra[0-9] 2.4 GHz WiFi radio (MediaTek) infra ❌ ra0 rai[0-9] 5 GHz WiFi radio (MediaTek) infra ❌ rai0 rax[0-9] 6 GHz WiFi radio (WiFi 6E) infra ❌ rax0 apcli* WiFi client bridge radio infra ❌ apcli0 xfrm*, xfrms* IPsec xfrm state interfaces infra ❌ xfrms1 tunl* IPv4 tunnel device infra ❌ tunl0 ip6tnl* IPv6 tunnel device infra ❌ ip6tnl0 sit* IPv6-in-IPv4 (SIT) infra ❌ sit0 gre* GRE tunnel infra ❌ gre0 vti* VPN tunnel interface infra ❌ vti0 ethoip* EtherIP infra ❌ ethoip0 dummy* Dummy device infra ❌ dummy0 ezcfg* EZConfig infra ❌ ezcfg0 ifb* IFB (traffic shaping) infra ❌ ifb0 *.N VLAN sub-interface infra ❌ eth2.1 Legend: Type: user = user-facing WAN/LAN, tunnel = VPN/tunnel, infra = kernel/radio infrastructure Show in UI: ✅ = always shown, ⚠️ label = shown only if NDM assigned a label, ❌ = blacklisted Usage in Project Component File Purpose Interface blacklist webui/lua/api-router.lua → system_interfaces() Excludes infra interfaces from API Tunnel detection lib/ip.sh → is_tunnel_iface() Classifies dev as tunnel for route-check / wan-paths UI tunnel check webui/static/shared.js → EW.isTunnelIface() Client-side tunnel classification for route diagram Config dropdowns webui/static/config-editor.js iface_select type populates from API Пока пакеты выкладываются здесь, позже планирую перенести на GitHub. Пакет keenetic-entware-extras содержит общие библиотеки и обязателен для установки. Описание, установка, настройка, удаление: * немного устарело, загляните в README.md/docs/user-manual.ru.md Spoiler # geo-split — split routing для Keenetic (GeoIP + домены) [.ipk пакеты] Всем привет! Делюсь проектом для раздельной маршрутизации трафика на Keenetic-роутерах с Entware. ## Что это **geo-split** — автоматическое разделение трафика по GeoIP-подсетям и спискам доменов для Keenetic + Entware. **Типичные сценарии:** - **Multi-WAN / LTE-failover** — направить определённый трафик (например, RU-подсети) через конкретный WAN-канал (LTE, второй провайдер), а остальной — через основной - **VPN split** — весь трафик идёт через VPN (WireGuard/OpenVPN/etc), а RU-трафик — напрямую через провайдера, чтобы российские сервисы (Яндекс, VK, госуслуги, банки) работали без потери скорости - **Обратный VPN split** — всё через ISP, а выбранные домены — через VPN ### Что умеет - 🌍 **GeoIP-маршрутизация** — загружает страновые подсети и направляет трафик к ним через нужный интерфейс - 🔗 **Маршрутизация по доменам** — можно добавить свои домены в список, их IP будут маршрутизироваться отдельно - 🔄 **Автоматический failover** — при падении/подъёме VPN или смене WAN маршруты пересоздаются автоматически (NDM-хук) - ⏱ **Автообновление** — подсети и домены обновляются по cron без вмешательства - 📦 **CIDR-агрегация** — сжатие подсетей (~13K → ~8.5K маршрутов), меньше нагрузка на роутер - ✅ **Совместимость с Keenetic NDM** — не использует iptables/fwmark, не ломает per-device routing и HW NAT - 📥 **.ipk пакеты** — установка, обновление и удаление через стандартный `opkg` --- ## Требования - **KeeneticOS ≥ 5.0** (прошивки серии 5.x). Старые прошивки (2.x / 3.x) **не поддерживаются**. - Keenetic с установленным **Entware** - Настроенное **второе подключение**: VPN-туннель (WireGuard, OpenVPN, L2TP, PPTP, SSTP) или дополнительный WAN (LTE, второй ISP) - Зависимости (`ip-full`, `curl`, `bind-dig`, `aggregate`) ставятся **автоматически** через opkg --- ## Установка ### 1. Скопировать .ipk на роутер ```sh scp *.ipk root@<router-ip>:/tmp/ ``` ### 2. Установить пакеты (порядок важен!) ```sh opkg install /tmp/keenetic-entware-extras_0.9.5_all.ipk opkg install /tmp/geo-split-data_0.4.0_all.ipk opkg install /tmp/geo-split_0.10.7_all.ipk ``` > ℹ️ Зависимости установятся автоматически из репозитория Entware. Убедитесь, что роутер имеет доступ к интернету. ### 3. Настроить ```sh vi /opt/keenetic-entware-extras/geo-split/config/config.conf ``` Минимально — установить `ROUTE_OUT`: | Значение | Что делает | |----------|-----------| | `"auto"` | Автоопределение ISP-интерфейса из default route. **Подходит большинству.** | | `"nwg0"` | Через WireGuard VPN | | `"ovpn0"` | Через OpenVPN | | `"lte_br1"` | Через LTE-модем | ### 4. Запустить ```sh /opt/etc/init.d/S99geo-split start ``` При первом запуске скрипт загрузит GeoIP-подсети, отрезолвит домены, заполнит маршрутные таблицы и подключит LAN. ### 5. Проверить ```sh /opt/etc/init.d/S99geo-split status ``` --- ## Конфигурация Конфиг: `/opt/keenetic-entware-extras/geo-split/config/config.conf` ### Основные параметры | Параметр | По умолчанию | Описание | |----------|-------------|----------| | `ROUTE_OUT` | `"auto"` | Куда направлять GEO-трафик. `"auto"` = ISP. Или явно: `"nwg0"`, `"lte_br1"` | | `ROUTE_IN` | `"br0"` | Откуда берётся трафик. `br0` = Home LAN, `br1` = Guest. Можно несколько через пробел | | `DOMAINS_LIST_FILE` | `domains.txt` | Список доменов. Поддерживает `@include` для подключения файлов | | `SUBNET_URL` | ipdeny.com/ru | URL для загрузки GeoIP-подсетей. Можно сменить на другую страну | | `SUBNET_AGGREGATE` | `1` | Агрегировать CIDR (рекомендуется) | | `MAX_CACHE_AGE` | 7 дней | Максимальный возраст кэша подсетей | | `DOMAINS_UPDATE_INTERVAL` | 1 час | Интервал обновления DNS-кэша доменов | > 💾 Конфиг объявлен как `conffile` — при `opkg upgrade` ваши настройки **не перезапишутся**. ### Список доменов Домены задаются в `/opt/keenetic-entware-extras/geo-split-data/lists/domains.txt`: ``` # По умолчанию подключён курированный белый список RU-сервисов: @ru-whitelist.txt # Добавьте свои домены: example.com my-service.ru ``` `domains.txt` тоже conffile — ваши дополнения сохраняются при обновлении. --- ## Примеры конфигурации ### RU → ISP (автоопределение) Весь трафик через VPN, RU-подсети и домены — через провайдера. Самый распространённый вариант. ```sh ROUTE_OUT="auto" ROUTE_IN="br0" ``` ### Выбранные домены → VPN Весь трафик через ISP, а определённые домены — через WireGuard. ```sh ROUTE_OUT="nwg0" ROUTE_IN="br0" ``` Добавьте нужные домены в `domains.txt`. ### Multi-WAN (LTE как ISP) ISP подключён через USB-модем: ```sh ROUTE_OUT="lte_br1" ROUTE_IN="br0" ``` --- ## Пример вывода status ``` geo-split status: Mode: Route in: br0 Route out: auto (detect ISP) Active out: eth3 (tables 1000,1001) IP rules: iif br0 → table 1000 (domains) ✓ iif br0 → table 1001 (subnets) ✓ Routes: Domains: 179 routes in table 1000 ✓ Subnets: 8588 routes in table 1001 ✓ Caches: Subnets: cache 2d 5h old (max 7d 0h) ✓ Domains: 179 in cache, 45m old (max 1h 0m) ✓ Domain sources: 163 domain(s) configured System: Uptime: 2d 5h ✓ Cron: 1 job(s) ✓ NDM hook: /opt/etc/ndm/ifstatechanged.d/geo-split-hook ✓ DL iface: default (cached) DNS: localhost:6153 (SmartDNS) Background: idle Loader: cidr-plain Version: 0.8.0 ``` Все `✓` — система работает штатно. При проблемах строка покажет `✗`. --- ## Доступные команды | Команда | Описание | |---------|----------| | `start` | Полный запуск (загрузка данных + подключение LAN) | | `stop` | Остановка (удаление правил маршрутизации) | | `restart` | Перезапуск | | `status` | Диагностика — показывает состояние всех компонентов | | `refresh` | Обновить данные если устарели (вызывается из cron) | | `update` | Принудительное обновление всех данных | | `update-subnets` | Принудительно обновить подсети | | `update-domains` | Принудительно обновить домены | Все команды вызываются через `/opt/etc/init.d/S99geo-split <команда>`. --- ## Обновление ```sh scp geo-split_<new_version>_all.ipk root@<router-ip>:/tmp/ opkg install --force-reinstall /tmp/geo-split_<new_version>_all.ipk /opt/etc/init.d/S99geo-split start ``` Конфиг и списки доменов **сохраняются** при обновлении. --- ## Удаление ```sh /opt/etc/init.d/S99geo-split stop opkg remove geo-split opkg remove geo-split-data opkg remove keenetic-entware-extras ``` Пакеты удаляют свои файлы, ip rules, cron-задачи и NDM-хуки автоматически. --- ## Скачать | Пакет | Версия | Описание | Ссылка | |-------|--------|----------|--------| | `keenetic-entware-extras` | 0.9.5 | Базовые библиотеки (обязателен) | ⬇️ [TODO] | | `geo-split-data` | 0.4.0 | GeoIP-данные и списки доменов | ⬇️ [TODO] | | `geo-split` | 0.10.7 | Гео-маршрутизация — основной пакет | ⬇️ [TODO] | | `smartdns-conf-ru-split` | 0.4.3 | DNS split — раздельный DNS по зонам (RU → Yandex/AdGuard, остальное → Google/Cloudflare DoH) | ⬇️ [TODO] | | `smartdns-redirect` | 0.2.3 | DNAT-перенаправление DNS на SmartDNS (iptables) | ⬇️ [TODO] | | `webui` | 0.9.0 | Веб-панель мониторинга + карточка в stock UI (**требует KeeneticOS 5.x**) | ⬇️ [TODO] | > Все пакеты `Architecture: all` — подходят для любой архитектуры Keenetic (mipsel, aarch64). --- ## Известные ограничения - **KeeneticOS ≥ 5.0** — прошивки 2.x / 3.x не поддерживаются (другая платформа NDMS2) - **Только IPv4** — IPv6-трафик проходит по стандартным маршрутам - **Требует Entware** — на стоковой прошивке без Entware не работает - **Домены обновляются по cron** (по умолчанию раз в час), а не мгновенно при DNS-запросе - **Другой механизм, чем fwmark-решения** — geo-split работает через `ip rule`/`ip route` (route-based), а не через iptables/fwmark. С fwmark-решениями (keen-pbr и т.д.) не пересекается и мирно сосуществует, но это разные подходы — маршруты суммироваться не будут --- ## Лицензия MIT — свободное использование, модификация и распространение с указанием авторства. --- ## Обратная связь Приветствуются: - 🐛 Баг-репорты - 💡 Предложения по фичам - ❓ Вопросы по настройке **При проблемах:** 1. Опишите проблему словами — что делали, что ожидали, что получили (чем подробнее, тем лучше) 2. Запустите скрипт диагностики и приложите вывод (под спойлер): ```sh /opt/keenetic-entware-extras/scripts/bug-report.sh ``` Скрипт собирает версии, статус всех сервисов, проверки DNS и маршрутов, хвосты логов. В выводе нет паролей, ключей или внешних IP — безопасно постить на форуме. > Доступен начиная с `keenetic-entware-extras` ≥ 0.9.5. Пишите в этой теме — постараюсь помочь. Актуальная версия: 2026-07-13: Основная функциональность: GeoIP zone-файлы теперь хранятся в gzip — экономия ~60-70% flash на роутере (3.5 МБ → 1.2 МБ). Поддержка приватных DoH-провайдеров (Private AdGuard DNS, NextDNS и т.д.) — IP-адрес больше не обязателен, SmartDNS сам резолвит hostname. DNS redirect (smartdns-redirect) теперь работает на дополнительных интерфейсах (nwg1, br1 и т.п.), не только br0. Корректная детекция tunnel-интерфейсов для ROUTE_OUT в статусе и WAN-paths. bug-report.sh: исправлен false positive при ping через VPN-шлюз. Web/CLI: Route Check: поддержка CIDR-подсетей (напр. 5.0.0.0/8) — показывает процент покрытия geo-split и mixed-вердикт. DNS Check: диаграмма переработана — всегда видны обе DNS-группы (zone + other), batch-таблица с цветами/иконками по результату. Имена интерфейсов: nwg0, ppp0 и т.д. заменены на человеко-читаемые лейблы из Keenetic NDM. Диаграмма маршрутов упрощена: две иконки (ISP 🌐 / tunnel 🛡), оптимизация CPU анимации (−65%). Автоопределение патч-сета для KeeneticOS 5.1–5.2+ (включая signal-архитектуру); hash-map.conf больше не нужен. Кнопки сброса кэша SmartDNS и WebUI на карточках дашборда. Карточка WebUI показывает версию прошивки и совместимость патча (✓/⚠). CPU bar: точное измерение через /proc/stat вместо load average. kee-status: версии пакетов видны в summary-режиме (без --details). Замечания и предложения по улучшению как всегда приветствуются! История изменений: Spoiler edited: 2026-04-16: - geo-split-data_0.3.1 bugfix 2026-05-01: - обновлены geo пакеты, - добавлены пакеты DNS geo splitting (для корректной работы гео-сплитинга желательно так же выполнять раздельную обработку гео зон ДНС: гео зону запрашивать у ДНС этой зоны) - добавлен эксперементальный web ui (карточка всех сервисов в dashboard; отдельный веб сервер на 8080 порту; авторизация штатная: доступ - только из LAN) ИИ Changelog: Spoiler ## 📋 Changelog (с последних опубликованных версий) ### geo-split 0.8.0 → 0.9.3 - Миграция CIDR-агрегации с awk на ISC `aggregate` (быстрее, надёжнее) - Добавлен multi-interface failover для загрузки подсетей (VPN → ISP → default) - JSON-вывод в status (geo_zone, upstream_name) - Route table freshness tracking (кэш + возраст таблиц) - Автоопределение DNS-резолвера (порт 6153/6053/system) - Улучшенная диагностика: `status` с секцией checks ### keenetic-entware-extras 0.7.1 (было 0.4.0) - Новая библиотека `lib/status.sh` — shared check/show функции - Новая библиотека `lib/ip.sh` — CIDR-агрегация, ISP-detection, DNS resolver auto-detect - CLI-утилита `kee-status` (`/opt/bin/kee-status`) — агрегированная диагностика всех сервисов - Автоопределение IP роутера для bind-адресов - POSIX-совместимость всех скриптов (ash/BusyBox) ### geo-split-data 0.3.1 → 0.3.4 - Удалён t.me из ru-whitelist (не геоблокируется) - Обновлён список доменов (140 позиций) - Улучшена структура conffiles --- ## 🆕 Описания новых пакетов (для поста) ### smartdns-conf-ru-split 0.3.5 Конфигурация SmartDNS для split-DNS по RU зоне. Маршрутизирует .ru/.рф/.su через Yandex/AdGuard DNS, остальное через Google/Cloudflare DoH. Toggle вкл/выкл. Использует штатный S38smartdns. ### smartdns-redirect 0.1.7 Универсальный DNS DNAT для LAN — перехватывает DNS-трафик (port 53) с br0 и перенаправляет на локальный резолвер (SmartDNS :6053 по умолч.; настраивается на AGH/Unbound/dnsmasq). NDM-совместим: переживает iptables flush через netfilter.d хук. Watchdog перезапуска DNS. ### webui 0.7.9 Web-дашборд на nginx+Lua для мониторинга geo-split, smartdns-conf-ru-split и smartdns-redirect. Порт 8080. Статус-карточки с toggle. Интеграция в штатный сайдбар Keenetic. Logrotate для логов nginx. 2026-05-01/2: bugfixes Spoiler ## Changelog (2026-05-01/2) ### keenetic-entware-extras 0.8.1 - **fix:** `is_cache_fresh()` считал 0-byte файл свежим (`-f` → `-s`) - **feat:** `Depends: cron` — автоустановка cron при первом деплое ### geo-split 0.9.4 - **fix:** postinst safe cron restart (не роняет postinst при отсутствии S10cron) ### smartdns-redirect 0.1.8 - **fix:** prerm/postinst safe cron restart (устраняет `exit 1` → opkg upgrade failure) ### webui 0.7.10 - **fix:** `stop()` убивает orphaned nginx через `pgrep/pkill` (устраняет port conflict при upgrade) 2026-05-01/3: keenetic-entware-extras_0.9.1_all.ipk - исправлена ошибка автоопределения выходного интерфейса в setup "Default policy to a tunnel" Пример карточки webui: Spoiler 2026-05-26: - обновлены все пакеты - в webui добавлена поддержка прошивки 5.1 - в пакеты добавлены Changelog 2026-05-29: **При проблемах:** 1. Опишите проблему словами — что делали, что ожидали, что получили (чем подробнее, тем лучше) 2. Запустите скрипт диагностики и приложите вывод (под спойлер): /opt/keenetic-entware-extras/scripts/bug-report.sh Скрипт собирает версии, статус всех сервисов, проверки DNS и маршрутов, хвосты логов. В выводе нет паролей, ключей или внешних IP — безопасно постить на форуме. > Доступен начиная с `keenetic-entware-extras` ≥ 0.9.5 0.12.1. 2026-05-30: обновлен алгоритм поиска доступного интерфейс для загрузки гео данных в geo-split 2026-06-01: **Обновление keenetic-entware-extras — 30 мая – 1 июня 2026** Крупный апдейт, затронувший все пакеты комплекса. Основной фокус — совместимость с Ethernet-провайдерами (DHCP без proxy-ARP), новый механизм управления сервисами и оптимизация производительности. Spoiler **🌍 geo-split 0.10.8 → 0.12.3** Исправления: - Маршруты на Ethernet ISP (DHCP) больше не вызывают "host unreachable" — автоматически добавляется `via <gateway>` к маршрутам в таблицах 1000/1001 - Исправлен дрейф таймстампа кеша доменов — `mtime` привязан к началу операции, а не к концу (предотвращает накопление задержки при медленном DNS) Производительность: - Проверка статуса читает только 5 маршрутов вместо всех ~11K для определения интерфейса - Подсчёт маршрутов через `/proc/net/fib_triestat` (мгновенно) вместо `ip route | wc -l` Новое: - **Автодетект шлюза** (`ROUTE_GW=auto`) — определяет nexthop IP провайдера автоматически; для PPP/LTE (point-to-point) шлюз не нужен — определяется корректно - **Автодетект интерфейсов загрузки** (`DOWNLOAD_INTERFACES="default *"`) — находит все активные VPN (awg-manager, OpenConnect, Tailscale) без ручного указания - **Graceful disable** — можно отключить сервис удалением симлинка (`rm /opt/etc/init.d/S99geo-split`), cron и ndm-hook это уважают и не перезагрузят сервис - Статус теперь показывает шлюз и поле `enabled` в JSON для WebUI --- **🔌 smartdns-redirect 0.3.0 → 0.3.1** - Graceful disable (symlink-based); watchdog и netfilter-hook уважают отключённое состояние - Унифицированный формат статуса (`✓ Alive` / `⚠ Disabled` / `✗ Fail`) --- **📋 smartdns-conf-ru-split 0.4.4** - Унифицированный формат вывода статуса (machine-parseable) --- **🖥️ webui 0.10.0 → 0.11.1** - **Исправлена ошибка 403** при проксировании стокового httpd — теперь upstream ходит через LAN IP вместо loopback (актуально для моделей с отключённым "Доступ из Интернета") - Проверка доступности стокового httpd в статусе (`Upstream: ok/warn`) - Graceful disable — управление через API (`enable`/`disable` сохраняется после перезагрузки) --- **🛠️ keenetic-entware-extras (базовый пакет) 0.10.0 → 0.12.0** - `lib/ip.sh`: новые функции `detect_gateway()`, `resolve_target_gateway()`, `table_route_count()` - `kee-status.sh`: парсинг статуса из первой строки (не по exit-code), разделитель между пакетами - `bug-report.sh`: расширенная диагностика — состояние сервисов, конфиги, VPN-интерфейсы, тип маршрутов, проверка upstream, FIB trie stats --- **Обновление:** ``` opkg install keenetic-entware-extras_0.12.0_all.ipk geo-split_0.12.3_all.ipk \ smartdns-redirect_0.3.1_all.ipk smartdns-conf-ru-split_0.4.4_all.ipk webui_0.11.1_all.ipk ``` Если у вас Ethernet-провайдер и были проблемы с доступностью RU-сайтов — обновление geo-split должно исправить проблему автоматически (gateway определяется без ручных настроек). --- <details> <summary><b>📜 Полный changelog (кликни для раскрытия)</b></summary> **geo-split** ``` [0.12.3] - 2026-06-01 Improved: check_mode() читает 5 маршрутов вместо 11K (head -5) Improved: check_routes() через /proc/net/fib_triestat вместо pipe Added: table_route_count() — zero-cost подсчёт через kernel FIB stats [0.12.2] - 2026-06-01 Fixed: дрейф mtime кеша доменов (touch -d "@$t_start") Added: зависимость coreutils-touch [0.12.1] - 2026-06-01 Changed: статус-слово на title line (✓/⚠/✗) Changed: JSON: поле gateway, реорганизация grid [0.12.0] - 2026-06-01 Changed: init → S99geo-split (symlink-based enable/disable) Added: graceful disable через удаление симлинка Added: поле "enabled" в JSON [0.11.0] - 2026-05-31 Fixed: Ethernet ISP "host unreachable" — добавлен via <gateway> Added: detect_gateway(), resolve_target_gateway() Added: ROUTE_GW опция (auto|none|IP) [0.10.8] - 2026-05-30 Changed: DOWNLOAD_INTERFACES default → "default *" (авто-VPN-детект) ``` **smartdns-redirect** ``` [0.3.1] - 2026-06-01 Changed: статус-слово на title line [0.3.0] - 2026-06-01 Changed: init → S39smartdns-redirect (symlink-based) Added: graceful disable; watchdog/hook уважают состояние ``` **smartdns-conf-ru-split** ``` [0.4.4] - 2026-06-01 Changed: статус-слово на title line ``` **webui** ``` [0.11.1] - 2026-06-01 Changed: статус-слово на title line [0.11.0] - 2026-06-01 Added: upstream reachability check (stock httpd probe) [0.10.1] - 2026-06-01 Fixed: 403 ошибка — upstream через LAN IP вместо loopback Added: команда update-listen [0.10.0] - 2026-06-01 Changed: init → S80nginx-webui (symlink-based) Added: enable/disable через API (persistent) ``` **keenetic-entware-extras (база)** ``` [0.12.0] - 2026-06-01 Improved: bug-report.sh — расширенная диагностика [0.11.1] - 2026-06-01 Changed: kee-status.sh — парсинг из первой строки [0.11.0] - 2026-06-01 Added: is_service_enabled() — graceful disable Added: kee-status "Disabled" статус [0.10.0] - 2026-05-31 Added: detect_gateway(), resolve_target_gateway() Changed: fill_routes_batch() — via <gateway> для Ethernet ISP ``` </details> Новый версии проверены, но поверхностно (они работают на доступных сетапах), в закрепе оставлены старые версии, если что- то пойдет не так. Пожалуйста, не перепутайте. На данный момент поправлены все известные ошибки. 2026-06-02: keenetic-entware-extras_0.12.1_all.ipk - добавлен пропущенный scripts/bug-report.sh 2026-06-02/2: поправлены ошибки в geo-split 0.12.5 (status) + webui 0.11.2 (unknown format) 2026-06-13: Мульти-зонный GeoIP — больше не привязан к России! Выбирайте любую из 240 стран или 40+ геополитических союзов (BRICS, CIS, EU, NATO, ASEAN…) прямо из WebUI. Работает для маршрутов и DNS. Полноценный WebUI с конфигуратором — управляйте всеми настройками через браузер: DNS-провайдеры, VPN-интерфейсы, зоны, порты. Keenetic-style модальные окна с валидацией, reset-to-default, Save & Restart. DNS-провайдеры на выбор — 15 DNS-провайдеров (Yandex, AdGuard, Google, Cloudflare, Quad9, Mullvad…). Мультиселект: комбинируйте любые для зоны и для "остального мира". Проверка доступности прямо на дашборде. Кэш статуса — API больше не форкает скрипты на каждый poll. Shared-memory кэш в nginx: −84% CPU при 3+ открытых вкладках. gzip_static для stock UI: белый экран на MIPS роутерах ушёл в прошлое (6MB→1.4MB). Умная диагностика — bug-report.sh теперь проверяет: эффективность маршрутизации, путь пакета от клиента через policy routing, утечки IPv6, NAT, MTU — и всё без привязки к конкретной стране. ⚠️ Миграция: smartdns-conf-ru-split → smartdns-geo-conf Пакет `smartdns-conf-ru-split` переименован в `smartdns-geo-conf`! Перед установкой нового пакета обязательно удалите старый: opkg remove smartdns-conf-ru-split opkg install smartdns-geo-conf_0.8.0_all.ipk Конфиг переехал: `/opt/keenetic-entware-extras/smartdns-geo-conf/config/config.conf` (старый путь `smartdns-conf-ru-split/` больше не используется). Spoiler Суммарный Changelog (2026-06-02 → 2026-06-13) Текущие версии пакетов Пакет Версия Изменений keenetic-entware-extras 0.16.1 0.12.1 → 0.16.1 geo-split 0.13.0 0.12.4 → 0.13.0 geo-split-data 0.5.0 0.4.0 → 0.5.0 smartdns-geo-conf 0.8.0 переименован + 0.5.0 → 0.8.0 smartdns-redirect 0.3.1 0.3.0 → 0.3.1 webui 0.24.1 0.11.2 → 0.24.1 🌍 geo-split 0.12.4 → 0.13.0 Multi-zone GeoIP — GEO_ZONE конфиг: любая из 240 стран или 40+ союзов (eas, cis, brics, eu, nato…) Мульти-зонный merge: все .zone файлы → агрегация → таблица маршрутов active_zones в JSON status (показывает развёрнутый список стран) Fix: SIGPIPE / "Unknown format" — BusyBox sed в check_mode() при 8K+ маршрутах, заменено на awk 📦 geo-split-data 0.5.0 Все 234 GeoIP-зоны (было 5 EAEU) — полное покрытие ISO 3166-1 🧬 smartdns-geo-conf 0.5.0 → 0.8.0 Переименование: smartdns-conf-ru-split → smartdns-geo-conf Динамическая генерация DNS-конфигов — 235 статических файлов заменены runtime-генерацией Конфигурируемые DNS-провайдеры: ZONE_DNS_PROVIDER + OTHER_DNS_PROVIDER (15 провайдеров) DNS Server Checks — проверка доступности upstream-серверов (dig + TTL=15s кэш) Мульти-зонный DNS-роутинг: IDN TLDs (30 стран) + CDN-домены (80+ стран) VPN interface binding для DNS (ZONE_DNS_INTERFACE, OTHER_DNS_INTERFACES) 🔀 smartdns-redirect 0.3.1 Status word в заголовке (machine-parseable) 🏠 keenetic-entware-extras 0.12.1 → 0.16.1 lib/geo.sh — разделяемая библиотека: 40+ союзов, resolve_geo_zone(), полный ISO 3166-1 (249 зон в lib/zones.sh) lib/geo.sh: 15+ новых союзов (FATF, AIIB, OPEC/OPEC+, санкционные списки и т.д.) bug-report.sh: routing effectiveness, client-path verification, edge-case diagnostics, динамические тесты (не привязаны к RU) Fix: detect_out_iface() исключает awg* из ISP auto-detection Fix: MTU check crash на роутерах без VPN 🖥️ webui 0.11.2 → 0.24.1 (13 releases!) Config editor — schema-driven модальное окно для ВСЕХ сервисов: geo-split, smartdns, dns-redirect, webui. Save & Restart, Reset All, per-field reset Zone selector — выбор страны/союза с radio + multiselect, поиск/фильтр, флаги 🇷🇺🇺🇸🇩🇪 Interface multi-select — dropdown с чекбоксами, лейблы через NDM, статус UP/DOWN DNS provider multi-select — независимый выбор провайдеров (Yandex, AdGuard, Google, Cloudflare…) DNS Servers check — upstream reachability ✓/✗ на дашборде Status API cache (lua_shared_dict) — дедупликация запросов, −73-84% CPU с несколькими вкладками Per-endpoint TTL — heavy скрипты кэшируются дольше, −46% fork rate gzip_static — pre-compressed stock JS/CSS: 6.0MB → 1.4MB (−76%), убирает 20s белый экран на MIPS Summary condensed mode — 3-5 ключевых метрик + "View details →" Visual polish — box-shadow, status chips, accent borders, loading skeletons, dot grid Styled tooltips — universal data-tooltip + RAM sysinfo popup Search/filter во всех dropdown-панелях Browser history для custom page tabs + Back/Forward Fix: status flicker (race condition abort controller) Fix: stock sidebar break после custom page (critical) System info: CPU%, RAM bar, disk, uptime с auto-refresh Rate limiting POST API (1 req/sec burst 3) Auth guard для POST (session через stock httpd) Toggle switches start/stop в карточках worker_processes auto (по ядрам CPU) 2026-06-16: Главные изменения: 🆕 Свои DNS-серверы — можно добавить любой DNS (IP, DoT, DoH) в файл dns-providers-custom.conf. Не затирается при обновлении. Отображается в WebUI. 🆕 Провайдер system — использовать DNS из настроек Keenetic (plain UDP, минимальная задержка, без шифрования). 🔍 Поиск в dropdown'ах — фильтрация по тексту во всех выпадающих списках (зоны, провайдеры, интерфейсы). ✅ DNS Server Checks — на дашборде видно ✓/✗ доступность каждого upstream провайдера. ⚡ CPU-безопасность — если сеть деградирована (MITM), DNS-тесты завершаются досрочно вместо зависания. Cold-start без дублей status.sh. Spoiler Суммарный Changelog (2026-06-13 → 2026-06-16) Текущие версии пакетов Пакет Версия Изменений keenetic-entware-extras 0.16.3 0.16.1 → 0.16.3 geo-split 0.13.2 0.13.0 → 0.13.2 geo-split-data 0.5.0 без изменений smartdns-geo-conf 0.10.4 0.8.0 → 0.10.4 smartdns-redirect 0.3.4 0.3.1 → 0.3.4 webui 0.25.3 0.24.1 → 0.25.3 🧬 smartdns-geo-conf 0.8.0 → 0.10.4 Свои DNS-серверы (dns-providers-custom.conf) — UDP/DoT/DoH, сохраняются при обновлении, видны в WebUI Провайдер system (Keenetic DNS) — plain UDP из настроек роутера, минимальная задержка Переименование default → system (точнее отражает суть) CPU-safe DNS checks — early-exit при деградированной сети (если 2+ upstream timeout → остальные пропускаются) Лейблы провайдеров для WebUI (динамическая загрузка) Рефакторинг status.sh на декларативный API 🖥️ webui 0.24.1 → 0.25.3 Поиск/фильтр во всех dropdown'ах — DNS-провайдеры, зоны, интерфейсы Динамическая загрузка DNS-провайдеров из dns-providers.conf (+ custom) — не захардкожены в JS Единый renderDropdown() — все 5 вариантов dropdown через одну функцию (−100 LOC копипасты) Cold-start stampede fix — при рестарте nginx дубли status.sh не запускаются (placeholder для конкурентных workers) LOCK_TTL увеличен 15s → 45s (защита от крашей на медленных MIPS) Рефакторинг status.sh на декларативный API 🏠 keenetic-entware-extras 0.16.1 → 0.16.3 lib/status.sh: декларативный JSON API (status_detail, status_check_result, status_emit_json) lib/status.sh: декларативный text-output API (status_line, status_section, status_emit_text) 🌍 geo-split 0.13.0 → 0.13.2 Рефакторинг status.sh (JSON + text) на декларативный API (без изменения вывода) 🔀 smartdns-redirect 0.3.1 → 0.3.4 User manual включён в .ipk Обновлено описание: совместимость с smartdns-geo-conf Рефакторинг status.sh (JSON + text) на декларативный API 2026-06-17: потерялись пакеты... 2026-06-17/2: Небольшой опрос: имеет смысл добавить в cli/ui проверку конкретного ресурса/сайта/домена/ip/net ? Ответьте в теме, пожалуйста. 2026-06-18: Поправлена ошибка переключения между 2+ uplink (geo таблицы не встраивались в роутинг до следующей проверки (раз в 15 минут в дефолте)). 2026-07-01: - Добавлена проверка актуальных маршрутов для доменов или IP в geo-split: cli + ui. * под policy понимается стоковый механизм политик роутинга Кинетика (передаётся управление ему). - Добавлена проверка dns в smartdns-geo-conf: cli + ui. (будет улучшена) - Основная функциональность не менялась. geo-split-data_0.6.0_all.ipk geo-split_0.17.4_all.ipk keenetic-entware-extras_0.16.8_all.ipk smartdns-geo-conf_0.10.11_all.ipk smartdns-redirect_0.3.7_all.ipk webui_0.33.2_all.ipk Edited Monday at 07:31 AM by 0xkee update 6 Quote
poo Posted April 30 Posted April 30 Привет! Спасибо за работу и проект! Я столкнулся с тем что при настройке решения RU сайты вообще перестают открываться. Пробовал c помощью ИИ. Думаю что может быть связано с политиками маршрутизации на самом роутере. Может у тебя есть совет как должна быть настроена эта секция? Quote
0xkee Posted May 1 Author Posted May 1 (edited) On 4/30/2026 at 12:01 PM, poo said: Привет! Спасибо за работу и проект! Я столкнулся с тем что при настройке решения RU сайты вообще перестают открываться. Привет! Спасибо за отзыв. Поставь/обнови, пожалуйста, до новых версий пакетов. Рекомендуется поставить все. Если не заработает (есть вероятность ошибки автоматического определения выходного интерфейса), проведи и скинь диагностику. HW - KN-3810? Ошибка исправлена. Диагностика, если не работает: Spoiler Привет! Спасибо за отзыв и за то, что описал проблему. ## Диагнозы Судя по скриншотам, у тебя **"Политика по умолчанию" = WireGuard (EE-2)**. Это значит, что весь трафик всех устройств по дефолту идёт в VPN-туннель. geo-split работает так: он перехватывает трафик к RU-подсетям и направляет его напрямую через ISP (минуя VPN). Но для этого он должен корректно определить ISP-интерфейс. ## Шаги диагностики Подключись к роутеру по SSH и выполни: ```sh # 1. Статус geo-split (покажет определённый интерфейс) /opt/etc/init.d/S99geo-split status # 2. Что в main table default route? ip route | grep "^default" # 3. Что в таблицах geo-split? ip route show table 1001 | head -5 # 4. Есть ли ip rules geo-split? ip rule show | grep -E "table (1000|1001)" ``` Скинь вывод — будет понятно, где проблема. ## Наиболее вероятные причины ### 1. geo-split не запущен / подсети не загружены Если `ip rule show` не показывает таблицы 1000/1001 — geo-split не активен. Запусти: ```sh /opt/etc/init.d/S99geo-split start ``` ### 2. DNS идёт через VPN Даже если маршрутизация IP-подсетей работает правильно, **DNS-запросы** могут уходить в VPN. Если VPN-сервер за рубежом, DNS может возвращать IP-адреса, с которых RU-сайты недоступны (или CDN отдаёт заблокированный контент). **Решение:** Установить пакет `smartdns-conf-ru-split` — он настраивает split-DNS: RU-домены резолвятся через российские DNS (77.88.8.8), а остальные — через защищённый DNS. ### 3. VPN-сервер в стране, откуда RU-сайты блокируют доступ Если EE-2 (WireGuard) — это выход в Эстонии/Нидерландах/и т.д., многие RU-сайты (банки, госуслуги, стриминги) блокируют зарубежные IP. В этом случае geo-split как раз и должен направить RU-трафик мимо VPN. ### 4. ISP-интерфейс определён неверно (маловероятно, но возможно) Если `ip route | grep "^default"` показывает VPN-интерфейс (nwg0, ovpn0) вместо ISP (eth*, ppp*) — значит на твоей модели Keenetic default route в main table указывает на VPN. В этом случае нужно явно указать ISP-интерфейс: ```sh vi /opt/etc/keenetic-entware-extras/geo-split/config.sh # Найти строку ROUTE_OUT="auto" и заменить на: ROUTE_OUT="eth3" # или ppp0 — твой реальный ISP-интерфейс # Перезапустить: /opt/etc/init.d/S99geo-split restart ``` Чтобы узнать ISP-интерфейс, посмотри: `ip link show` или в веб-интерфейсе "Другие подключения" → какой интерфейс у Ethernet ISP. ## Рекомендуемая настройка политик для split-routing Оптимальная конфигурация для сценария "RU через ISP, остальное через VPN": | Политика | Подключение | Назначение | |----------|-------------|------------| | Политика по умолчанию | Ethernet ISP | Прямой выход в интернет | | VPN | EE-2 (WireGuard) | Для VPN-маршрутизации | А назначение устройств на политику VPN — через вкладку "Применение политик". **Но** geo-split должен работать и при твоей текущей конфигурации (дефолт = WireGuard), потому что он вставляет свои правила с более высоким приоритетом (50-51) чем политики Keenetic (100+). --- *Скинь вывод диагностических команд — разберёмся точнее.* Edited May 1 by 0xkee Quote
Kservlad Posted May 24 Posted May 24 Спасибо за проект! Поставил на Viva (KN-1910), но не тянет. Зависает. Есть рекомендации по железу? Quote
0xkee Posted May 25 Author Posted May 25 (edited) On 5/24/2026 at 4:05 PM, Kservlad said: Спасибо за проект! Поставил на Viva (KN-1910), но не тянет. Зависает. Есть рекомендации по железу? Добрый день. На Hero 4G (KN-2310) тянет без проблем, железо идентичное, должно работать и на Viva 1910. Вероятно, какая-то ошибка. Можете дать какие-то подробности? По железу: MediaTek MT7621A + 128 MB DDR3 и выше (последние 8-10 лет) точно работает. edited: Так же надо ещё учитывать, какую гео зону загружаете, небольшое исследование нейросетки в закрепе. Есть большие и маленькие, они требуют разное количество RAM. zone-sizes-research.md Edited May 25 by 0xkee added geo zones quantitative synopsis Quote
Kservlad Posted May 26 Posted May 26 (edited) как 10 часов назад, 0xkee сказал: Можете дать какие-то подробности? Версия ОС 5.1 Beta 3 Как собрать данные для анализа? после запуска зависает насмерть не открывается ни web ни ssh. помогает только сброс по питанию... Edited May 26 by Kservlad Quote
0xkee Posted May 26 Author Posted May 26 (edited) 10 hours ago, Kservlad said: Версия ОС 5.1 Beta 3 Как собрать данные для анализа? При установке что выводит, где останавливается? Лог можете прислать/показать? На 5.1 не проверялось (как бы dev preview версия), видимо, что-то поменяли, надо изучить... edited: 5.1 изучен, не работал webui, поправлено, всё остальное без изменений и работает. Так же выложены новые версии пакетов. Edited May 26 by 0xkee Quote
Kservlad Posted May 28 Posted May 28 Установил последнюю версию. Недоступен российский сегмент сети. Quote
KeenTaur Posted May 29 Posted May 29 0xkee Спасибо за проект! Пытаюсь развернуть на ZyXEL Keenetic Giga II с версией ОС 2.16.D.12.0-12. Пока не взлетело, (например, не запускается webui) но об этом, возможно, попозже. У вас в smartdns-conf-ru-split_0.4.3_all.ipk в кофиге smartdns.conf в комментариях написано: Цитата # =========================================================================== # 🇷🇺 RU routing rules — какие домены идут через ru-группу # =========================================================================== # nameserver /domain/group — domain БЕЗ ведущей точки # суффикс "ru" → .ru и все *.ru а сразу далее указаны суффиксы с ведущими точками: # Russian TLDs nameserver /.ru/ru # .рф (punycode) nameserver /.xn--p1ai/ru nameserver /.su/ru нет ли в этом ошибки? Quote
0xkee Posted May 29 Author Posted May 29 On 5/28/2026 at 6:23 AM, Kservlad said: Установил последнюю версию. Недоступен российский сегмент сети. пожалуйста подключитесь по ssh к entware роутера и пришлите вывод kee-status -d Quote
0xkee Posted May 29 Author Posted May 29 1 hour ago, KeenTaur said: У вас в smartdns-conf-ru-split_0.4.3_all.ipk в кофиге smartdns.conf в комментариях написано: Привет! Спасибо за обратную связь. По поводу ведущей точки в nameserver правилах: Ошибки нет — SmartDNS обрабатывает оба варианта одинаково: nameserver /.ru/ru nameserver /ru/ru Оба означают "домен ru и все его поддомены (*.ru)". Ведущая точка — опциональна, SmartDNS её стрипает при парсинге. Формат с точкой — это dnsmasq-style конвенция, которая широко используется в примерах SmartDNS. А вот комментарий в конфиге действительно вводит в заблуждение — он говорит "БЕЗ ведущей точки", а правила ниже с ней. Поправлю, спасибо за внимательность! 1 hour ago, KeenTaur said: Пытаюсь развернуть на ZyXEL Keenetic Giga II с версией ОС 2.16.D.12.0-12. Пока не взлетело, (например, не запускается webui) но об этом, возможно, попозже. К сожалению, проект рассчитан на KeeneticOS 5.x (прошивки серии 5.0 / 5.1). Keenetic Giga II с ОС 2.16 — это другое поколение платформы (NDMS2), и webui на ней работать не будет: он патчит Angular-based интерфейс NDW4, которого на 2.x нет. При этом пакеты без webui (smartdns-conf-ru-split, smartdns-redirect, geo-split) теоретически могут работать, если на Giga II установлен Entware и в нём доступен SmartDNS + остальные зависимости. Основные скрипты — POSIX sh, привязки к конкретной версии прошивки нет (кроме webui и NDM-хуков). Но я не тестировал на 2.x, поэтому гарантировать не могу — если попробуете, буду рад услышать результат. Добавлю в описание минимальные требования к прошивке. Quote
0xkee Posted May 29 Author Posted May 29 При проблемах: 1. Опишите проблему словами — что делали, что ожидали, что получили (чем подробнее, тем лучше) 2. Запустите скрипт диагностики и приложите вывод (под спойлер): /opt/keenetic-entware-extras/scripts/bug-report.sh Скрипт собирает версии, статус всех сервисов, проверки DNS и маршрутов, хвосты логов. В выводе нет паролей, ключей или внешних IP — безопасно постить на форуме. > Доступен начиная с `keenetic-entware-extras` ≥ 0.9.5. 1 Quote
KeenTaur Posted May 29 Posted May 29 7 часов назад, 0xkee сказал: Но я не тестировал на 2.x, поэтому гарантировать не могу — если попробуете, буду рад услышать результат Я попробую, но, скорее всего, где-то во вторник. По webui понятно, удалю его. Хотя, как мне показалось из его ридми, вроде было два варианта: один с инъекцией в интерфейс, другой без. Вопрос по зависимостям. Если у меня уже был установлен какой-то пакет (например, ca-certificates) при удалении geoio split routing он останется? А установленный как зависимость smartdns удалится? Вoпрос по dns. Я верно понял, что выполнять команду opkg dns override не требуется? По диагностике. Сначала пробовал автоопределение (шлюз по умолчанию был через провайдера), диагностика "споткнулась" на п.4 В 01.05.2026 в 16:45, 0xkee сказал: # 4. Есть ли ip rules geo-split? ip rule show | grep -E "table (1000|1001)" Вывод был пустой. Сейчас я пока передумал и решил, пусть все идет в туннель и только RU через провайдера напрямую. Продолжу не раньше понедельника, но хотел бы уточнить, для такой схемы надо прописывать маршрут по умолчанию через туннель или скрипты сами зарулят что куда надо? По минимальным требованиям к прошивке. Есть еще линейка устройств с ОС 4.3.7 (типа моих Extra KN-1711). Спасибо! Quote
LuckyOwner Posted May 29 Posted May 29 Рабочее решение? Почему сайт пишет, что IPK недоступны для скачивания? Еще не выложено на GitHub? Quote
0xkee Posted May 29 Author Posted May 29 3 hours ago, KeenTaur said: Сначала пробовал автоопределение (шлюз по умолчанию был через провайдера), диагностика "споткнулась" на п.4 3 hours ago, KeenTaur said: Сейчас я пока передумал и решил, пусть все идет в туннель и только RU через провайдера напрямую. Это же одно и тоже? Подробный ответ на все остальные вопросы (совместно с нейросеткой, резюме в конце, не сочтите за слоп) В 2х словах, скорее всего "core" заработает на 4.х, webui нет, но можно допилить после 2.х очень старая (13 лет) и планов её поддерживать нет (и не факт, что это можно сделать простыми способами) Spoiler Разбор отзыва KeenTaur — контекст из кодовой базы 1. WebUI — «два варианта: с инъекцией и без» Пользователь частично прав — в webui есть параметр INJECT_SIDEBAR (0/1😞 Режим Что делает INJECT_SIDEBAR=1 inject.js добавляет пункт меню "Entware Extras" в sidebar stock UI INJECT_SIDEBAR=0 Sidebar не трогается, но карточка на дашборде и кастомный дашборд по-прежнему работают Однако оба режима предполагают патчинг stock UI в tmpfs (webui/README.md:54–75) — inject.js и JS-bundle patches применяются в любом случае. Это не "без инъекции", а скорее "минимальная инъекция" (только dashboard card). Для ответа пользователю: WebUI — экспериментальный пакет, работает только на KeeneticOS 5.x. Для KN-1711 (OS 4.x) точно не подходит. Основные пакеты (geo-split, smartdns-conf-ru-split) работают без webui. 2. Зависимости при удалении Из packaging/geo-split/control: Depends: keenetic-entware-extras, geo-split-data, ip-full, curl, bind-dig, aggregate Из packaging/smartdns-conf-ru-split/control: Depends: keenetic-entware-extras, smartdns, ca-certificates Ответ: opkg в Entware не удаляет зависимости автоматически — нет autoremove. При opkg remove geo-split: ca-certificates — останется (даже если ставился как зависимость другого пакета) smartdns — останется (он зависимость smartdns-conf-ru-split, не geo-split) ip-full, curl, bind-dig, aggregate — останутся Для полной очистки нужно вручную: opkg remove smartdns ca-certificates ip-full bind-dig aggregate (только если ничего другое их не использует). 3. DNS — нужна ли opkg dns-override? НЕТ, не нужна. В docs/forum-post-draft.md:43 явно указано: ❌ «DNS-Override» — не используются. Проект использует другой подход (из smartdns-conf-ru-split/README.md:42–69😞 SmartDNS слушает на :6053 (не :53) В Keenetic CLI добавляется: ndmc -c 'ip name-server <IP>:6053' ndnproxy (по-прежнему на :53) форвардит запросы в SmartDNS Опционально пакет smartdns-redirect делает iptables DNAT с br0:53 → :6053 для LAN-клиентов (минуя ndnproxy), но opkg dns-override всё равно не нужен. 4. Схема «всё через туннель, только RU напрямую» Это основной сценарий проекта — из docs/forum-post-draft.md:12: VPN split — весь трафик идёт через VPN, а RU-трафик — напрямую через провайдера Из сравнительной схемы (geo-split/docs/comparison/keen-pbr.md:28–51😞 RULE -->|dst в table 1000/1001| → ISP (ROUTE_OUT) RULE -->|dst НЕ в table| → Default route (main table) → VPN tunnel Ответ для пользователя: Да, маршрут по умолчанию через туннель нужно настроить самому — в Keenetic «Приоритеты подключений» или ip route CLI. Это стандартная настройка VPN на Keenetic. geo-split только добавляет RU-подсети/домены в кастомные routing tables (1000, 1001) c путём через ISP (параметр ROUTE_OUT="auto") Всё остальное (не-RU) проходит по main table → попадает в default route → идёт в VPN Конфигурация: ROUTE_OUT="auto" # auto = ISP (определяется из default route ДО подъёма VPN) ROUTE_IN="br0" Причина пустого ip rule show | grep table 1000 (п.4 диагностики): скрипт geo-split не был запущен, или VPN не поднят, или NDM-хук не сработал. После установки нужно: Убедиться что VPN настроен и поднят Запустить /opt/etc/init.d/S99geo-split start Проверить S99geo-split status 5. Минимальные требования — KeeneticOS 4.3.7 (Extra KN-1711) Из docs/forum-post-draft.md:29: KeeneticOS ≥ 5.0 (прошивки серии 5.x). Старые прошивки (2.x / 3.x) не поддерживаются. Из docs/bugs/giga-ii-os-2.16-feedback/analysis.md:38: Проект разработан и протестирован исключительно для KeeneticOS 5.x (NDMS4 / NDW4) Extra KN-1711 с ОС 4.3.7: Это промежуточное поколение (между NDMS2 и NDMS4). Не 2.x, но и не 5.x. Entware — поддерживается (mipsel, arch mipsel-3.4_kn) WebUI — совершенно другой (не Angular/NDW4), webui пакет точно не работает ndmc CLI — доступен, но набор команд может отличаться ✅ NDM hooks — ПОДТВЕРЖДЕНО через анализ пакета opt-ndmsv2 Проверка пакета opt-ndmsv2_1.0-17_mipsel-3.4_kn.ipk из репозитория bin.entware.net/mipselsf-k3.4/keenetic/ показала: Пакет помечен Essential: yes — устанавливается автоматически при инициализации Entware Пакет создаёт все NDM hooks каталоги, в т.ч. критичные для нашего проекта: /opt/etc/ndm/ifstatechanged.d/ — используется geo-split/scripts/ndm-hook.sh /opt/etc/ndm/netfilter.d/ — используется smartdns-redirect/scripts/netfilter-hook.sh Архитектура mipsel-3.4_kn — тот же репозиторий, что используется на KN-1711 Extra Вывод: Раз Keenetic распространяет opt-ndmsv2 как обязательный пакет для этой архитектуры — прошивка поддерживает вызов скриптов из /opt/etc/ndm/ каталогов. NDM hooks каталоги идентичны тем, что мы используем на 5.x (включая ifstatechanged.d и netfilter.d). Вердикт для core-пакетов (geo-split, smartdns-conf-ru-split, smartdns-redirect): Не тестировано на реальном железе, но NDM hooks infrastructure идентична 5.x geo-split — должен работать: ip rule/ip route (kernel API) + NDM hooks (подтверждены) smartdns-conf-ru-split — должен работать: конфиг SmartDNS, не зависит от версии ОС smartdns-redirect (iptables DNAT + netfilter.d hook) — должен работать webui — НЕ работает (требует Angular SPA / NDW4, которого нет на 4.x) ✅ ndmc CLI — НЕ используется core-пакетами Проверка по кодовой базе: ndmc вызывается только в: webui/scripts/patch-stock-ui.sh:75 — определение версии прошивки (webui на 4.x не работает) scripts/bug-report.sh:22 — сбор диагностики (show version, некритично) Core-скрипты geo-split, smartdns-conf-ru-split, smartdns-redirect используют только Linux-утилиты из Entware: ip, iptables, dig, curl, grep, sed, awk. Никакой зависимости от ndmc. Единственное место, где ndmc упоминается — инструкция для пользователя (README.md) по настройке DNS: ndmc -c 'ip name-server <IP>:6053' Это базовая команда Keenetic CLI, доступная на всех версиях прошивки. Рекомендация для ответа: Не тестировал на 4.x, но проверил подробно: Core-пакеты (geo-split, smartdns-conf-ru-split, smartdns-redirect): Пакет opt-ndmsv2 (Entware) для архитектуры mipsel-3.4 идентичен — те же каталоги /opt/etc/ndm/ifstatechanged.d/, netfilter.d/ и т.д. Скрипты не используют ndmc — только стандартные Linux-утилиты (ip, iptables, dig, curl) Должны работать на KN-1711 без доработок. Если попробуете — буду рад фидбэку. WebUI: Пока не ставьте — сейчас поддерживает только 5.x Но! Скачал и распаковал вашу прошивку 4.3.7 — там тот же Angular (NDW4) 7 из 9 патчей переносятся тривиально, 2 требуют доработки Если core заработает нормально и будет интерес — попробую портировать webui на 4.x Общая сводка для формулировки ответа Вопрос Краткий ответ WebUI два варианта Один пакет, настройка INJECT_SIDEBAR=0/1. Сейчас для 4.x не работает — не ставить. Но 4.x использует тот же Angular — порт возможен по запросу после подтверждения core. Зависимости при удалении opkg не удаляет deps автоматически. ca-certificates и smartdns останутся. opkg dns-override НЕ требуется. Проект использует ip name-server <ip>:6053. Default через туннель Маршрут по умолчанию через VPN настраивается пользователем в Keenetic. geo-split только добавляет маршруты для RU через ISP. KeeneticOS 4.3.7 NDM hooks идентичны 5.x, скрипты не используют ndmc. Core должно работать. WebUI — можно портировать по запросу. 1 Quote
0xkee Posted May 29 Author Posted May 29 2 hours ago, LuckyOwner said: Рабочее решение? Почему сайт пишет, что IPK недоступны для скачивания? Еще не выложено на GitHub? Пока нет отзывов, что работает. Вопрос в сетапах/конфигурации сетей, всего не предусмотреть, если и не работает, то скорее всего по этому. Глючит. Нет, планируется. Quote
KeenTaur Posted May 29 Posted May 29 Спасибо! Стало несколько понятнее, на практике эксперименты продолжу со "старичком" с v2.16 в пн-вт. С подробной диагностикой при необходимости (предыдущее сообщение писал по памяти, уже без доступа к устройству). На Экстрах 1711 у меня пока AWG-Manager + MagiTrickle. Версию 4.3.7 упомянул для определенности. К тому же, она, 4.3.7 вроде как получила статус LTS. Quote
0xkee Posted May 29 Author Posted May 29 7 minutes ago, KeenTaur said: AWG-Manager Красивое, изучу возможность совместимости. 8 minutes ago, KeenTaur said: MagiTrickle Видел, тут (пока) принципиально иное решение: мухи отдельно, котлеты отдельно. И в этом есть масса плюсов - что нетфликс, что банки думают то, что им и положено думать. (Но в процессе эксплуатации возникла проблема, что топология (что ли) сетей меняется чаще, чем дефолтные обновления гео (7 дней) и доменов (1 час). Возможно, некий гибрид on-demand+full-split наиболее оптимален в будущем) 12 minutes ago, KeenTaur said: Версию 4.3.7 упомянул для определенности. К тому же, она, 4.3.7 вроде как получила статус LTS. У меня, к сожалению, нет железки с 4.х. Пока исследовал по прошивке, должно работать. Если есть какая-то железка с 4.х, куда можете дать ssh - могу всё проверить и добавить поддержку за час-два... как вариант. Либо фидбеки. 16 minutes ago, KeenTaur said: Стало несколько понятнее, Уточню на всякий случай, у Вас уже должен быть Кинетик/Неткрез + entware + a tunnel (типо vpn/proxy или что-то такое), оно всё должно быть настроено и работать. А эти пакеты добавляют [global] geo splitting на 2х уровнях (иначе никак): ip routing (по крону загружаются/обновляются официальные таблицы + резолвятся домены из определённого списка, это фактически на будущее) + dns geo resolving (это делается с помощью конифга smartdns, которые такое умеет), поэтому несколько пакетов. Плюс добавлено куча настроек в конфиги, большая часть из которых в 99% сетапов менять не потребуется, но дают бОльшую гибкость и позволяют сплиттить из любого интефейса в любой любую гео зону (в перспективе несколько одновременно, пока не реализовано). Плюс обходятся стоковые dns службы, т.к. они не очень. Вот как-то так... Quote
0xkee Posted May 30 Author Posted May 30 2 hours ago, KeenTaur said: AWG-Manager Разобрался с совместной работой geo-split и awg-manager. Если коротко — всё должно работать вместе без дополнительных настроек. Единственное, что не нужно — это DNS от awg-manager, но он и так не требуется при использовании geo-split. Подробности — в приложениях. В процессе нашлась причина, по которой geo-split мог не работать совместно с awg-manager. Суть проблемы: некоторые российские провайдеры блокируют доступ к сайтам с гео-списками. Чтобы обойти такую блокировку, geo-split умеет пробовать загрузку через разные сетевые интерфейсы. Раньше список этих интерфейсов был зашит вручную — туда входили только «родные» подключения роутера, потому что сторонние пакеты не предполагались. Из-за этого интерфейсы, созданные awg-manager, просто не учитывались — скорее всего именно это и приводило к проблемам. Исправил: теперь geo-split автоматически перебирает все активные интерфейсы, включая те, что создаёт awg-manager. Обновите geo-split до последней версии. ps сорри за ии-фильтр текста awg-manager-compatibility-post.md compatibility-analysis.md Quote
Kservlad Posted May 30 Posted May 30 (edited) В 29.05.2026 в 15:17, 0xkee сказал: пожалуйста подключитесь по ssh к entware роутера и пришлите вывод kee-status -d # kee-status -d keenetic-entware-extras status: geo-split Alive geo-split status: Mode: Geo zone: RU Route in: br0 Route out: auto (detect ISP) Active out: eth2.4 (tables 1000,1001) IP rules: iif br0 → table 1000 (domains) ✓ iif br0 → table 1001 (subnets) ✓ Routes: Domains: 184 routes in table 1000, filled 41s ago ✓ Subnets: 8613 routes in table 1001, filled 37s ago ✓ Caches: Subnets: cache 2d 23h 8m old (max 7d 0h 0m) ✓ Domains: 184 in cache, 24m 7s old (max 1h 0m 0s) ✓ Domain sources: 103 domain(s) configured System: Uptime: 49s ✓ Cron: 1 job(s) (shift 10m) ✓ NDM hook: /opt/etc/ndm/ifstatechanged.d/geo-split-hook ✓ DL iface: default (cached) DNS: system resolver Background: idle Loader: cidr-plain Version: 0.10.7 ~ # tracert youtube.com Трассировка маршрута к youtube.com [142.251.38.110] с максимальным числом прыжков 30: 1 <1 мс <1 мс <1 мс KEENETIC-0861 [192.168.0.1] 2 * * * Превышен интервал ожидания для запроса. 3 72 ms 71 ms 72 ms 178.18.225.111.ix.dataix.eu [178.18.225.111] 4 69 ms 69 ms 69 ms 178.18.235.253 5 70 ms 71 ms 70 ms 72.14.237.55 6 72 ms 70 ms 70 ms 142.251.65.81 7 70 ms 72 ms 70 ms lcarna-ac-in-f14.1e100.net [142.251.38.110] tracert mail.ru Трассировка маршрута к mail.ru [185.180.201.1] с максимальным числом прыжков 30: 1 <1 мс <1 мс <1 мс KEENETIC-0861 [192.168.0.1] 2 ХХХХХХХ[ХХХ.ХХХ.ХХХ.ХХХ] сообщает: Заданный узел недоступен. Edited May 30 by Kservlad Quote
0xkee Posted May 30 Author Posted May 30 1 hour ago, Kservlad said: keenetic-entware-extras status: geo-split Alive geo-split status: Mode: Geo zone: RU Route in: br0 Route out: auto (detect ISP) Active out: eth2.4 (tables 1000,1001) Привет! Спасибо за подробный вывод. ## Что происходит geo-split определил **eth2.4** как ISP-интерфейс и маршрутизирует через него RU-трафик. Но этот интерфейс отвечает "узел недоступен" — значит либо это **не тот интерфейс** (не интернет, а, например, IPTV), либо ISP-подключение ещё не успело подняться (uptime всего 49 секунд). YouTube работает потому что идёт через VPN (не попадает в RU-подсети). ## Диагностика Подключись по SSH и выполни **одной командой** (скопировать целиком): echo "=== INTERFACES ===" && ip -br link show && \ echo "=== ADDRESSES ===" && ip -br addr show && \ echo "=== DEFAULT MAIN ===" && ip route show default && \ echo "=== DEFAULT ALL ===" && ip route show table all 2>/dev/null | grep "^default" && \ echo "=== TABLE 1001 ===" && ip route show table 1001 2>/dev/null | head -3 && \ echo "=== PING eth2.4 ===" && ping -c2 -W3 -I eth2.4 77.88.8.8 2>&1 && \ echo "=== NDM ===" && ndmc -c "show interface" 2>/dev/null | grep -E "interface-name:|description:|connected:" | head -30 Скинь полный вывод — станет ясно, в чём дело. ## Быстрый workaround (если не хочешь ждать) Если в выводе `ndmc` видно, что у Ethernet-интернета другой interface-name (например `eth2.2` или `eth3`) — можно сразу указать его явно: cat > /opt/keenetic-entware-extras/geo-split/config/config.conf << 'EOF' ROUTE_OUT="eth2.2" EOF /opt/etc/init.d/S99geo-split restart Замени `eth2.2` на реальное имя ISP-интерфейса из вывода `ndmc`. ## Либо: просто подожди 2-3 минуты Uptime 49 секунд — ISP-подключение могло ещё не полностью подняться. Попробуй повторить `tracert mail.ru` через пару минут после загрузки. *** Скорее всего, неправильно авто определился интерфейс к провайдеру. eth2.4 - это один из ethernet на роутере, такое подключение - прямое, без ppp (когда вводятся логин/пароль для подключения), это маловероятно, если провайдер более-менее большой, у них у всех ppp over eth (т.е. должен определяться типа ppp0). То, что isp ещё не поднялся - это маловероятно. Если так - самое простое, поправить в конфиге ROUTE_OUT на правильный интерфейс (от провайдера) и рестартануть geo-split. Если это поможет - доработаю логику авто определения выходного интерфейса. Quote
Kservlad Posted May 30 Posted May 30 в том то и дело что автоопределил правильно... === PING eth2.4 === PING 77.88.8.8 (77.88.8.8): 56 data bytes 64 bytes from 77.88.8.8: seq=0 ttl=59 time=63.660 ms 64 bytes from 77.88.8.8: seq=1 ttl=59 time=56.693 ms Quote
Kservlad Posted May 30 Posted May 30 (edited) === INTERFACES === lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> tunl0@NONE DOWN 0.0.0.0 <NOARP> ip6tnl0@NONE DOWN :: <NOARP> sit0@NONE DOWN 0.0.0.0 <NOARP> gre0@NONE DOWN 0.0.0.0 <NOARP> gretap0@NONE DOWN 00:00:00:00:00:00 <BROADCAST,MULTICAST> ethoip0@NONE DOWN 00:00:00:00:00:00 <BROADCAST,MULTICAST> dummy0 DOWN 72:72:ca:df:a8:73 <BROADCAST,NOARP> ezcfg0 DOWN <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> eth2 UP 50:ff:20:57:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> eth3 DOWN 50:ff:20:57:06:8f <NO-CARRIER,BROADCAST,MULTICAST,UP> xfrms1@NONE UNKNOWN <NOARP,UP,LOWER_UP> xfrms2@NONE UNKNOWN <NOARP,UP,LOWER_UP> ra0 DOWN 50:ff:20:57:06:8e <NO-CARRIER,BROADCAST,MULTICAST,UP> ra1 DOWN 52:ff:20:17:06:8e <NO-CARRIER,BROADCAST,MULTICAST,UP> ra2 DOWN 52:ff:20:27:06:8e <BROADCAST,MULTICAST> ra3 DOWN 52:ff:20:37:06:8e <BROADCAST,MULTICAST> ra4 DOWN 52:ff:20:47:06:8e <BROADCAST,MULTICAST> ra5 DOWN 52:ff:20:57:06:8e <BROADCAST,MULTICAST> ra6 DOWN 52:ff:20:67:06:8e <BROADCAST,MULTICAST> ra7 DOWN 52:ff:20:77:06:8e <NO-CARRIER,BROADCAST,MULTICAST,UP> ra8 DOWN 52:ff:20:87:06:8e <NO-CARRIER,BROADCAST,MULTICAST,UP> ra9 DOWN 52:ff:20:97:06:8e <NO-CARRIER,BROADCAST,MULTICAST,UP> ra10 DOWN 52:ff:20:a7:06:8e <BROADCAST,MULTICAST> ra11 DOWN 52:ff:20:b7:06:8e <BROADCAST,MULTICAST> ra12 DOWN 52:ff:20:c7:06:8e <BROADCAST,MULTICAST> ra13 DOWN 52:ff:20:d7:06:8e <BROADCAST,MULTICAST> ra14 DOWN 52:ff:20:e7:06:8e <BROADCAST,MULTICAST> ra15 DOWN 52:ff:20:f7:06:8e <NO-CARRIER,BROADCAST,MULTICAST,UP> apcli0 DOWN 56:ef:20:57:06:8e <BROADCAST,MULTICAST> apcli1 DOWN 56:ff:20:57:06:8e <BROADCAST,MULTICAST> dsl_br0 DOWN 06:b2:f6:e0:4e:0a <BROADCAST,MULTICAST> eth2.1@eth2 UP 50:ff:20:57:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> eth2.2@eth2 UP 52:ff:20:57:06:8d <BROADCAST,MULTICAST,UP,LOWER_UP> eth2.4@eth2 UP 50:ff:20:57:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> cdc_br0 UP 34:4b:50:00:00:00 <BROADCAST,MULTICAST,UP,LOWER_UP> br0 UP 50:ff:20:57:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> br1 UP 52:ff:20:57:06:8d <BROADCAST,MULTICAST,UP,LOWER_UP> ra7.1@ra7 UP 52:ff:20:77:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> ra15.1@ra15 UP 52:ff:20:f7:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> nwg0 UNKNOWN <POINTOPOINT,NOARP,UP,LOWER_UP> ra7.2@ra7 UP 52:ff:20:77:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> ra15.2@ra15 UP 52:ff:20:f7:06:8e <BROADCAST,MULTICAST,UP,LOWER_UP> nwg1 UNKNOWN <POINTOPOINT,NOARP,UP,LOWER_UP> vpn0 UNKNOWN <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> eth0 UP 34:4b:50:00:00:00 <BROADCAST,MULTICAST,UP,LOWER_UP> === ADDRESSES === lo UNKNOWN 127.0.0.1/8 ::1/128 tunl0@NONE DOWN ip6tnl0@NONE DOWN sit0@NONE DOWN gre0@NONE DOWN gretap0@NONE DOWN ethoip0@NONE DOWN dummy0 DOWN ezcfg0 DOWN xxxxxxxxxxx/32 2001:2:7847:1251:feee:xxxx:xxxx:xxxx:xxxx:/128 eth2 UP xxxxxxxxxxxxxxx/64 eth3 DOWN xxxxxxxxxxx/24 xfrms1@NONE UNKNOWN xxxxxxxxxxxxxxxxxxxxxxx/64 xfrms2@NONE UNKNOWN xxxxxxxxxxxxxxxxxxx/64 ra0 DOWN ra1 DOWN ra2 DOWN ra3 DOWN ra4 DOWN ra5 DOWN ra6 DOWN ra7 DOWN ra8 DOWN ra9 DOWN ra10 DOWN ra11 DOWN ra12 DOWN ra13 DOWN ra14 DOWN ra15 DOWN apcli0 DOWN apcli1 DOWN dsl_br0 DOWN eth2.1@eth2 UP xxxxxxxxxxxxxxxxxxxxxxxx/64 eth2.2@eth2 UP xxxxxxxxxxxxxxxxxxxxxxx/64 eth2.4@eth2 UP xxxxxxxxxxxxxxxx/22 xxxxxxxxxxxxxxxxxxxx/64 cdc_br0 UP 192.168.22.127/24 xxxxxxxxxxxxxxxxxxx/64 br0 UP 192.168.0.1/24 xxxxxxxxxxxxxxxxxxxx/64 br1 UP 10.1.20.1/24 xxxxxxxxxxxxxxxxxxxxxxx/64 ra7.1@ra7 UP xxxxxxxxxxxxxxxxxxxxx/64 ra15.1@ra15 UP xxxxxxxxxxxxxxxxxxx/64 nwg0 UNKNOWN 172.16.82.1/24 ra7.2@ra7 UP xxxxxxxxxxxxxxxxxxx/64 ra15.2@ra15 UP xxxxxxxxxxxxxxxxxxx/64 nwg1 UNKNOWN 10.40.121.59/32 2010:db0:3::a28:793b/128 vpn0 UNKNOWN 192.168.0.1 peer 172.16.1.33/32 eth0 UP xxxxxxxxxxxxxxxxxxx/64 === DEFAULT MAIN === default via xxxxxxxxxxxxxxxxxxx.1 dev eth2.4 metric 1000 10.1.20.0/24 dev br1 proto kernel scope link src 10.1.20.1 77.88.8.8 via 176.65.44.1 dev eth2.4 metric 1000 xxxxxxxxxxxxxxxxxxx via xxxxxxxxxxxxxxxxxxx dev eth2.4 metric 1000 xxxxxxxxxxxxxxxxxxx/24 dev eth3 proto kernel scope link src xxxxxxxxxxxxxxxxxxx linkdown 172.16.1.33 dev vpn0 proto kernel scope link src 192.168.0.1 172.16.82.0/24 dev nwg0 proto kernel scope link src 172.16.82.1 unreachable 172.16.82.2 proto static scope link metric 1000 xxxxxxxxxxxxxxxxxxx/22 dev eth2.4 proto kernel scope link src xxxxxxxxxxxxxxxxxxx 192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.1 192.168.22.0/24 dev cdc_br0 proto kernel scope link src 192.168.22.127 === DEFAULT ALL === default dev nwg1 table 4096 scope link metric 1000 default via xxxxxxxxxxxxxxxxxxx dev eth2.4 table 4098 metric 1000 default via xxxxxxxxxxxxxxxxxxx dev eth2.4 table 16387 src xxxxxxxxxxxxxxxxxxx metric 1000 default via xxxxxxxxxxxxxxxxxxx dev eth2.4 table 4100 metric 1000 default via 192.168.22.1 dev cdc_br0 table 16393 src 192.168.22.127 metric 1000 default dev nwg1 table 16397 scope link src 10.40.121.59 metric 1000 default via xxxxxxxxxxxxxxxxxxx dev eth2.4 metric 1000 default dev nwg1 table 4096 metric 1000 pref medium default dev nwg1 table 16397 metric 1000 pref medium default dev nwg1 metric 1000 pref medium === TABLE 1001 === 2.56.24.0/22 dev eth2.4 scope link 2.56.88.0/22 dev eth2.4 scope link 2.56.180.0/22 dev eth2.4 scope link === PING eth2.4 === PING 77.88.8.8 (77.88.8.8): 56 data bytes 64 bytes from 77.88.8.8: seq=0 ttl=59 time=63.660 ms 64 bytes from 77.88.8.8: seq=1 ttl=59 time=56.693 ms --- 77.88.8.8 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 56.693/60.176/63.660 ms === NDM === interface-name: GigabitEthernet0 description: connected: yes interface-name: 1 interface-name: 2 interface-name: 3 interface-name: 4 interface-name: 1 interface-name: 2 interface-name: 3 interface-name: 4 interface-name: GigabitEthernet0/Vlan1 description: Home VLAN connected: yes interface-name: GigabitEthernet0/Vlan2 description: connected: yes interface-name: GigabitEthernet0/Vlan4 description: К-телеком connected: yes interface-name: ISP description: Авантел connected: no interface-name: 0 interface-name: 0 interface-name: WifiMaster0 description: connected: no interface-name: AccessPoint description: Wi-Fi access point Edited May 30 by Kservlad Quote
0xkee Posted May 31 Author Posted May 31 16 hours ago, Kservlad said: === INTERFACES === да, похоже ошибка для случая с uplink via eth... (во-первых, не проверялось, это только для "прямого", не PPP-like соединения... обычно это маленькие провы, большие поднимают PPP или аналог ради авторизации, маленькие ставят фильтры по MAC; во-вторых, не очевидная вещь - пока модемные интерфейсы работают фактически как ptp и просто форвардят всё непонятное дальше, классический eth на стороне клиента (linux ярдо кинетика) без явного gw считает что "mail.ru" прямо в eth сегменте, отправляет его прову, а тот, проверив arp, логично дропает, т.к. mail.ru у него в сегменте (с пользователями) точно нет, и таким образом надо инструктировать ядро кинетика не считать таргеты локальными явно указывая gw, а ptp-like ifaces можно отправлять без gw как и прежде... есть длинный ответ от ии-шки, если кому интересно могу выложить) Из-за этого ядро Linux считает, что адреса 2.56.24.X находятся прямо на вашем L2-сегменте, и пытается отправить ARP-запрос за IP-адрес назначения. На Ethernet-провайдерах (в отличие от LTE-модемов) это не работает — провайдер не отвечает на ARP за чужие IP. ## Верификация Чтобы убедиться, что причина именно в этом, сделайте простой тест: **Шаг 1.** На роутере по SSH: ```sh ip route replace 77.88.8.8/32 via 176.65.44.1 dev eth2.4 table 1001 ``` **Шаг 2.** На ПК (Windows) откройте `cmd` и выполните: ``` ping 77.88.8.8 ``` Если пинг прошёл — причина подтверждена на 100%. Маршрутам не хватает gateway. (77.88.8.8 уже есть в table 1001 как часть подсети, но без `via` — мы заменяем на host-route с gateway.) ## Временный workaround (до выхода исправления) ```sh # Определяем gateway: GW=$(ip route show dev eth2.4 | grep "^default" | grep -o 'via [^ ]*' | awk '{print $2}') [ -z "$GW" ] && GW=$(ip route show default dev eth2.4 table all | grep -o 'via [^ ]*' | head -1 | awk '{print $2}') echo "Gateway: $GW" # Перезаливаем таблицу с gateway: ip route flush table 1001 while read -r cidr; do ip route add "$cidr" via "$GW" dev eth2.4 table 1001 2>/dev/null done < /opt/var/cache/geo-split/subnets.txt echo "Done. Routes with gateway:" ip route show table 1001 | head -3 ``` После этого RU-сайты должны заработать. Эффект сохранится до перезагрузки или перезапуска geo-split. (это не batch load - может долго грузить таблицу (пару-тройку минут)) ## Статус исправления Это баг в geo-split — маршруты должны добавляться с `via <gateway>` для Ethernet-провайдеров. Исправление уже в работе, выйдет в следующей версии. (если подтвердится, хотя бы одним ip route replace 77.88.8.8/32 via 176.65.44.1 dev eth2.4 table 1001 + ping OK) Quote
cryoPanda Posted May 31 Posted May 31 (edited) Доброго времени суток! Хочу направить только RU трафик через VPN. Указал ngw0 в ROUTE_OUT, но после перезагрузки все равно в статусе отображается auto или eth3. Подскажите, возможно ли так сделать? geo-split status: Mode: Geo zone: RU Route in: br0 Route out: auto (detect ISP) Active out: eth3 (tables 1000,1001) Конфигурация: ROUTE_OUT="ngw0" ROUTE_IN="br0" Edited May 31 by cryoPanda Quote
0xkee Posted May 31 Author Posted May 31 Доброго времени суток! 7 hours ago, cryoPanda said: Подскажите, возможно ли так сделать? Да, этот штатный (второй) режим, должно работать... Проверьте пожалуйста: 1. **Проверьте имя интерфейса:** на Keenetic это `nwg0`, не `ngw0` 2. **Конфиг должен быть в `config.conf`**, не в `defaults.conf`: ```sh vi /opt/keenetic-entware-extras/geo-split/config/config.conf ``` (!) defaults.conf переписывается при апдейтах vi - любой редактор, mcedit для любителей midc (mc) Содержимое: ```sh ROUTE_OUT="nwg0" ``` или даже без редактора echo "ROUTE_OUT=\"nwg0\"" >> /opt/keenetic-entware-extras/geo-split/config/config.conf 3. **Перезапустить:** `/opt/etc/init.d/S99geo-split restart` 4. **Проверить:** интерфейс `nwg0` должен быть поднят (VPN-подключение активно) ```sh ip link show nwg0 ``` должно быть UP Если не поможет, пожалуйста, запустите диагностический скрипт для сбора инфы на роутере и пришлите вывод: /opt/keenetic-entware-extras/scripts/bug-report.sh что-то можно заменить на *** по желанию Quote
cryoPanda Posted June 1 Posted June 1 7 часов назад, 0xkee сказал: Доброго времени суток! Да, этот штатный (второй) режим, должно работать... Проверьте пожалуйста: 1. **Проверьте имя интерфейса:** на Keenetic это `nwg0`, не `ngw0` 2. **Конфиг должен быть в `config.conf`**, не в `defaults.conf`: ```sh vi /opt/keenetic-entware-extras/geo-split/config/config.conf ``` (!) defaults.conf переписывается при апдейтах vi - любой редактор, mcedit для любителей midc (mc) Содержимое: ```sh ROUTE_OUT="nwg0" ``` или даже без редактора echo "ROUTE_OUT=\"nwg0\"" >> /opt/keenetic-entware-extras/geo-split/config/config.conf 3. **Перезапустить:** `/opt/etc/init.d/S99geo-split restart` 4. **Проверить:** интерфейс `nwg0` должен быть поднят (VPN-подключение активно) ```sh ip link show nwg0 ``` должно быть UP Если не поможет, пожалуйста, запустите диагностический скрипт для сбора инфы на роутере и пришлите вывод: /opt/keenetic-entware-extras/scripts/bug-report.sh что-то можно заменить на *** по желанию Всё получилось, работает хорошо. Спасибо за помощь! Проблемы было 2: 1) Неверное имя интерфейса - ngw0 вместо nwg0 2) Редактировал неправильный конфиг - по изначальной инструкции использовал config.sh вместо config.conf Сейчас есть несколько вопросов: 1) Если хочется временно отключить перенаправление, то можно просто остановить сервисы в таком порядке? ```sh /opt/etc/init.d/S39smartdns-redirect stop /opt/etc/init.d/S38smartdns stop /opt/etc/init.d/S99geo-split stop ``` А при необходимости включить в обратном порядке? 2) Компонент smartdns обязательно использовать или можно ограничиться встроенным в Netcraze интернет-фильтром? Или при использовании geo-split следует совсем отключать интернет-фильтр? 3) WebUI установился, но при подключении к порту 8080 и вводе учетных данных выдает ошибку, что данные неверны. Quote
0xkee Posted June 1 Author Posted June 1 4 hours ago, cryoPanda said: Всё получилось, работает хорошо. Первый отзыв, что работает 👍 4 hours ago, cryoPanda said: 1) Неверное имя интерфейса - ngw0 вместо nwg0 2) Редактировал неправильный конфиг - по изначальной инструкции использовал config.sh вместо config.conf 1. бывает... я выше не сообразил, что белая коробочка с wifi антеннами, sim слотом и навязывающеюся роутером при включении в обычный eth является обычным хостом и ей надо задавать gw... 🤦♂️ 2. это ошибка (артефакт) в доке, поправлю 4 hours ago, cryoPanda said: 1) Если хочется временно отключить перенаправление, то можно просто остановить сервисы в таком порядке? А при необходимости включить в обратном порядке? ### 1. Порядок остановки и запуска сервисов **Почти.** Порядок остановки верный, но порядок запуска нужно скорректировать — geo-split при старте резолвит домены через SmartDNS (вызывает `update-domains.sh` → `dig @localhost -p 6053`). Поэтому SmartDNS должен быть запущен **до** geo-split. **Остановка** (от зависимых к базовым): ```sh # === ОСТАНОВКА === /opt/etc/init.d/S99geo-split stop # 1) снять ip rules и маршруты /opt/etc/init.d/S39smartdns-redirect stop # 2) снять iptables DNAT (DNS) /opt/etc/init.d/S38smartdns stop # 3) остановить SmartDNS ``` **Запуск** (по S-номерам — каждый сервис зависит от предыдущего): ```sh # === ЗАПУСК === /opt/etc/init.d/S38smartdns start # 1) поднять DNS-резолвер /opt/etc/init.d/S39smartdns-redirect start # 2) перехватить LAN DNS → SmartDNS /opt/etc/init.d/S99geo-split start # 3) загрузить подсети + резолв доменов через SmartDNS ``` > **Почему S99 последний при запуске:** `geo-split start` вызывает `update-domains.sh`, который резолвит домены из списка через SmartDNS (порт 6053). Если SmartDNS не запущен — домены отрезолвятся через системный ndnproxy, и CDN-адреса могут быть «не те». **Альтернатива — быстрое отключение только маршрутизации (без DNS):** Если нужно только отключить split-routing, но DNS оставить через SmartDNS: ```sh /opt/etc/init.d/S99geo-split stop # трафик пойдёт обычным путём /opt/etc/init.d/S99geo-split start # вернуть обратно ``` + в webui есть переключалки + в webui есть кнопки refresh или /opt/etc/init.d/S99geo-split update... их можно использовать по необходимости 4 hours ago, cryoPanda said: 2) Компонент smartdns обязательно использовать или можно ограничиться встроенным в Netcraze интернет-фильтром? Или при использовании geo-split следует совсем отключать интернет-фильтр? ### 2. Обязателен ли SmartDNS? Совместимость с интернет-фильтром **SmartDNS + smartdns-redirect НЕ обязательны для работы geo-split.** Они решают разные задачи: | Компонент | Роль | Обязателен? | |-----------|------|-------------| | **geo-split** | Маршрутизация по IP-подсетям (через nwg0) | ✅ Основной | | **smartdns-conf-ru-split** | Конфиг SmartDNS: резолвит RU-домены через РФ DNS | Рекомендуется | | **smartdns-redirect** | iptables DNAT: DNS клиентов → SmartDNS (порт 6053) | Рекомендуется | **Зачем SmartDNS нужен:** Без него geo-split работает **только по IP-подсетям** (CIDR из geo-списков). Многие CDN-домены (vk.com, mail.ru, yandex.ru) отдают разные IP в зависимости от DNS-сервера. Если DNS-резолвер за рубежом — вернёт зарубежный CDN-адрес, и он может не попасть в RU-подсети. SmartDNS решает эту проблему: для RU-доменов запрашивает DNS через РФ-сервер → получает корректный российский IP → geo-split маршрутизирует его правильно. **Насчёт встроенного интернет-фильтра Keenetic:** - Интернет-фильтр (профили защиты, AdGuard DNS, Яндекс.DNS) — это **DNS-фильтрация контента** (блокировка порно, рекламы и т.д.) - SmartDNS — это **split-resolving** (разные DNS-серверы для разных доменов) - Это **разные функции**, они не взаимозаменяемы **Рекомендация:** | Сценарий | Рекомендация | |----------|-------------| | Нужен только split-routing по подсетям | geo-split достаточно | | Нужен надёжный доступ к RU-сайтам через CDN | geo-split + SmartDNS + redirect | | Используете интернет-фильтр Keenetic для детей | Можно оставить, но `PRESERVE_FILTER_PROFILES` пока не реализован — дети получат нефильтрованный DNS через SmartDNS | **Если нужен и фильтр, и split-routing:** Пока `PRESERVE_FILTER_PROFILES` не реализован, есть обходной путь — в `smartdns-redirect` config указать `INTERFACES="br0"` — это перенаправит DNS **только с основного LAN**. Если детские устройства на отдельном VLAN (br1/Guest), их DNS не тронется. + надо уточнить, что технически это ответ верный для случая направления какой-то гео зоны в туннель 4 hours ago, cryoPanda said: 3) WebUI установился, но при подключении к порту 8080 и вводе учетных данных выдает ошибку, что данные неверны. ### 3. WebUI: ошибка авторизации на порту 8080 WebUI на порту 8080 — это **reverse proxy** к штатному Keenetic WebUI (порт 80). Авторизация работает через стандартный механизм Keenetic (`x-ndw2-interactive` challenge-response). Авторизация работает напрямую на порту 8080 — при первом заходе появится стандартная форма логина Keenetic. Учётные данные — те же, что для штатного WebUI (обычно `admin` + ваш пароль). > **Подсказка:** Если сначала зайти на штатный WebUI (`http://<ip>:80`) и залогиниться там, то на порту 8080 авторизацию спрашивать не будет — сессионная cookie (RFC 6265) шарится между портами одного IP. **Возможные причины ошибки «неверные данные»:** 1. **Несоответствие realm** — пароль в Keenetic хешируется вместе с realm (имя устройства). Если роутер был переименован после создания пароля, может быть рассогласование. Попробуйте сбросить пароль admin через штатный UI. 2. **listen.conf не сгенерирован** — nginx не может корректно проксировать auth. 3. **Штатный httpd на порту 80 недоступен с 127.0.0.1** — наш nginx проксирует `/auth` на `127.0.0.1:80`. **Диагностика:** ```sh # На роутере: проверить что nginx-webui запущен /opt/etc/init.d/S80nginx-webui status # Проверить что штатный UI доступен локально curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:80/ # Проверить listen.conf (должен содержать LAN IP) cat /opt/keenetic-entware-extras/webui/config/listen.conf # Полная диагностика /opt/keenetic-entware-extras/webui/scripts/status.sh ``` **Если `listen.conf` пустой или содержит неверный IP:** ```sh # Пересоздать (подставьте IP роутера в LAN) echo 'listen 192.168.1.1:8080;' > /opt/keenetic-entware-extras/webui/config/listen.conf /opt/etc/init.d/S80nginx-webui restart ``` Quote
cryoPanda Posted June 1 Posted June 1 2 часа назад, 0xkee сказал: Первый отзыв, что работает 👍 1. бывает... я выше не сообразил, что белая коробочка с wifi антеннами, sim слотом и навязывающеюся роутером при включении в обычный eth является обычным хостом и ей надо задавать gw... 🤦♂️ 2. это ошибка (артефакт) в доке, поправлю ### 1. Порядок остановки и запуска сервисов **Почти.** Порядок остановки верный, но порядок запуска нужно скорректировать — geo-split при старте резолвит домены через SmartDNS (вызывает `update-domains.sh` → `dig @localhost -p 6053`). Поэтому SmartDNS должен быть запущен **до** geo-split. **Остановка** (от зависимых к базовым): ```sh # === ОСТАНОВКА === /opt/etc/init.d/S99geo-split stop # 1) снять ip rules и маршруты /opt/etc/init.d/S39smartdns-redirect stop # 2) снять iptables DNAT (DNS) /opt/etc/init.d/S38smartdns stop # 3) остановить SmartDNS ``` **Запуск** (по S-номерам — каждый сервис зависит от предыдущего): ```sh # === ЗАПУСК === /opt/etc/init.d/S38smartdns start # 1) поднять DNS-резолвер /opt/etc/init.d/S39smartdns-redirect start # 2) перехватить LAN DNS → SmartDNS /opt/etc/init.d/S99geo-split start # 3) загрузить подсети + резолв доменов через SmartDNS ``` > **Почему S99 последний при запуске:** `geo-split start` вызывает `update-domains.sh`, который резолвит домены из списка через SmartDNS (порт 6053). Если SmartDNS не запущен — домены отрезолвятся через системный ndnproxy, и CDN-адреса могут быть «не те». **Альтернатива — быстрое отключение только маршрутизации (без DNS):** Если нужно только отключить split-routing, но DNS оставить через SmartDNS: ```sh /opt/etc/init.d/S99geo-split stop # трафик пойдёт обычным путём /opt/etc/init.d/S99geo-split start # вернуть обратно ``` + в webui есть переключалки + в webui есть кнопки refresh или /opt/etc/init.d/S99geo-split update... их можно использовать по необходимости ### 2. Обязателен ли SmartDNS? Совместимость с интернет-фильтром **SmartDNS + smartdns-redirect НЕ обязательны для работы geo-split.** Они решают разные задачи: | Компонент | Роль | Обязателен? | |-----------|------|-------------| | **geo-split** | Маршрутизация по IP-подсетям (через nwg0) | ✅ Основной | | **smartdns-conf-ru-split** | Конфиг SmartDNS: резолвит RU-домены через РФ DNS | Рекомендуется | | **smartdns-redirect** | iptables DNAT: DNS клиентов → SmartDNS (порт 6053) | Рекомендуется | **Зачем SmartDNS нужен:** Без него geo-split работает **только по IP-подсетям** (CIDR из geo-списков). Многие CDN-домены (vk.com, mail.ru, yandex.ru) отдают разные IP в зависимости от DNS-сервера. Если DNS-резолвер за рубежом — вернёт зарубежный CDN-адрес, и он может не попасть в RU-подсети. SmartDNS решает эту проблему: для RU-доменов запрашивает DNS через РФ-сервер → получает корректный российский IP → geo-split маршрутизирует его правильно. **Насчёт встроенного интернет-фильтра Keenetic:** - Интернет-фильтр (профили защиты, AdGuard DNS, Яндекс.DNS) — это **DNS-фильтрация контента** (блокировка порно, рекламы и т.д.) - SmartDNS — это **split-resolving** (разные DNS-серверы для разных доменов) - Это **разные функции**, они не взаимозаменяемы **Рекомендация:** | Сценарий | Рекомендация | |----------|-------------| | Нужен только split-routing по подсетям | geo-split достаточно | | Нужен надёжный доступ к RU-сайтам через CDN | geo-split + SmartDNS + redirect | | Используете интернет-фильтр Keenetic для детей | Можно оставить, но `PRESERVE_FILTER_PROFILES` пока не реализован — дети получат нефильтрованный DNS через SmartDNS | **Если нужен и фильтр, и split-routing:** Пока `PRESERVE_FILTER_PROFILES` не реализован, есть обходной путь — в `smartdns-redirect` config указать `INTERFACES="br0"` — это перенаправит DNS **только с основного LAN**. Если детские устройства на отдельном VLAN (br1/Guest), их DNS не тронется. + надо уточнить, что технически это ответ верный для случая направления какой-то гео зоны в туннель ### 3. WebUI: ошибка авторизации на порту 8080 WebUI на порту 8080 — это **reverse proxy** к штатному Keenetic WebUI (порт 80). Авторизация работает через стандартный механизм Keenetic (`x-ndw2-interactive` challenge-response). Авторизация работает напрямую на порту 8080 — при первом заходе появится стандартная форма логина Keenetic. Учётные данные — те же, что для штатного WebUI (обычно `admin` + ваш пароль). > **Подсказка:** Если сначала зайти на штатный WebUI (`http://<ip>:80`) и залогиниться там, то на порту 8080 авторизацию спрашивать не будет — сессионная cookie (RFC 6265) шарится между портами одного IP. **Возможные причины ошибки «неверные данные»:** 1. **Несоответствие realm** — пароль в Keenetic хешируется вместе с realm (имя устройства). Если роутер был переименован после создания пароля, может быть рассогласование. Попробуйте сбросить пароль admin через штатный UI. 2. **listen.conf не сгенерирован** — nginx не может корректно проксировать auth. 3. **Штатный httpd на порту 80 недоступен с 127.0.0.1** — наш nginx проксирует `/auth` на `127.0.0.1:80`. **Диагностика:** ```sh # На роутере: проверить что nginx-webui запущен /opt/etc/init.d/S80nginx-webui status # Проверить что штатный UI доступен локально curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:80/ # Проверить listen.conf (должен содержать LAN IP) cat /opt/keenetic-entware-extras/webui/config/listen.conf # Полная диагностика /opt/keenetic-entware-extras/webui/scripts/status.sh ``` **Если `listen.conf` пустой или содержит неверный IP:** ```sh # Пересоздать (подставьте IP роутера в LAN) echo 'listen 192.168.1.1:8080;' > /opt/keenetic-entware-extras/webui/config/listen.conf /opt/etc/init.d/S80nginx-webui restart ``` Спасибо за ответ, теперь стало понятнее! Теперь, по поводу webui. Вывод status.sh: nginx-webui status: Service: Process: running (pid 1270 via pidfile, RSS 3472kB) ✓ Config: /opt/keenetic-entware-extras/webui/scripts/../config/nginx.conf ✓ Listen conf: /opt/keenetic-entware-extras/webui/scripts/../config/listen.conf ✓ Lua module: /opt/lib/nginx/modules/ngx_http_lua_module.so ✓ Ports: 127.0.0.1:8080 ✓ 192.168.10.1:8080 ✓ HTTP: Static: GET / → 200 ✓ API: GET /api/system/info → 200 ✓ Logrotate: Binary: /opt/sbin/logrotate ✓ Config: /opt/etc/logrotate.d/nginx-webui ✓ Cron daily: /opt/etc/cron.daily/logrotate ✓ System: Uptime: 7m 55s ✓ Version: 0.9.0 В listen.conf адрес корректный: listen 192.168.10.1:8080; А вот при проверке доступа через curl выдает 403: curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:80/ 403 Quote
cryoPanda Posted June 1 Posted June 1 5 часов назад, 0xkee сказал: === ОСТАНОВКА === /opt/etc/init.d/S99geo-split stop # 1) снять ip rules и маршруты /opt/etc/init.d/S39smartdns-redirect stop # 2) снять iptables DNAT (DNS) /opt/etc/init.d/S38smartdns stop # 3) остановить SmartDNS ``` Ещё обнаружил по логам, что похоже cron мешает и снова запускает указанные сервисы. Там тоже что-то нужно модифицировать? Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.