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

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

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

Всем привет!

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

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

Дополнительная информация — в README.md пакетов.

Пока пакеты выкладываются здесь, позже планирую перенести на GitHub.

Feedback и конструктивная критика приветствуются.



Описание, установка, настройка, удаление

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`

 

---

 

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

 

- 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.3.1_all.ipk

opkg install /tmp/geo-split-data_0.1.0_all.ipk

opkg install /tmp/geo-split_0.7.0_all.ipk

```

 

> ℹ️ Зависимости установятся автоматически из репозитория Entware. Убедитесь, что роутер имеет доступ к интернету.

 

### 3. Настроить

 

```sh

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

```

 

Минимально — установить `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.sh`

 

### Основные параметры

 

| Параметр | По умолчанию | Описание |

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

| `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.4.0 | Базовые библиотеки | ⬇️ [TODO] |

| `geo-split-data` | 0.3.0 | GeoIP-данные и списки доменов | ⬇️ [TODO] |

| `geo-split` | 0.8.0 | Основной пакет | ⬇️ [TODO] |

 

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

 

---

 

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

 

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

- **Требует Entware** — на стоковой прошивке без Entware не работает

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

- **Другой механизм, чем fwmark-решения** — geo-split работает через `ip rule`/`ip route` (route-based), а не через iptables/fwmark. С fwmark-решениями (keen-pbr и т.д.) не пересекается и мирно сосуществует, но это разные подходы — маршруты суммироваться не будут

 

---

 

## Лицензия

 

MIT — свободное использование, модификация и распространение с указанием авторства.

 

---

 

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

 

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

- 🐛 Баг-репорты (приложите вывод `status`)

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

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

 

Пишите в этой теме — постараюсь помочь.


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:

image.thumb.png.c4111c0d5adb2fe156e2dfb256a325d8.png

geo-split-data_0.3.4_all.ipk geo-split_0.9.4_all.ipk smartdns-conf-ru-split_0.3.5_all.ipk smartdns-redirect_0.1.8_all.ipk webui_0.7.10_all.ipk

keenetic-entware-extras_0.9.1_all.ipk

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

Привет!
Спасибо за работу и проект!
Я столкнулся с тем что при настройке решения 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 недели спустя...

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

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

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

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

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

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

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

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

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

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

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

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