Перейти к содержанию

Рекомендуемые сообщения

Опубликовано (изменено)

Всем привет!

Делюсь проектом для Keenetic-роутеров с Entware.

Это проект для раздельной geo-маршрутизации трафика на Keenetic-роутерах с Entware.

Проект состоит из нескольких opkg-пакетов. По сути это набор shell-скриптов, которые автоматизируют типовые задачи — всё это можно сделать вручную, но тогда потребуется постоянное сопровождение при изменении конфигурации сети.

Проект перенесён на GitHub.

(первая версия - могут быть неточности)
Старые пакеты оставлены здесь на какое-то время на случай необходимости.

 

Справочно, изменения за последний месяц
(основное - добавлены 2 опции более точной настройки DNS (`DNS_TRANSPORT`, `REDIRECT_MODE`).
 

Spoiler

# Дайджест обновлений keenetic-entware-extras (после 28.07.2026)

 

Текущие версии пакетов: `keenetic-entware-extras` 0.16.17, `webui` 0.37.6, `geo-split` 0.18.5, `smartdns-geo-conf` 0.14.2, `smartdns-redirect` 0.6.3, `net-check` 0.2.12, `geo-split-data` 0.6.1.

 

---

 

### 🖥 WebUI (0.34.0 → 0.37.6)

 

**Новое:**

- **Температура CPU** в шапке дашборда — между загрузкой CPU и RAM. Автоопределение термозоны SoC, пороги из даташитов (MT7621/MT7628/MT7622/MT7986/Qualcomm IPQ). Скрывается, если термодатчик отсутствует.

- **Поддержка KeeneticOS 5.2.5 Alpha** — новый патч-сет v5 (`Lo` enum, KN-3811 mipsel).

- **Поддержка KeeneticOS 5.1.4 aarch64** (NC-4110) — добавлен хеш `AA018C6` в v4 патч.

- **Config editor:** новые параметры — DNS Transport (auto/strict) для SmartDNS, Redirect Mode (force/local) для DNS Redirect.

- **DNS Check:** отдельная диаграмма "System DNS :53" когда SmartDNS не запущен (вместо пустых веток маршрутизации зон).

 

**Улучшения:**

- **Готовые .gz файлы в пакете** — статика (JS/CSS/HTML) сжимается при сборке, а не при каждом старте nginx на роутере. Ускорение запуска на MIPS.

- **Кеш перенесён с /tmp на /opt** — копируются только бандл-файлы (~6.5 МБ вместо ~10.5 МБ), остальные ассеты раздаются напрямую с flash через nginx `@stock` fallback.

- **Модульность кода:** Lua API разбит на 4 модуля (api-utils/system/config/data), JS разделён на отдельные файлы (detail-render, diag-render, config-form, inject-dashboard). Нет изменений API.

 

**Исправления:**

- WISP: `apcli0` получает корректное описание вместо `wwan0` (LTE-модем).

- Бейджи состояния: warn-only проверки (например, `subnet_freshness: "warn"`) теперь корректно показывают оранжевый бейдж.

- Детализация Rules: компактный формат `br0: v4+v6 DNS/DoT`, v4/v6 на отдельных строках.

 

---

 

### 🌍 geo-split (0.18.0 → 0.18.5)

 

- **`REFRESH_NICE_ADJUST`** — понижение приоритета CPU для фоновых обновлений подсетей/доменов (по умолчанию `nice +10`).

- **Обнаружение standby-туннелей** — `wan-paths.sh` теперь видит резервные туннели через source-based routing tables (ранее невидимы при failover).

- **DNS port:** route-check теперь использует единый `detect_dns_port()`, с fallback на SmartDNS main `:6053`.

 

---

 

### 🔒 smartdns-geo-conf (0.11.3 → 0.14.2)

 

**Новое:**

- **`DNS_TRANSPORT`** — политика шифрования DNS: `auto` (по умолчанию, DoT/DoH + UDP fallback) или `strict` (только DoT/DoH, без plain UDP). Для использования за рубежом, где ISP может перехватывать DNS.

- **ECH (Encrypted Client Hello) разблокирован** — убрана директива `force-qtype-SOA 65`, блокировавшая HTTPS/SVCB DNS-записи. Браузеры теперь получают ECH-параметры и шифруют SNI.

- **DNS source indicator** в `dns-check.sh` — поле `dns_source` (system/smartdns) + `dns_port`, чтобы отличить фолбек на системный резолвер от маршрутизации через SmartDNS.

 

**Исправления:**

- **Туннельные интерфейсы без прямого fallback:** когда `OTHER_DNS_INTERFACES` указывает на туннель, plain UDP fallback не генерируется (ранее — потенциальная утечка приватности).

- **status.sh:** корректная проверка провайдеров через SmartDNS вместо прямого `dig @IP` (ложные ошибки на 4G/LTE).

- **Удалён мёртвый код** `smartdns-default.conf`.

 

---

 

### 🔀 smartdns-redirect (0.4.3 → 0.6.3)

 

**Новое:**

- **`REDIRECT_MODE`** — `force` (по умолчанию, перехват всего DNS :53 + блокировка DoT :853) или `local` (перехват только DNS к IP роутера, внешний DNS проходит свободно). Для IoT-устройств и корпоративных ноутбуков с hardcoded DNS.

- **Блокировка DoT (port 853)** в режиме `force` — iptables FORWARD REJECT для IPv4+IPv6. Предотвращает обход SmartDNS через прямой DoT к 8.8.8.8:853, 1.1.1.1:853 и т.д.

- **Watchdog cron** в status-выводе.

 

**Исправления:**

- **`disable` полностью очищает:** NDM-хук и cron-задача watchdog удаляются. Ранее оставались стале хук и активный cron.

- Убран параметр `ENABLE_IPV6` из WebUI (IPv6 полностью автоматический с 0.4.0).

 

---

 

### 🔍 net-check (0.0.2 → 0.2.12) — крупное обновление

 

**Новое:**

- **Гранулярная TLS-классификация** — различает «Недоверенный CA» (национальные CA), «Сертификат истёк», «Отозван», «Hostname mismatch» вместо общего "MITM detected". База известных национальных CA (Россия, Казахстан, Китай, Турция и др.).

- **Интернационализация** — `check-targets.conf` расширен до 40+ стран, `cdn-domains.conf` — 12+ стран. Runtime-фильтрация по зоне (`CHECK_ZONE=auto`), кастомные конфиги в `*-custom.conf`.

- **Обогащённый status dashboard** — внешний IP, код страны, тип туннеля (wireguard/openvpn/gre), DNS leak с именем провайдера, проверка IPv6 утечки.

- **Privacy filter** — маскировка публичных IP, ASN, IPv6 в bug-report (по умолчанию).

- **Пользовательская документация** — полное руководство на русском.

 

**Производительность:**

- **GeoIP pre-warm** — пакетная геолокация всех IP перед рендерингом (вместо ~160 последовательных HTTP-запросов).

- **Fork/exec оптимизация** — ~3800 fork-вызовов устранено при рендеринге таблиц (shell arithmetic вместо подпроцессов).

- **Streaming output** — таблицы выводятся построчно в реальном времени (вместо буферизации + spinner).

 

**Рефакторинг кода:**

- Массивная декомпозиция: 5 крупнейших команд разбиты на setup→collect→render фазы, библиотеки разделены (colors.sh, table.sh, sections.sh, verdict.sh, batch.sh, zone.sh). Нулевые изменения поведения.

 

---

 

### 📦 Базовый пакет (0.16.14 → 0.16.17)

 

- **Shared privacy filter** `lib/privacy.sh` — маскировка IPv4, ASN, IPv6. Используется в `bug-report.sh` и `net-check --privacy`.

- **Цветной status** — ✓/✗/⚠ маркеры, жирные заголовки секций, `--color`/`--no-color` флаг во всех status-скриптах.

 

---

 

Все пакеты обновляются стандартно через `opkg upgrade`.

 



📦 **GitHub**: https://github.com/0xkee/keenetic-entware-extras

📖 **Руководство пользователя**: [user-manual.ru.md](https://github.com/0xkee/keenetic-entware-extras/blob/master/user-manual.ru.md)

 

---

 

## Что внутри

Spoiler


### 🌍 geo-split — маршрутизация по GeoIP и доменам

 

 

Автоматическое разделение трафика по GeoIP-подсетям и спискам доменов.

 

- **VPN split** — весь трафик через VPN, а региональный (RU, ЕАЭС, BRICS…) — через провайдера напрямую

- **Обратный split** — всё через ISP, выбранные домены/подсети — через туннель

- **Multi-WAN** — направить часть трафика через LTE, второй ISP и т.д.

- 240 стран + 40 региональных союзов (EAEU, BRICS, EU, ASEAN…)

- Автоматический failover при падении/подъёме VPN (NDM-хук)

- CIDR-агрегация: ~13K подсетей → ~8.5K маршрутов

- Работает через `ip rule` / `ip route` (не iptables) — полная совместимость с per-device routing Keenetic

 

📖 [README](https://github.com/0xkee/keenetic-entware-extras/blob/master/geo-split/README.md) · [Руководство](https://github.com/0xkee/keenetic-entware-extras/blob/master/geo-split/docs/user-manual.ru.md) · [Changelog](https://github.com/0xkee/keenetic-entware-extras/blob/master/geo-split/CHANGELOG.md)

 

### 🔗 smartdns-geo-conf — Smart DNS по регионам

 

DNS-запросы для региональных доменов (.ru, .рф, .by…) идут к ближайшим DNS (Yandex, AdGuard), остальное — к международным (Google, Cloudflare) через шифрованные каналы. Результат: быстрые ответы для локальных сайтов, надёжный DNS для всего остального.

 

- 15 DNS-провайдеров с мультиселектом

- Настраиваемые гео-зоны (одна страна или союз)

- Привязка DNS к туннельному интерфейсу (защита от MITM)

 

📖 [README](https://github.com/0xkee/keenetic-entware-extras/blob/master/smartdns-geo-conf/README.md) · [Руководство](https://github.com/0xkee/keenetic-entware-extras/blob/master/smartdns-geo-conf/docs/user-manual.ru.md) · [Changelog](https://github.com/0xkee/keenetic-entware-extras/blob/master/smartdns-geo-conf/CHANGELOG.md)

 

### smartdns-redirect — быстрый DNS для всех устройств

 

Перехватывает DNS-запросы клиентов LAN и отправляет их напрямую в локальный резолвер (SmartDNS, AdGuard Home, Unbound) — вместо прохождения через Keenetic ndnproxy. DNS самого роутера не затрагивается.

 

- Замеренное улучшение: ~130 мс → <80 мс

- Переживает flush iptables от Keenetic (netfilter.d хук)

- Блокирует DNS-over-TLS утечки от клиентов

- Поддержка IPv6 (DNAT или REJECT с Happy Eyeballs fallback)

 

📖 [README](https://github.com/0xkee/keenetic-entware-extras/blob/master/smartdns-redirect/README.md) · [Руководство](https://github.com/0xkee/keenetic-entware-extras/blob/master/smartdns-redirect/docs/user-manual.ru.md) · [Changelog](https://github.com/0xkee/keenetic-entware-extras/blob/master/smartdns-redirect/CHANGELOG.md)

 

### 🔍 net-check — сетевая диагностика

 

Одной командой проверить: куда идёт трафик? Настоящие ли DNS-ответы? Никто не подменяет сертификаты? Сравнение по интерфейсам, приватный режим для безопасного обмена выводом.

 

- 9 модулей: GeoIP egress, connectivity, IPv6 leak, DNS resolution, DNS leak, HTTP reachability, CDN geo-steering, TLS MITM, speed

- Глубокая проверка ресурса: `net-check.sh check youtube.com`

- JSON-вывод для автоматизации

 

📖 [README](https://github.com/0xkee/keenetic-entware-extras/blob/master/net-check/README.md) · [Руководство](https://github.com/0xkee/keenetic-entware-extras/blob/master/net-check/docs/user-manual.ru.md) · [Changelog](https://github.com/0xkee/keenetic-entware-extras/blob/master/net-check/CHANGELOG.md)

 

### 📊 webui — веб-панель

 

Дашборд на порту `:8080` со статусом всех сервисов. Редактор конфигов с валидацией, выбор зон/провайдеров, переключатели. Интегрируется в штатный WebUI Keenetic — добавляет карточку Entware Extras и ссылку в боковом меню.

 

- Schema-driven редактор конфигов для всех пакетов

- Status API с shared-memory кэшем (низкий CPU даже с несколькими вкладками)

- Авто-патч stock Keenetic UI (KeeneticOS 5.0–5.2)

- Системная информация: CPU, RAM, диск, uptime

 

📖 [README](https://github.com/0xkee/keenetic-entware-extras/blob/master/webui/README.md) · [Руководство](https://github.com/0xkee/keenetic-entware-extras/blob/master/webui/docs/user-manual.ru.md) · [Changelog](https://github.com/0xkee/keenetic-entware-extras/blob/master/webui/CHANGELOG.md)

 

### 📦 keenetic-entware-extras — базовый пакет

 

Общие shell-библиотеки и CLI-утилита `kee-status`. **Обязателен** для работы всех остальных пакетов — устанавливается автоматически как зависимость.

 

📖 [README](https://github.com/0xkee/keenetic-entware-extras/blob/master/README.md) · [Руководство](https://github.com/0xkee/keenetic-entware-extras/blob/master/user-manual.ru.md) · [Changelog](https://github.com/0xkee/keenetic-entware-extras/blob/master/CHANGELOG.md)

 

---

 

## Список поддерживаемых интерфейсов

Spoiler

[Полная таблица интерфейсов Keenetic](https://github.com/0xkee/keenetic-entware-extras/blob/master/keenetic-interfaces.md) — WireGuard (`nwg*`), AmneziaWG (`awg*`), OpenVPN (`ovpn*`), L2TP, PPTP, SSTP, IPsec, GRE, LTE-модемы, PPPoE, Ethernet WAN, WISP и др.

 

---

 

## Требования

Spoiler

- Keenetic с установленным **Entware** — [инструкция](https://help.keenetic.com/hc/ru/articles/360021214160)

- **KeeneticOS ≥ 5.0**

- Настроенное второе подключение: VPN-туннель (WireGuard, OpenVPN, L2TP, PPTP, SSTP) или дополнительный WAN (LTE, второй ISP)

- Все зависимости (`ip-full`, `curl`, `bind-dig` и т.д.) устанавливаются **автоматически** через opkg

 

Компоненты прошивки (*Общие настройки → Изменить набор компонентов*):

- **OPKG** (Поддержка пакетов OPKG) — обязателен

- **Драйвер ФС** USB-накопителя (Ext4 или ExFAT)

- «Модули ядра подсистемы Netfilter» — **не требуется** (geo-split работает через policy routing)

 

---

 

## Установка

Spoiler

### Быстрая (рекомендуется)

 

Одна команда — настраивает opkg-фид, устанавливает HTTPS-поддержку и предлагает меню выбора пакетов:

curl -fsSL https://raw.githubusercontent.com/0xkee/keenetic-entware-extras/master/scripts/install.sh | sh

 

Установить конкретные пакеты:

curl -fsSL https://raw.githubusercontent.com/0xkee/keenetic-entware-extras/master/scripts/install.sh | sh -s -- geo-split webui

 

 

Установить все:

curl -fsSL https://raw.githubusercontent.com/0xkee/keenetic-entware-extras/master/scripts/install.sh | sh -s -- --all

 

### Ручная

# Добавить opkg-фид

cat >> /opt/etc/opkg.conf << 'EOF'

src/gz kee https://0xkee.github.io/keenetic-entware-extras/stable

EOF

opkg update



# Установить (зависимости разрешатся автоматически)

opkg install geo-split smartdns-geo-conf smartdns-redirect net-check webui

 

Доступны два канала:

- **stable** (рекомендуемый) — протестированные релизы

- **dev** — последние сборки

 

Подробнее: [документация репозитория](https://github.com/0xkee/keenetic-entware-extras/blob/master/releases/README.md)

 

---

 

## Настройка

Spoiler

Минимально — задать `ROUTE_OUT` в конфиге geo-split:

vi /opt/keenetic-entware-extras/geo-split/config/config.conf

 

| Значение | Что делает |

|----------|-----------|

| `"auto"` | Автоопределение ISP-интерфейса. **Подходит большинству.** |

| `"nwg0"` | Через WireGuard |

| `"ovpn0"` | Через OpenVPN |

| `"awg0"` | Через AmneziaWG |

 

> Или настройте через WebUI: `http://<router-ip>:8080` → geo-split → ⚙️ Config

 

Подробная настройка каждого пакета — в руководствах пользователя (ссылки выше).

 

---

 

## Диагностика

Spoiler
kee-status # агрегированный статус всех сервисов

kee-status -d # подробный — полный статус каждого пакета

 

Пример вывода geo-split 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 ✓



System:

Cron: 1 job(s) ✓

NDM hook: geo-split-hook ✓

DNS: localhost:6153 (SmartDNS)

Version: 0.18.6

 

 

---

 

## Обновление

Spoiler

Перезапустите скрипт установки — он определит уже установленные пакеты и обновит их:

curl -fsSL https://raw.githubusercontent.com/0xkee/keenetic-entware-extras/master/scripts/install.sh | sh

 

Или через opkg:

opkg update && opkg upgrade

 

 

---

 

## Удаление

Spoiler

Одна команда — удаляет все пакеты и opkg-фид:

curl -fsSL https://raw.githubusercontent.com/0xkee/keenetic-entware-extras/master/scripts/install.sh | sh -s -- --uninstall

 

Пакеты удаляют свои файлы, ip rules, cron-задачи и NDM-хуки автоматически.

 

---

 

## Текущие версии

Spoiler

| Пакет | Версия |

|-------|--------|

| keenetic-entware-extras | 0.18.0 |

| geo-split | 0.18.6 |

| geo-split-data | 0.6.2 |

| smartdns-geo-conf | 0.14.3 |

| smartdns-redirect | 0.6.4 |

| net-check | 0.2.13 |

| webui | 0.37.7 |

 

Все пакеты `Architecture: all` — подходят для любой архитектуры Keenetic (mipsel, aarch64).

 

---

 

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

Spoiler

- **KeeneticOS ≥ 5.0** — прошивки 2.x / 3.x не поддерживаются

- **Только IPv4** — IPv6-трафик проходит по стандартным маршрутам

- **Требует Entware** — без него не работает

- **Домены обновляются по cron** (по умолчанию раз в час), а не мгновенно при DNS-запросе

- **Policy routing** — geo-split работает через `ip rule`/`ip route`, а не через iptables/fwmark. С fwmark-решениями мирно сосуществует, но маршруты не суммируются

 

---

 

## Обратная связь

Spoiler

Приветствуются:

- 🐛 Баг-репорты — [GitHub Issues](https://github.com/0xkee/keenetic-entware-extras/issues) или в этой теме

- 💡 Предложения по фичам

- Вопросы по настройке

 

**При проблемах:**

1. Опишите ситуацию: что делали, что ожидали, что получили

2. Приложите вывод диагностики (под спойлер):

/opt/keenetic-entware-extras/scripts/bug-report.sh

 

Скрипт собирает версии, статус сервисов, проверки DNS и маршрутов, хвосты логов. **Без паролей, ключей или внешних IP** — безопасно постить на форуме.

 

---

 

Лицензия: [MIT](https://github.com/0xkee/keenetic-entware-extras/blob/master/LICENSE)

 


Архив.

Spoiler

Всем привет!

Это проект для раздельной 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
br0br1 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-28/2:

В smartdns-geo-conf добавлена поддержка ECH. v0.11.3+

2026-07-28:

Изменения с 13 июля 2026 по всем пакетам
🆕 net-check — новый пакет (v0.0.1, 21 июля) *пока только CLI версия*
Новый инструмент комплексной диагностики сети прямо с роутера. 11 подкоманд:

  • all — полный тест (9 шагов)
  • geo — проверка GeoIP по каждому WAN-интерфейсу
  • conn — ping, TCP :443, traceroute, потери, MTU, тайминги
  • dns — резолюция, геолокация, обнаружение блокировок ISP (NXDOMAIN/bogon)
  • dns-leak — тест на DNS-утечку через зондирование субдомена
  • comp — матрица HTTP-доступности по WAN-интерфейсам с TTFB и историческим diff
  • cdn — анализ CDN steering через EDNS Client Subnet
  • tls — сравнение TLS-сертификатов по путям, обнаружение MITM-прокси
  • speed — замер скорости через Cloudflare
  • ipv6 — обнаружение IPv6-трафика мимо тоннеля
  • check — глубокая проверка домена (HTTP + DNS + TLS + CDN)

Поддержка multi-WAN, privacy-режима (--privacy), JSON-вывода, цветного/монохромного режима, exit-кодов. Адаптивный параллелизм с nice для снижения нагрузки на роутер.

📦 smartdns-redirect (v0.4.0–0.4.3, 27–28 июля)
Главное: автоматическая защита от IPv6 DNS-утечек

  • Больше не нужна ручная настройка ENABLE_IPV6. Режим определяется автоматически:
  1. DNAT: если SmartDNS слушает IPv6 и на br0 есть глобальный IPv6 → ip6tables DNAT к SmartDNS
  2. REJECT: иначе → мгновенный icmp6-port-unreachable (браузер падает на IPv4 DNAT)
  • status.sh: поле ipv6 теперь показывает dnat / reject / none (было yes/no)
  • Watchdog и netfilter-hook теперь не восстанавливают правила при намеренном отключении SmartDNS (проверка наличия S38)
  • Исправлен статус в JSON при отключённом родителе (smartdns-geo-conf): было ложное 🔴 "Failed", стало корректное enabled: false

📦 smartdns-geo-conf (v0.10.12–0.11.2, 21–28 июля)
Главное: строгий тоннельный режим + полное отключение

  • ZONE_DNS_STRICT и OTHER_DNS_STRICT (новые опции): если "yes" — прямые DNS-серверы не генерируются. DNS падает, если все тоннели упали. Для тех, кому приватность важнее доступности.
  • S37smartdns-conf disable теперь полностью останавливает SmartDNS (переименовывает S38), останавливает smartdns-redirect. DNS возвращается к системному ndnproxy. enable — восстанавливает всё.
  • Автоматическое добавление IPv6 bind-адресов SmartDNS (do_bind_addrs()) — необходимо для работы IPv6 DNAT в smartdns-redirect
  • Исправлен конфликт при установке рядом с upstream-пакетом smartdns (ошибка check_data_file_clashes; сообщил nikolay1980)
  • Исправлен ложный статус в WebUI при отключённом сервисе (phantom uptime из stale pidfile, raw ошибки dig в JSON)
  • Добавлена команда flush-cache в init-скрипте

📦 webui (v0.34.0–0.35.1, 22–27 июля)

  • Конфиг SmartDNS: добавлены тогглы ZONE_DNS_STRICT / OTHER_DNS_STRICT; убран ENABLE_IPV6 (автоматический режим)
  • Кэш патченного UI перенесён с /tmp на /opt (webui/htdocs-cache/). Копируются только bundle-файлы (~6.5 MB вместо ~10.5 MB). Непатченные ресурсы раздаются напрямую из flash через nginx fallback — экономия ~4 MB I/O при каждом старте
  • Исправлен значок состояния карточки на кастомном дашборде (warn-только проверки теперь правильно показывают caution badge)

📦 geo-split (v0.18.0, 28 июля)

  • Новая конфигурационная опция REFRESH_NICE_ADJUST (по умолчанию 10) — снижает приоритет CPU для периодических задач обновления подсетей и доменов. Установите 0 для обычного приоритета.

🔧 keenetic-entware-extras — базовый пакет (v0.16.10–0.16.14, 27–28 июля)

  • detect_router_ip6(): автоматическое определение глобального IPv6-адреса на br0 (используется smartdns-redirect для IPv6 DNAT)
  • Исправление IPv6 в статусе портов: адреса типа fdce:...:d24c:6053 теперь корректно отображаются как [fdce:...:d24c]:6053 (RFC 3986)
  • is_ipv4(): теперь валидирует каждый октет 0–255 (999.999.999.999 больше не считается валидным)
  • detect_out_iface(): исправлено — туннельные интерфейсы (sit*, gre*, vti*, ip6tnl*, xfrm*) теперь корректно исключаются
  • bug-report.sh: полная переработка сбора диагностики
  • Оптимизация log(): убран $(basename) subshell-форк на каждый вызов

 

Замечания и предложения по улучшению как всегда приветствуются!


История изменений:

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

image.thumb.png.c4111c0d5adb2fe156e2dfb256a325d8.png

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_INTERFACEOTHER_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)
  • Fixdetect_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_detailstatus_check_resultstatus_emit_json)
  • lib/status.sh: декларативный text-output API (status_linestatus_sectionstatus_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.18.0_all.ipk keenetic-entware-extras_0.16.13_all.ipk net-check_0.0.1_all.ipk smartdns-redirect_0.4.3_all.ipk webui_0.35.1_all.ipk

smartdns-geo-conf_0.11.3_all.ipk

Изменено пользователем 0xkee
update
  • 2 недели спустя...
  • Ответов 115
  • Создана
  • Последний ответ

Топ авторов темы

Опубликовано

Привет!
Спасибо за работу и проект!
Я столкнулся с тем что при настройке решения RU сайты вообще перестают открываться. Пробовал c помощью ИИ. Думаю что может быть связано с политиками маршрутизации на самом роутере. 
Может у тебя есть совет как должна быть настроена эта секция?

Screenshot 2026-04-30 at 12.00.08.png

Screenshot 2026-04-30 at 11.59.55.png

Опубликовано (изменено)
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+).
 
---
 
*Скинь вывод диагностических команд — разберёмся точнее.*

 

Изменено пользователем 0xkee
  • 4 недели спустя...
Опубликовано

Спасибо за проект! Поставил на Viva (KN-1910), но не тянет. Зависает. Есть рекомендации по железу?

 

Опубликовано (изменено)
On 5/24/2026 at 4:05 PM, Kservlad said:

Спасибо за проект! Поставил на Viva (KN-1910), но не тянет. Зависает. Есть рекомендации по железу?

 

Добрый день.
На Hero 4G (KN-2310) тянет без проблем, железо идентичное, должно работать и на Viva 1910.

image.thumb.png.ad6e5eec276717af06a4dc11f57d2c87.png


Вероятно, какая-то ошибка.
Можете дать какие-то подробности?

По железу: MediaTek MT7621A + 128 MB DDR3 и выше (последние 8-10 лет) точно работает.
 

edited:
Так же надо ещё учитывать, какую гео зону загружаете, небольшое исследование нейросетки в закрепе. Есть большие и маленькие, они требуют разное количество RAM.
 

 

zone-sizes-research.md

Изменено пользователем 0xkee
added geo zones quantitative synopsis
Опубликовано (изменено)

как

10 часов назад, 0xkee сказал:

Можете дать какие-то подробности?

Версия ОС 5.1 Beta 3 Как собрать данные для анализа? после запуска зависает насмерть не открывается ни web ни ssh. помогает только сброс по питанию... 

Изменено пользователем Kservlad
Опубликовано (изменено)
10 hours ago, Kservlad said:

Версия ОС 5.1 Beta 3 Как собрать данные для анализа?

При установке что выводит, где останавливается?
Лог можете прислать/показать?

На 5.1 не проверялось (как бы dev preview версия), видимо, что-то поменяли, надо изучить...

edited:
5.1 изучен, не работал webui, поправлено, всё остальное без изменений и работает.
Так же выложены новые версии пакетов.

Изменено пользователем 0xkee
Опубликовано

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

нет ли в этом ошибки?

Опубликовано
On 5/28/2026 at 6:23 AM, Kservlad said:

Установил последнюю версию. Недоступен российский сегмент сети. 

пожалуйста подключитесь по ssh к entware роутера и пришлите вывод 

kee-status -d
Опубликовано
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, поэтому гарантировать не могу — если попробуете, буду рад услышать результат.

Добавлю в описание минимальные требования к прошивке.

Опубликовано

При проблемах:
1. Опишите проблему словами — что делали, что ожидали, что получили (чем подробнее, тем лучше)
2. Запустите скрипт диагностики и приложите вывод (под спойлер):

/opt/keenetic-entware-extras/scripts/bug-report.sh

Скрипт собирает версии, статус всех сервисов, проверки DNS и маршрутов, хвосты логов. В выводе нет паролей, ключей или внешних IP — безопасно постить на форуме.

> Доступен начиная с `keenetic-entware-extras` ≥ 0.9.5.

Опубликовано
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).

Спасибо!

Опубликовано
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-fullcurlbind-digaggregate — останутся

Для полной очистки нужно вручную: 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😞

  1. SmartDNS слушает на :6053 (не :53)
  2. В Keenetic CLI добавляется: ndmc -c 'ip name-server <IP>:6053'
  3. 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-хук не сработал. После установки нужно:

  1. Убедиться что VPN настроен и поднят
  2. Запустить /opt/etc/init.d/S99geo-split start
  3. Проверить 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 вызывается только в:

Core-скрипты geo-splitsmartdns-conf-ru-splitsmartdns-redirect используют только Linux-утилиты из Entwareipiptablesdigcurlgrepsedawk. Никакой зависимости от 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-утилиты (ipiptablesdigcurl)
  • Должны работать на 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 — можно портировать по запросу.

 

Опубликовано
2 hours ago, LuckyOwner said:

Рабочее решение?
Почему сайт пишет, что IPK недоступны для скачивания?
Еще не выложено на GitHub?

Пока нет отзывов, что работает. Вопрос в сетапах/конфигурации сетей, всего не предусмотреть, если и не работает, то скорее всего по этому.
Глючит.
Нет, планируется.

Опубликовано

Спасибо! Стало несколько понятнее, на практике эксперименты продолжу со "старичком" с v2.16 в пн-вт. С подробной диагностикой при необходимости (предыдущее сообщение писал по памяти, уже без доступа к устройству).

На Экстрах 1711 у меня пока AWG-Manager + MagiTrickle. Версию 4.3.7 упомянул для определенности. К тому же, она, 4.3.7 вроде как получила статус LTS.

Опубликовано
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 службы, т.к. они не очень. Вот как-то так...

Опубликовано
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

Опубликовано (изменено)
В 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  ХХХХХХХ[ХХХ.ХХХ.ХХХ.ХХХ]  сообщает: Заданный узел недоступен.

 

 

Изменено пользователем Kservlad
Опубликовано
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.
Если это поможет - доработаю логику авто определения выходного интерфейса.

Опубликовано

в том то и дело что автоопределил правильно...

=== 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
 

Опубликовано (изменено)

=== 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
 

Изменено пользователем Kservlad
Опубликовано
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)

Опубликовано (изменено)

Доброго времени суток! Хочу направить только 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"

Изменено пользователем cryoPanda
Опубликовано

Доброго времени суток! 

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
что-то можно заменить на *** по желанию

Опубликовано
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 и вводе учетных данных выдает ошибку, что данные неверны.

Опубликовано
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
```

Опубликовано
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

Опубликовано
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 мешает и снова запускает указанные сервисы. Там тоже что-то нужно модифицировать?

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.