Несколько доработок: резервная политика XKeenFull, расширенное предупреждение по DNS, закрепление yq#32
Несколько доработок: резервная политика XKeenFull, расширенное предупреждение по DNS, закрепление yq#32kittylabassistant wants to merge 19 commits into
Conversation
…itialization script
…general script refinements
…d known issues documentation
…s project documentation and service registration scripts
|
Спасибо за доработки, рассмотрю PR позже. В настоящее время GitHub заблокировал использование Action во всех моих репозиториях. До прояснения ситуации разработка и обновление всех проектов мной приостановлены. |
|
@jameszeroX можем переехать на gitlab либо могу помочь оформить self-hosted gitlab/любой другой scm |
…der, and registration scripts
… anorher major changes. all info in changed.md
|
Добавил ещё кучу изменений, в основном для безопасности. Все изменения в changed.md прописаны |
|
По нюансам |
|
Предварительный визуальный анализ доработок (тестирование пока не проводил)
В предложенных доработках чувствуется "рука" ИИ) Форк разрабатывается мной самостоятельно. Некоторый рутинный код, признаюсь, я поручаю ИИ, но алгоритмы всё-таки придумываю сам. Понимаю, что прогресс не остановить и соперничать с ИИ не намерен) Предложенные улучшения кода грамотные и без видимых ошибок, но некоторые не совсем к месту. |
Всегда можно те коммиты, где изменения не нужны/не требуются можем отменить и оставить только самый сок Про ИИ да, я использовал репозиторий скорее как leetcode для практики и сохранил ответы нейронки для сравнения. Подумал чего добру пропадать, всё-равно уже токены потрачены Про GH Actions мне Gemini составила какой-то конский отчёт, но там без конкретных причин блокировки - приложу, может пригодится |
|
|
Мейби тогда сделать отдельный флаг для установки на внутреннюю память с выводом предупреждения повторным? Большинство не должно зависеть от меньшинства, но мнение меньшинства тоже можно учитывать и удовлетворять - я согласен |
|
Думаю, нужно оставить, как сейчас. Вариант загрузки в оперативную память выработан пользовательским опытом. Этой памяти достаточно для скачивания любого компонента XKeen при установке на любой тип носителя. Жалоб на сбои при такой загрузке не было, в отличие от загрузки в /opt/tmp/xkeen/ на ранних версиях форка и в оригинальном XKeen. |
|
Откатил замечания Может тогда сделать флаг а-ля -usbinstall (нейминг без разницы) с установкой на флешку? Чтобы те кто хотели устанавливали всё на флешку, а кто нет в /tmp? |
|
Зачем усложнять) Всё же работает без ошибок независимо от используемого накопителя. Лучше проясните зачем в стартовом скрипте обрабатываются политики без доступа в интернет? Не совсем понимаю эту доработку. Есть у меня в роутере политики с подключениями WARP и OpenVPN, они настроены, но отключены, и как-либо использовать их в XKeen я не планирую, но их политики зачем-то учитываются скриптом. |
|
Цитирую knowissues.md: "При включенном проксировании, во встроенной политике "Без доступа в интернет" интернет продолжает работать, решения нет" - решение есть и оно как раз выполнено в скрипте |
|
Просто без перебора политик понять какие из них блэкхолят трафик и выставлены как "без доступа в интернет" - нельзя, либо я не нашел этот способ пока гуглил логику/нейронка тоже не предлага других вариантов |
|
"Зачем усложнять) Всё же работает без ошибок независимо от используемого накопителя" - прозвучу как llm - вы правы, но отчасти |
|
Ещё дополню: |
Падало именно в момент установки XKeen? Остальные кейсы падения не имеют отношения к скрипту установки. Ещё раз повторю, оперативной памяти в роутерах даже младших моделей достаточно для загрузки в неё любого компонента XKeen. Впрочем, вы можете сделать дополнительный флаг, например |
Это не работает. У Полититки по умолчанию проблема не в маршрутизации, а в доступе к DNS |
…ion script to fix default rules
Короче кинетик в дефолтном без доступа в интернет по маку и ndm hotspot блокирует трафик |
|
Про "Это не работает. У Полититки по умолчанию проблема не в маршрутизации, а в доступе к DNS" - откатил knowissues.md - у меня не воспроизводится, не могу логи/фактуру проблемы собрать |
Для воспроизведения необходимо настроить проксирование DNS, например, по этой инструкции DNS-over-VLESS и включить перехват DNS в XKeen. При этом устройства в политике по умолчанию теряют доступ к DNS, а кроме того, если в "Интернет фильтрах" прописаны только шифрованные DNS, то так же перестаёт работать ping по доменным именам в самом Кинетике на странице диагностики. Для исправления, необходимо добавить любой не шифрованный DNS и переместить устройства в кастомную политику. |
|
Окей, я учту этот момент. Пока предлагаю ПР больше не заполнять - и так большой получается |
|
Добавите ещё, пожалуйста, LICENSE - любую на ваше усмотрение в репу |
Да, это так. Только предложенная доработка не динамическая, она фиксирует mac в переменной и если устройство убрать из политики без интернета, то без Вы бы разбили данный PR на несколько. Каждая доработка - отдельный PR. Часть доработок я могу принять, часть под вопросом, но из-за того, что они все в одной куче, принятие всего PR под вопросом. Если разбиение слишком трудозатратно, я могу это понять и внесу предложенные доработки вручную. В контрибьюторах проекта вы будете указаны в любом случае. |
|
У меня skill-issue по переделыванию PR и делению коммитов на разные - если есть возможность взять изменения и применить их вручную - будет идеально. |
|
Просто в комментах перед закрытием PR прошу указать какие наработки были взяты, какие требуют исправления, а в каких отказано - чтобы всё было в одном сообщении. Мне так будет легче работать над будущим PR |
|
Следующие доработки были учтены и применены вручную к скриптам форка: Функция Код следующих файлов применён полностью:
Применены: Не применены: Функцию Результирующий код доступен в папке |
Built-in Keenetic policy drops via _NDM_HOTSPOT_FWD in FORWARD, but
XKeen TPROXY/REDIRECT/MARK intercepts in PREROUTING before FORWARD
runs, bypassing the drop. Custom policies work via routing mark from
rci/show/ip/policy; built-in has none.
Fix: ipset xkeen_deny_mac (hash:mac) + RETURN rule in PREROUTING
position 1 ahead of xkeen-jumps. Sync triggers:
1. xkeen -start/-restart — sync_deny_mac_ipset post api_cache_init
2. /opt/etc/ndm/netfilter.d/proxy.sh — _xkeen_sync_deny_mac_ipset
baked into template, runs on every NDM netfilter rewrite
3. /opt/etc/ndm/schedule.d/00-xkeen-hotspot-sync.sh — generated by
configure_firewall, fires on schedule start/stop
Dynamic refresh closes maintainer's objection on PR jameszeroX#32 (static
mac list required xkeen -restart on schedule transitions, breaking
parental-control use case). MAC bypass limited to L2-visible hosts
(LAN/Wi-Fi/guest-bridge); inert behind L3-VLAN — documented in
knownissues.md.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Built-in Keenetic policy drops via _NDM_HOTSPOT_FWD in FORWARD, but
XKeen TPROXY/REDIRECT/MARK intercepts in PREROUTING before FORWARD
runs, bypassing the drop. Custom policies work via routing mark from
rci/show/ip/policy; built-in has none.
Fix: ipset xkeen_deny_mac (hash:mac) + RETURN rule in PREROUTING
position 1 ahead of xkeen-jumps. Sync triggers:
1. xkeen -start/-restart — sync_deny_mac_ipset post api_cache_init
2. /opt/etc/ndm/netfilter.d/proxy.sh — _xkeen_sync_deny_mac_ipset
baked into template, runs on every NDM netfilter rewrite
3. /opt/etc/ndm/schedule.d/00-xkeen-hotspot-sync.sh — generated by
configure_firewall, fires on schedule start/stop
Dynamic refresh closes maintainer's objection on PR #32 (static
mac list required xkeen -restart on schedule transitions, breaking
parental-control use case). MAC bypass limited to L2-visible hosts
(LAN/Wi-Fi/guest-bridge); inert behind L3-VLAN — documented in
knownissues.md.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

Мелкие правки, каждая закрывает открытый/закрытый issue. Коммиты атомарны — можно принимать выборочно. Изменения протестированы на mipsle (KN-2910) и arm64 (KN-3811) с ядрами xray и mihomo.
1. Резервная политика
XKeenFull+ предупреждение о CPU — closes #17Проблема. Сейчас для полного проксирования клиента требуется либо оставлять
port_proxying.lstпустым (тогда проксируется всё у всех клиентов политикиxkeen), либо ручками писать пользовательскую политику вxkeen.json. Для use-case «полностью прокси для одного устройства» оба варианта неудобны.Решение. Добавлено зарезервированное имя политики
XKeenFull(переменнаяname_policy_fullвS05xkeen, по умолчаниюXKeenFull). Если пользователь создаёт в веб-интерфейсе Keenetic политику с этим именем и назначает туда клиентов, они автоматически проксируются на всех портах — без правокxkeen.json. Работает одновременно с базовой политикойxkeenи пользовательскими политиками.Реализовано переиспользованием существующего механизма
resolve_user_policies()+ итерации по$user_policiesвconfigure_firewall():XKeenFullвкрывается в поток как виртуальная записьXKeenFull|<mark>|all|. Новых ipt-веток не появилось.При активном полном проксировании (пустая
xkeen,XKeenFull, или пользовательская политика в режимеall) XKeen выводит предупреждение о повышенной нагрузке на CPU в консоль и syslog (logread -t | grep XKeen). Не блокирующее — просто информационное.Защита от конфликта имён:
check_policy_name_conflict()расширена — если пользователь попытается завести политику с именемXKeenFullвxkeen.json, старт прерывается с понятной ошибкой.Файлы:
scripts/_xkeen/02_install/07_install_register/04_register_init.sh— функцииget_policy_mark_full,warn_full_proxy_cpu, расширенияprint_policy_info/check_policy_name_conflict/proxy_start, переменнаяname_policy_fullscripts/_xkeen/02_install/07_install_register/02_register_xkeen.sh:50—name_policy_fullдобавлен вvariables_to_extract, чтобы пользовательское переопределение переживало обновления XKeen2. Предупреждение о несовместимости перехвата DNS с модулями фильтрации — addresses #19
Проблема. Связка «перехват DNS XKeen + модуль фильтрации Keenetic (NextDNS/SafeDNS/AdGuard DNS)» работает нестабильно: перехват на
iptables PREROUTINGуводит DNS-пакеты в прокси раньше, чем их обрабатывает модуль. Несколько пользователей в #19 столкнулись с этим; рабочий обходной путь — включить «Разрешить транзит запросов» в настройках модуля, либо использовать сервис как обычный DoH/DoT, либоxkeen -dns off.Решение. Расширена существующая функция
warn_proxy_dns()(она уже предупреждает про DNS-Based Routes KeeneticOS 5+). Добавлен абзац про модули фильтрации DNS с указанием трёх вариантов решения. Кода в рантайме не добавлено — XKeen не может надёжно отличить активный NextDNS-модуль от обычного DNS, поэтому ограничились предупреждением приxkeen -dns on.Сопутствующе в
configuration.mdдобавлен раздел «Перехват DNS и модули фильтрации Keenetic» с тремя опциями (транзит / DoH-DoT / отключить перехват) и указанием, что те же варианты применимы к DNS-Based Routes.Файлы:
scripts/_xkeen/04_tools/05_tools_choice/02_choice_xkeen.sh:181-195— расширениеwarn_proxy_dnsconfiguration.md— новый раздел3. Заметка про #20 (DNS-маршруты в политике по умолчанию) — already fixed
Upstream-фикс #20 (коммит
27619b9) закомментировалiptables -I PREROUTING 1 -j CONNMARK --restore-mark. Форкlevmnkv/XKeenисторически не ставит эту метку глобально вPREROUTING—CONNMARK --restore-markприменяется только внутри$name_chain, куда попадает лишь проксируемый трафик (не клиенты default-политики). Так что баг #20 здесь не воспроизводился и в нашем коде.4. Закрепление тега yq и post-download self-test — closes #23
Проблема.
releases/latest/downloadфоркаjameszeroX/yqпрокатывается черезlatest, которое может дрейфовать. Плюс upstreammikefarah/yq4.52.4 сегфолтится на mipsle(mikefarah/yq#2609), а детекция этой ситуации в инсталляторе отсутствует: скачивание завершается «успешно», а при старте Mihomo получаем
mode_proxy=Otherи молчаливое отсутствие прозрачного прокси — та самая симптоматика #23.Пин через фиксированный тег предлагался в #23 самим автором ишью. Альтернатива — миграция на
tomwright/dasel— рассмотрена и отвергнута: за всю историю dasel (99 релизов) ни одного MIPS/MIPSLE бинарника не публиковалось, миграция убила бы поддержку Mediatek-линейки Keenetic (~половина юзербазы).Решение.
(a) Вводится переменная
yq_workaround_tag="260312". URL рабочего yq собирается какhttps://github.com/jameszeroX/yq/releases/download/$yq_workaround_tag/...вместоreleases/latest/download/.... Тумблерyq_use_workaround="false"по-прежнему возвращает к upstreammikefarah/yq/releases/latest.(b) В
01_downloaders_mihomo.shдобавлен post-download smoke-testyq -V. Если бинарь не запускается (сегфолт от регрессии upstream или неправильная архитектура при OffLine-установке), инсталлятор прерывается с понятной ошибкойи ссылкой на mikefarah/yq#2609. Аналогичный чек добавлен в fallback-ветку, использующую уже установленный yq.
(c) Синхронизирован корневой
01_info_variable.shсо скриптовой версией: текущийinstall.sh:74поверх свежераспакованного файла накатывает корневой изmain, и до правки корневой не содержалget_yq_dist_url()—mihomo-загрузчик получал пустой URL.
Файлы:
01_info_variable.sh— синхронизация + пинscripts/_xkeen/01_info/01_info_variable.sh:78-92— пин + переменнаяyq_workaround_tagscripts/_xkeen/04_tools/07_tools_downloaders/01_downloaders_mihomo.sh:199-233— self-test в двух ветках (свежая загрузка + fallback на установленный)Test plan
sh -nна всех изменённых скриптах — OKjq-тесты дляget_policy_mark_fullиcheck_policy_name_conflictна искусственномapi_policy_json— возвращают ожидаемые метки / конфликтыHEAD 200наhttps://github.com/jameszeroX/yq/releases/download/260312/yq_linux_{arm64,mips,mipsle}— все три ассета на местеexit 1корректно отвергается, ветка ошибки печатаетсяXKeenFull, назначено устройство,xkeen -restart→ в терминале жёлтое предупреждениеАктивен режим полного проксирования, вlogreadаналогичный warning;iptables -t mangle -S PREROUTING | grep <mark>показывает правило с-j xkeenбез multiport; устройство проксируется на произвольных портахinstall.sh, выбор mihomo —Yq успешно загружен и установлен,mode_proxy=TProxy,yq -Vвозвращаетv4.52.2/opt/sbin/yqнаyq_linux_arm64→xkeen -rmвалится с ошибкой «Yq не запускается», ссылка на #2609 присутствуетxkeenиXKeenFull— клиенты без интернета штатно не получают интернет;xkeen -dns onпоказывает оба предупреждения (DNS-маршрутизация + модули фильтрации)Что НЕ вошло
jameszeroX/yqжив; пин на тег даёт достаточный детерминизмДокументация
forkinfo.md— записи по каждому из четырёх пунктовconfiguration.md— новые разделы «Политика доступаXKeenFull(полное проксирование устройств)» и «Перехват DNS и модули фильтрации Keenetic»Честно - текст для PR писала нейроночка, по коду только мелкие нюансы уточнял, особенно по совместимости yq