Important
Материал носит исключительно информационный и учебный характер. Любое иное использование выходит за рамки ознакомления и может противоречить действующему законодательству. Автор не отвечает за последствия применения описанных подходов.
Warning
Все действия вы выполняете на свой страх и риск.
Автор не несет ответственности за возможный ущерб оборудованию, программному обеспечению, ограничения доступа, а также иные побочные эффекты. Предполагается, что вы осознаёте возможные риски и понимаете, что делаете.
Скрипт для Keenetic OS 5: синхронизирует списки доменов в разделе "Маршруты DNS" с базой v2fly/domain-list-community, сохраняет маршруты и режет большие списки на части автоматически.
Note
Требуется Keenetic OS 5.
- читает текущую конфигурацию и ищет группы доменов с нужным префиксом
- превращает описание группы в имя файла из v2fly (
Facebook [1/2]→facebook,Google Play→google-play) - тянет
data/<name>, раскрываетinclude:, игнорирует пустые/keyword:/regexp:правила - пересобирает группы доменов; при превышении лимита режет на части
<name>,<name>-2,<name>-3и т.д. - сохраняет состояние маршрутов (
auto/reject/disable) и переносит его на новые части сплита
Ключи:
baseUrl— источник доменных листов.prefix— префикс для поиска групп доменов в конфиге (domain-listпо умолчанию).timeoutMs,retries— таймаут в миллисекундах и количество попыток загрузки.maxEntriesPerGroup— максимум доменов в группе; при превышении создаются<name>-2,<name>-3и т.д. По умолчанию 300.routeInterface— интерфейс, через который будут идти маршруты. Например,Wireguard0(можно узнать через командуshow interfaceв CLIhttp://<router_id>/a).initialDomains— если групп с нужным префиксом нет, создадутся новые группы с описанием из списка и маршрутом (если задан интерфейс).dryRun— только логирует командыndmc, без применения.
Пример:
{
"baseUrl": "https://raw.githubusercontent.com/v2fly/domain-list-community/master/data/",
"prefix": "domain-list",
"timeoutMs": 20000,
"retries": 3,
"maxEntriesPerGroup": 300,
"routeInterface": "Wireguard0",
"initialDomains": [
"Facebook",
"Google Play",
"Instagram",
"JetBrains",
"Linkedin",
"OpenAI",
"SoundCloud",
"Spotify",
"Telegram",
"Twitter",
"WhatsApp",
"YouTube"
],
"dryRun": false
}Tip
Вы можете не создавать списки руками и прописать в конфиге initialDomains.
Раздел: http://192.168.1.1/staticRoutes/dns
Ниже два варианта: автоматический (рекомендуемый) через OPKG-репозиторий и ручной (если хотите поставить zip вручную).
Репозиторий: https://yangirov.github.io/keenetic-geosite-sync/all
# Подключение к роутеру
ssh root@192.168.1.1 -p 222
# Зависимости для HTTPS-загрузки
opkg update
opkg install ca-certificates wget-ssl
opkg remove wget-nossl 2>/dev/null || true
# Подключаем репозиторий
mkdir -p /opt/etc/opkg
echo "src/gz kgs https://yangirov.github.io/keenetic-geosite-sync/all" > /opt/etc/opkg/kgs.conf
# Установка пакета
opkg update
opkg install keenetic-geosite-syncПосле установки файлы окажутся в /opt/keenetic-geosite-sync, конфиг — /opt/keenetic-geosite-sync/config.json.
Обновление пакета:
opkg update
opkg upgrade keenetic-geosite-syncУдаление пакета и зависимостей:
opkg remove --autoremove keenetic-geosite-syncИнформация об установленной версии:
opkg info keenetic-geosite-syncПодробнее про ручную установку
# Подключение к роутеру по SSH
ssh root@192.168.1.1 -p 222
# Установка зависимостей
opkg update
opkg install node # обязательно для запуска
opkg install curl unzip # опционально, только для скачивания архива
opkg install cron # опционально, если нужен запуск по расписанию
# Скачивание и установка релиза
cd /opt && curl -L https://github.com/yangirov/keenetic-geosite-sync/releases/latest/download/keenetic-geosite-sync-dist.zip -o /tmp/kgs.zip && mkdir -p /opt/keenetic-geosite-sync && unzip -o /tmp/kgs.zip -d /opt/keenetic-geosite-sync && rm /tmp/kgs.zipДалее создайте сервис вручную:
# Создание загрузочного скрипта
mkdir -p /opt/scripts
cp /opt/keenetic-geosite-sync/scripts/geosite-sync.sh /opt/scripts/geosite-sync.sh
chmod +x /opt/scripts/geosite-sync.sh
# Создание сервиса Entware
cp /opt/keenetic-geosite-sync/scripts/S99geosite-sync /opt/etc/init.d/S99geosite-sync
chmod +x /opt/etc/init.d/S99geosite-sync
# Запуск сервиса
/opt/etc/init.d/S99geosite-sync start
# Остановка сервиса
/opt/etc/init.d/S99geosite-sync stop
# Перезапуск сервиса
/opt/etc/init.d/S99geosite-sync restart
# Логи сервиса
/opt/etc/init.d/S99geosite-sync logsДля проверки без изменений поставьте в конфиге "dryRun": true.
Конфиг находится в /opt/keenetic-geosite-sync/config.json — отредактируйте его перед запуском.
После установки и синхронизации, вы сможете отключать правила маршрутизации.
HTTP-сервер поднимается автоматически при старте приложения и слушает порт 3939.
Автосинхронизации при старте нет — дерните /sync вручную или настройте cron.
/sync— GET/POST. Запускает синхронизацию.429, если уже выполняется;500при ошибке./clean— GET/POST. Удаляет все группы/маршруты с префиксом изconfig.json./health— GET. Просто отвечает200 OK.
Примеры:
curl http://192.168.1.1:3939/health
curl http://192.168.1.1:3939/sync
curl http://192.168.1.1:3939/cleanЧтобы упростить работу с доменными списками в веб-интерфейсе Keenetic, есть пользовательский скрипт scripts/tampermonkey.js. Он добавляет автокомплит по именам из v2fly/domain-list-community и кнопки для быстрого вызова API сервиса.
- Установите расширение Tampermonkey.
- Создайте новый скрипт и вставьте содержимое
scripts/tampermonkey.js.
Откройте страницу http://192.168.1.1/staticRoutes/dns — в модальном меню добавления списка появится автодополнение по именам доменов из v2fly/domain-list-community.
В интерфейсе Keenetic появятся кнопки, которые вызывают API сервиса (/health, /sync, /clean) по умолчанию на http://192.168.1.1:3939.
Если API у вас на другом хосте/порту — поменяйте константу API_BASE в начале скрипта.
Пример настройки раз в неделю, по субботам в 04:00:
opkg update
opkg install cron
echo '0 4 * * 6 curl -s http://127.0.0.1:3939/sync' >> /opt/etc/crontab
/opt/etc/init.d/S10cron restart 2>/dev/null || trueСборка пакета выполняется в GitHub Actions (.github/workflows/publish.yml) при пушах в main/master и тегах v*.*.*. Итоговые ipk публикуются в https://yangirov.github.io/keenetic-geosite-sync/all вместе с Packages/Packages.gz. На тег дополнительно создаётся GitHub Release с keenetic-geosite-sync-dist.zip и ipk.
Также можно собрать через Docker (для тестирования локально):
docker run --rm -it -v "$PWD":/src -w /src node:20-bookworm bash -lc "apt-get update && apt-get install -y ca-certificates && chmod +x opkg/build.sh && ./opkg/build.sh"


