22 KiB
Keenetic DNS Routes
Веб-панель для управления списками DNS-маршрутов на роутерах Keenetic — без Neo, без прямого SSH, через встроенный RCI API.
Поддержать проект: Boosty · СБП / Ozon Bank · Telegram: @Iot_andrey
1. Что это за проект
Роутеры Keenetic умеют направлять отдельные сайты через VPN-туннель — через встроенную функцию «Маршруты DNS» (DNS-based routes). Например: youtube.com и netflix.com — через VPN, всё остальное — напрямую.
Проблема: добавлять домены по одному через веб-интерфейс роутера — неудобно. Если у тебя несколько роутеров — в разы неудобнее.
Этот проект решает проблему: устанавливаешь один раз на сервер (VPS), открываешь браузер, вставляешь/правишь список доменов, нажимаешь «Применить» — и списки одновременно обновляются на всех твоих роутерах.
┌───────────────────────────────┐
│ Браузер → http://VPS:8001 │ ← ты работаешь здесь
└──────────────┬────────────────┘
│ API
┌──────────────▼────────────────┐
│ keenetic-dns-routes на VPS │ ← этот сервис
└──────────┬──────────┬─────────┘
│ RCI │ RCI
┌──────▼──┐ ┌────▼──────┐
│Роутер 1 │ │ Роутер 2 │ ← роутеры дома
└─────────┘ └───────────┘
Что умеет:
- Два независимых списка доменов/IP: US (под VPN) и RU (локальный трафик, если нужен второй туннель).
- Применяет списки сразу на несколько роутеров одной кнопкой.
- Для роутеров без белого IP (за провайдерским NAT) — встроенный мастер настройки обратного туннеля.
- Не требует Neo / HydraRoute — только встроенная DNS-маршрутизация KeeneticOS.
Требования к роутеру:
- KeeneticOS 5.0.1 или новее.
- Включены: KeenDNS + HTTP Proxy для API (порт 79).
- У пользователя роутера есть права на HTTP Proxy.
2. Быстрая установка
Вставляй команды по одной на сервере (VPS), где будет работать панель.
Шаг 1 — клонируй и запусти установщик
git clone https://github.com/andrey271192/keenetic-dns-routes.git /opt/keenetic-dns-routes
cd /opt/keenetic-dns-routes
sudo bash install.sh
Установщик сам создаст Python-окружение, пропишет systemd-сервис и запустит его.
Шаг 2 — задай пароль и адрес VPS
nano /opt/keenetic-dns-routes/.env
Минимум что нужно поменять:
ADMIN_PASSWORD=твой-пароль-для-панели
# Если у всех роутеров одинаковый логин/пароль Keenetic:
KEENETIC_LOGIN=admin
KEENETIC_PASSWORD=пароль-роутера
Если планируешь использовать туннель (для роутеров без белого IP) — добавь сюда же:
VPS_SSH_HOST=IP_или_домен_твоего_VPS
Остальные поля туннеля — см. раздел 3.
Шаг 3 — перезапусти сервис
sudo systemctl restart keenetic-dns-routes
Шаг 4 — открой панель
http://IP_ТВОЕГО_VPS:8001
Введи пароль из ADMIN_PASSWORD.
Обновление
cd /opt/keenetic-dns-routes && sudo bash update.sh
Удаление
curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic-dns-routes/main/uninstall.sh | sudo bash
3. Туннель — для роутеров без белого IP
Что такое «белый IP» и почему он нужен
Обычно сервис (VPS) подключается к роутеру напрямую по сети. Для этого нужно знать IP-адрес роутера, и он должен быть публичным («белым») — то есть доступным из интернета.
Если твой провайдер выдаёт серый IP (роутер за NAT оператора — очень частая ситуация в России), то с VPS до роутера «достучаться» невозможно. Роутер сам должен инициировать соединение.
Как работает туннель
Роутер сам устанавливает зашифрованное SSH-соединение на VPS и говорит ему: «слушай у себя порт 20100 — всё что придёт туда, перешли мне на порт 81».
Роутер (серый IP) ──SSH──▶ VPS :20100
│
VPS → keenetic-dns-routes ──────▶│──▶ Порт 81 роутера (RCI API)
В итоге сервис обращается не напрямую к роутеру, а к localhost:20100 на самом же VPS — и это работает даже если у роутера серый IP.
Что понадобится
- Публичный IP/домен VPS (он у тебя уже есть, раз ставишь сервис).
- SSH-доступ к VPS (тоже есть).
- Роутер с установленным Entware (нужен для
autossh).
Установка Entware на роутер
Entware — пакетный менеджер для роутеров, позволяет устанавливать дополнительные программы.
С KeeneticOS 4.2+ можно прямо через браузер: открой 192.168.1.1/a и следуй инструкциям.
Или через SSH на роутере (логин root, пароль keenetic, порт 22):
# Определи свою архитектуру:
# MT7628/MT7621 → mipsel:
opkg disk storage:/ https://bin.entware.net/mipselsf-k3.4/installer/mipsel-installer.tar.gz
# MT7622/MT7981/MT7988 (ARM) → aarch64:
opkg disk storage:/ https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz
Дождись окончания (~2 минуты), потом проверь: opkg update должен отработать без ошибок.
Шаг 1 — настрой .env на VPS
nano /opt/keenetic-dns-routes/.env
Добавь или заполни строки:
VPS_SSH_HOST=IP_или_домен_VPS # публичный адрес, куда роутер будет коннектиться
VPS_SSH_PORT=22 # SSH-порт VPS (обычно 22)
VPS_SSH_USER=root # пользователь VPS
VPS_SSH_PASS оставь пустым — туннель использует SSH-ключи, пароль не нужен.
Перезапусти сервис:
sudo systemctl restart keenetic-dns-routes
Шаг 2 — добавь роутер в панель
Открой http://VPS:8001. Нажми кнопку «⇄ Тоннель» рядом с «+ Добавить».
Введи имя роутера и пароль веб-интерфейса роутера (для Keenetic API). Нажми «Создать».
Если кнопки «⇄ Тоннель» нет — проверь, что
VPS_SSH_HOSTв.envне пустой и сервис перезапущен.
Шаг 3 — скопируй и выполни команду на роутере
В открывшемся окне ты увидишь одну команду вида:
curl -fsS 'http://VPS:8001/api/routers/abc/tunnel-script?token=XXX' | sh
Нажми кнопку «Скопировать» (если не сработала — выдели текст и Cmd/Ctrl+C).
Открой SSH-сессию на роутер (не на VPS!) и вставь команду.
Как отличить терминал роутера от VPS:
- Роутер: приглашение выглядит как
~ #или(none) ~ #- VPS: выглядит как
root@имя-сервера:~#Команда для роутера — это та, что начинается с
curl -fsS. Её надо вводить там, где~ #.
Скрипт автоматически:
- Установит
autosshчерез opkg. - Запишет SSH-ключ в
/opt/etc/kdns_tk. - Создаст скрипт тоннеля
/opt/bin/kdns_tun. - Пропишет автозапуск при старте роутера.
- Запустит туннель в фоне.
В конце ты увидишь:
=== OK ===
Тоннель: localhost:81 (роутер) -> VPS:20100
Шаг 4 — проверь связь
Вернись в браузер и нажми кнопку «⟳ Проверить связь» в окне туннеля.
Если всё хорошо — статус изменится на «Активен». После этого можно нажать «Применить маршруты».
Ручной запуск и диагностика
Если автоматический запуск не сработал (написало «ОШИБКА»):
# На роутере — запусти туннель вручную (ты увидишь вывод):
/opt/bin/kdns_tun
# Если работает вручную, но не в фоне — запусти через init.d:
/opt/etc/init.d/S99kdns_tun restart
# Проверить лог:
cat /tmp/kdns_tun.log
# Перезапустить автоматически:
killall autossh 2>/dev/null; sleep 1; /opt/etc/init.d/S99kdns_tun start
Если /opt/bin/kdns_tun работает вручную — туннель настроен правильно, вопрос только в фоновом запуске. Попробуй перезагрузить роутер — при старте Entware сам запустит /opt/etc/init.d/S99kdns_tun start.
Проверка на VPS
На VPS можно посмотреть, слушается ли порт туннеля:
ss -tlnp | grep 20100
Должна быть строка с 127.0.0.1:20100. Если есть — туннель работает.
4. Логины и пароли
Здесь два совершенно разных набора учётных данных. Не перепутай.
Пароль веб-панели (ADMIN_PASSWORD)
Это пароль для входа на http://VPS:8001. Задаётся один раз в .env на VPS. Никак не связан с паролями роутеров.
ADMIN_PASSWORD=твой-секретный-пароль
Логин/пароль Keenetic (для RCI API)
Это логин и пароль веб-интерфейса роутера (192.168.1.1). Нужны сервису для того, чтобы применять маршруты через RCI API.
Вариант 1 — один дефолт для всех роутеров (удобно, если у всех один и тот же):
KEENETIC_LOGIN=admin
KEENETIC_PASSWORD=пароль-от-192.168.1.1
Вариант 2 — у каждого роутера свой (заполняется в веб-панели при добавлении роутера):
- Поле «Логин» и «Пароль» в форме добавления роутера.
- Или URL вида
http://логин:пароль@rci.ваш-роутер.keenetic.pro:79.
Вариант 3 — прямо в URL (если вставил URL с логин:пароль@ — сервис сам перенесёт это в поля):
http://admin:пароль@rci.xxx.keenetic.pro:79
Приоритет (что важнее): поля роутера → user:pass@ в URL → .env дефолт.
SSH-ключи для туннеля
Это отдельная история, и тебе ничего делать не нужно. Ключи генерируются автоматически на VPS при нажатии кнопки «⇄ Тоннель». Приватный ключ уходит на роутер через одноразовую ссылку (действует 10 минут). Публичный ключ добавляется в ~/.ssh/authorized_keys на VPS. Никакого пароля SSH нет.
5. Как добавлять маршруты
Где настроить интерфейс (куда направлять трафик)
В панели вверху есть поля Interface ID для групп US и RU. Это имя VPN-туннеля на роутере, через который пойдёт трафик: Wireguard0, PPPoE0, SSTP0 и т.д.
Нажми «Сканировать…» рядом с полем — панель сама загрузит список интерфейсов с роутера. Или включи «Только WireGuard» чтобы видеть только VPN-туннели.
Как добавить домены
В большие текстовые поля вводи по одному на строке:
youtube.com
netflix.com
spotify.com
# комментарий — эти строки игнорируются
1.2.3.4
192.168.100.0/24
Поддерживаются: домены, IP-адреса, CIDR-подсети. Пустые строки и строки с # игнорируются.
Лимит: Keenetic держит примерно ~300 доменов в одном списке. Если превысишь — роутер вернёт ошибку.
Применение
- «Сохранить на сервер» — сохраняет список только на VPS (не применяет на роутеры).
- «Применить на всех» — применяет на все роутеры сразу.
- Чтобы применить только на некоторые — поставь галочки у нужных роутеров и нажми «Только на выбранных».
При применении сервис делает «умный дифф»: добавляет только новые домены, удаляет убранные, не трогает остальные. В конце отправляет system configuration save.
6. Частые ошибки и решения
Connection refused при применении маршрутов
Причина: RCI API роутера недоступен с VPS.
Что проверить:
- В Keenetic включён HTTP Proxy для API — порт 79 (не 81, не 80).
- У пользователя роутера есть права на HTTP Proxy (в веб-интерфейсе роутера → «Управление» → «Пользователи»).
- Правильный URL прокси:
http://rci.твой.keenetic.pro:79(или аналогичный).
Туннель пишет «autossh не запустился в фоне»
Причина: BusyBox на роутере не полностью «отвязывает» фоновый процесс от терминала.
Решение:
# На роутере — проверь вручную:
/opt/bin/kdns_tun
# Если работает (есть вывод и не падает с ошибкой) — перезагрузи роутер.
# После перезагрузки Entware сам запустит туннель через init.d.
Если падает и вручную — смотри лог:
cat /tmp/kdns_tun.log
Там будет конкретная ошибка SSH.
Host key verification failed в логе autossh
Причина: Старый ключ VPS не совпадает с сохранённым.
Решение: Скрипт уже ставит -o StrictHostKeyChecking=no — этой ошибки быть не должно. Если всё же есть:
rm /opt/etc/ssh/ssh_known_hosts 2>/dev/null; /opt/bin/kdns_tun
Кнопка «Скопировать» не работает
Причина: navigator.clipboard требует HTTPS. Панель работает по HTTP.
Решение встроено: при ошибке кнопка автоматически выделяет текст — просто нажми Cmd+C (Mac) или Ctrl+C (Windows/Linux).
Токен истёк (10 мин)
Причина: Одноразовая ссылка для установки туннеля действует 10 минут.
Решение: Нажми «Получить команду» заново — сформируется новая ссылка.
opkg: не найдена команда на роутере
Причина: Entware не установлен или не инициализирован.
Решение: Установи Entware (см. раздел 3), дождись окончания и выполни opkg update.
Панель не открывается (http://VPS:8001)
Причина: Порт заблокирован файрволом VPS.
Решение:
# На VPS:
sudo ufw allow 8001/tcp # или через iptables, в зависимости от дистрибутива
7. Полезные советы
Как зайти на роутер по SSH:
Адрес: 192.168.1.1 (или IP роутера в сети)
Логин: root
Пароль: keenetic (стандартный, если не менял)
Порт: 222 (в некоторых моделях вместо 22)
Используй Termius, PuTTY или команду ssh root@192.168.1.1 в терминале.
Сервис запускается автоматически при старте VPS — systemd следит за ним. Если упал:
sudo systemctl status keenetic-dns-routes # посмотреть состояние
sudo systemctl restart keenetic-dns-routes # перезапустить
sudo journalctl -u keenetic-dns-routes -n 50 # последние 50 строк лога
Обновить сервис:
cd /opt/keenetic-dns-routes && sudo bash update.sh
Проверить, что туннельный порт слушается на VPS:
ss -tlnp | grep 20100
Применять маршруты по расписанию (через cron на VPS):
crontab -e
# Добавь строку — применять каждую ночь в 3:00:
0 3 * * * curl -s -X POST http://localhost:8001/api/apply \
-H "X-Admin-Password: твой-пароль" \
-H "Content-Type: application/json" \
-d '{"mode":"all"}'
Список доменов через API (без браузера):
# Получить текущий список US:
curl -s http://localhost:8001/api/data \
-H "X-Admin-Password: твой-пароль" | python3 -m json.tool
# Добавить домен в список US:
curl -s -X POST http://localhost:8001/api/groups/US/lines \
-H "X-Admin-Password: твой-пароль" \
-H "Content-Type: application/json" \
-d '{"add":["newdomain.com"],"remove":[]}'
Что изменено в репозитории (кратко)
| Файл | Что добавлено / исправлено |
|---|---|
app/main.py |
Генерация ed25519-keypair на VPS через ssh-keygen; добавление pubkey в ~/.ssh/authorized_keys; эндпоинты /tunnel-cmd, /tunnel-script (одноразовый токен, 10 мин), /tunnel-status (проверка порта), DELETE /tunnel |
app/config.py |
Переменные VPS_SSH_HOST, VPS_SSH_PORT, VPS_SSH_USER, VPS_SSH_PASS, TUNNEL_PORT_START |
.env.example |
Секция Reverse SSH tunnel с объяснениями |
templates/index.html |
Кнопка «⇄ Тоннель» рядом с «+ Добавить»; модалка с curl-командой; кнопка «⟳ Проверить связь»; fallback-копирование (execCommand) для HTTP без HTTPS |
tunnel/kssh-tun |
Отдельный скрипт управления WireGuard-пирами на VPS-стороне (для альтернативной WG-топологии) |
Что было исправлено в процессе разработки:
sshpassиcronieнедоступны в Entware aarch64-k3.10 → заменены на keypair-аутентификацию иinit.d-автозапуск.openssh-keygenнет на роутере → генерация keypair перенесена на VPS.navigator.clipboardне работает по HTTP → fallback черезexecCommand('copy').- autossh умирал при фоновом запуске → добавлены
AUTOSSH_GATETIME=0,</dev/null,setsid(илиnohup-subshell), лог в/tmp/kdns_tun.log.
Связанные проекты
- keenetic-unified — Neo + дашборд (другой порт, другие роутеры)
- domen_hydra — только Neo-конфиг
- Keenetic SSH — прямой SSH (нужен белый IP)