- Добавлена поддержка токенов доступа к RCI для совместимости с KeeneticOS 5.2
- Добавлена возможность автоматической установки XKeen
- Расширен функционал маршрутизации по DSCP-меткам — добавлена метка
61- принудительное проксирование через отдельный transparent inbound/listener - @MichaelDavislol, @zxc-rv - Добавлена политика
xkeen_full, повторяющая функционал и использующая настройкиDSCP 61для устройств в политике роутера - Реализована возможность проксирования через выбранного провайдера - @MichaelDavislol
- Перед началом установки XKeen выполняется базовая проверка исправности Entware
- Добавлена возможность автообновления пользовательских геофайлов (настройка)
- Исправлена установка/обновление геофайлов и GeoIPSET (известные проблемы)
- Скрыт выбор установки Mihomo Prerelease-Alpha (известные проблемы)
- Сокращено окно отсутствия правил netfilter при пересборке файрвола NDM (renew DHCP) - трафик больше не уходит в обход прокси на 1–1.5 секунды; хук дополнительно защищён от гонок при частых renew: сгенерированный файл хука пишется атомарно (не бывает пустым/обрезанным), deny-MAC ipset не затирается пустым набором при сбое RCI, respawn mihomo из хука использует PID-lock (не залипает после OOM) #98, #116 - @dmiales
- Сгенерированные блобы правил netfilter теперь кэшируются между запусками хука - это дополнительно сокращает окно, в котором трафик идёт мимо прокси после пересборки файрвола NDM #102 - @dmiales
- Параллельные запуски netfilter.d-хука теперь сериализуются через lock-файл, что устраняет гонку при одновременной пересборке нескольких таблиц iptables; тот же лок распространён на clean_firewall (не сносит цепочки посреди iptables-restore на renew), а emergency_clear берёт общий proxy-mutex, чтобы не сорвать правила посреди обычного start/stop/restart #101, #117 - @dmiales
- Применение правил iptables в netfilter-хуке теперь логирует и повторяет неудачный iptables-restore вместо игнорирования ошибки #99 - @dmiales
- Для mihomo теперь автоматически выставляется GOMEMLIMIT (половина RAM устройства, предусмотрена настройка через
xkeen.json), что предотвращает рост потребления памяти и убийство процесса OOM-killer'ом на слабых роутерах #100, #114 - @dmiales - Функция
curl_with_timeoutтеперь возвращает код возврата curl, а не awk из форматирования прогресс-бара - сетевые сбои при загрузке больше не маскируются под успех #104 - @MrRefactoring - Добавлена опциональная балансировка по фактической скорости серверов (
xkeen -sb) - вместо штатного выбора Xray по задержке (leastPing) #105 - @MrRefactoring - Распаковка обновления теперь атомарна (временный каталог + подмена), добавлена проверка целостности архива mihomo (gzip -t с откатом) и минимального размера загруженного ядра — прерванное обновление больше не оставляет XKeen в полуустановленном состоянии #112 - @dmiales
- Хук netfilter.d пропускает пересборку маршрутов/правил при коротких DHCP renew, если WAN IP не изменился, а цепочки целы — меньше лишней работы на каждый renew #115 - @dmiales
- Рантайм XKeen (локи, state, кэш правил,
-toff) перенесён из world-writable /tmp с предсказуемыми именами в /tmp/.xkeen (root:root, 0700); убран eval при загрузке кэша правил, PID пишется в cold_start-лок сразу при создании #118 - @dmiales - Релизы XKeen и ядра xray/mihomo сверяются по
sha256с апстримом напрямую, а при недоступности, через зеркало с сообщением об этом; режим.xkeen.verify_downloads(по умолчанию warn, не ломает offline-сценарии); починка определения размера у зеркала через Content-Range; отдельный workspace на каждый вызов вместо общего /tmp/xkeen, чтобы параллельные-ug/-umне пересекались #119 - @dmiales - Установка (install.sh/install_xkeen) идёт через staging + .old-подмену — обрыв не оставляет полуустановку;
xkeen.jsonи каталог конфига получают права 600/700 (там RCI-токен), дожимаются идемпотентно на-uk; перезапись crontab теперь матчит только полные командыxkeen -ug|-ux|-ukи пишет через tmp+mv — чужие строки в crontab больше не затираются #120 - @dmiales - Занятый proxy-mutex у stop/restart теперь либо ретраится, либо явно возвращает ошибку «занято» вместо молчаливого кода 0;
proxy_startсчитает успех только после удачного применения netfilter-хука #121 - @dmiales - Добавлен опциональный kill-switch (
.xkeen.killswitch,xkeen -killswitch on|off|status) — при аварии ядра дропает только помеченный политикой трафик вместо прямой утечки в обход прокси; дефолт off,xkeen -stopснимает блокировку полностью. Добавлен кэш последнего успешного policy mark на случай сбоя RCI (вместо отката к «прокси для всех»). На реальном железе матчинг DROP-правила переведён с connmark на packet-mark (fwmark) — connmark не срабатывал после сноса save-mark цепочки #122 - @dmiales - Точечное восстановление сета
geo_exclude, если он опустел после OOM при живом .lst-файле (включая fast-path «WAN не менялся»);wait_for_readyтеперь принимает от RCI и объект, и массив, не гоняя полный таймаут на пустом наборе #123 - @dmiales - Для
user_excludeтеперь добавляется симметричное правило поsrc, а не только поdst— обратный трафик (например, ответы OpenVPN по UDP) больше не попадает в TProxy #129 - Добавлена метка
nfqws_mark(по умолчанию 0x40000000, поддерживается формат mark/mask) для совместимости проксирования Entware с пакетом nfqws2 — трафик с этой меткой обходит проксирование через отдельное bypass-правило iptables в пользовательских политиках d2902d7, dbfa06e - После восстановления правил netfilter-хук сбрасывает UDP-записи conntrack для TProxy-потоков по
$table_mark— уменьшена вероятность односторонних обрывов игровых/голосовых UDP-соединений при DHCP renew, когда поток, ушедший в окно без правил, подхватывался сетевым ускорителем (PPE) и не возвращался в TProxy #248
Детализация доработок, предложенных @kittylabassistant:
Установка, бэкапы, самообновление
- Убран предсказуемый путь mirror-кэша и возможность future-dated TTL-обхода #131
- Локализованы переменные install_xkeen_rename() через local #134
- В шаблоне config.yaml Mihomo выключен find-process-mode #135
- Добавлено подтверждение перед восстановлением из бэкапа (-kbr/-xbr/-mbr) #178
- Quote-aware разбор комментариев JSON в install.sh get_user_proxy() #194
- $mtmp_dir очищается на всех ветках ошибок install_mihomo() #195
- install.sh проверяет SHA-256 архива для --stable/--legacy #196
- Симметричный бэкап/откат xkeen-бинарника в install_xkeen() #197
- xargs заменён на sed-тримминг для rci_token/gh_proxy #198
- Устранена TOCTOU-гонка при реклейме протухшего lock-файла #199
- mihomo_installed больше не зависит от здоровья yq -V #200
- Удаляется мусорная _xkeen при частичном сбое restore_backup_xkeen #211
- afe-replace конфигов Mihomo/Xray при восстановлении из бэкапа #212
- Staging+verify до перезаписи install_dir/yq, -uy проверяет код возврата #227
netfilter.d-хук, автозапуск, cron
- Явный PATH в сгенерированном netfilter-хуке proxy.sh #136
- Удалён подтверждённо мёртвый код (SC2329/SC2034) #137
- Убрана недостижимая ветка в update_cron_geofile_task() #138
- Убран неиспользуемый valid_input=true в choice_geodata() #139
- Атомарная запись в delete_cron_geofile() — больше не усекает crontab #173
- Атомарная замена S05xkeen в register_xkeen_initd() #174
- Атомарная запись opkg status_file, awk-based delete_register_* #175
- Атомарная запись S05xkeen и списков портов через target.tmp.$$ #176
- Атомарная запись S05crond в register_cron_initd() #177
- Убран восьмеричный разбор в форматировании часа/минуты cron #184
- Сужен regex детекции geofile-cron задачи в общем crontab root #202
- Сентинел opkg_updated перенесён из /tmp в защищённый rundir #204
- Недействительный rci_token больше не блокирует stop/status в S05xkeen #208
- Убраны дублирующиеся вызовы uname -r в S05xkeen #233
Батчевый ipset restore для deny-MAC вместо построчного add #234
GeoIP / geodata
- choice_geodata() отклоняет конфликтующий multi-select geo-меню #181
- Симлинк zkeen(ip) больше не создаётся при неудачной загрузке #188
- Проверка SHA-256 геофайлов и geoipset перед установкой #189
- load_geoipset() сериализован mkdir-локом против гонки на tmp-наборе #190
- Исправлен якорный паттерн в _validate_geoipset_v6 #191
- GNU-only \s заменён на [[:space:]] в grep -E #192
- Синхронизирована санитизация входа в load_geoipset и load_ipset #218
- xkeen -ug теперь обновляет пользовательские geodata и без стандартных баз #221
CLI, RCI-токен, вывод
- GET к GitHub API за digest'ом релиза больше не дублируется #179
- choice_xray_core/choice_mihomo_core возвращают 1 при отказе смены ядра #180
- Закрыт CPU-spin busy-loop без TTY в 4 read-меню #182
- Проверка владельца PID перед снятием cold_start guard #183
- -start/-stop/-restart/-status возвращают реальный код завершения #185
- Исправлена опечатка регрессии в resolve_dscp_force_proxy (name_policy_full → policy_mark_full) #186
- Больше не теряется следующий флаг после -ap/-dp/-ape/-dpe #205
- Обработка 401 и таймаут в top-level проверке RCI-токена #206
- Сообщение об отсутствующем RCI-токене перенаправлено в stderr #207
- Добавлен -r к read -p в preinstall_warn #209
- Путь tmp_status_file в fixed_register_packages() сделан явным #210
- Убран предсказуемый путь sb_rule_tmp из общего /opt/tmp #213
- Восстанавливается chmod 600 на xkeen.json в sb_write_setting() #214
- Гейт минимальной версии Xray-core перед проверкой api балансировки #215
- local IFS в tests_ports_client, чтобы не текла в диспетчер #219
- clear больше не вызывается без проверки TTY #220
- Убраны двойные пустые строки в сообщении об ошибке версии XKeen #222
- Усечение xkeen-detached.log при self-detach #223
- Показывается help при запуске xkeen без аргументов #224
- Единый netstat и корректный разбор [addr]:port в tests_ports_client #225
- Добавлена проверка наличия xray перед сменой ядра в choice_xray_core() #232
Балансировщик и производительность
- proxy.sh и schedule-хук не перезаписываются, если содержимое не изменилось #193
- Убран повторный echo|tr|sed разбор портов в add_multiport_rules #228
- Пропускается лишний chmod в _xkeen_secure_rundir на верифицированной ветке #229
- Кэшируется разбор xkeen.json на один инвокейшн #230
- Убрана недостижимая ветка и no-op sed в choice_add_proxy_cores #231
- Кэшируется разбор config.yaml Mihomo в горячем пути DSCP force-proxy #235
- remove_ports_from_list переведён на однопроходный awk вместо цикла #236
- Кэшируется разбор xkeen.json в S05xkeen за один запуск процесса #237
- opkg self-heal пропускается на -sbt и help/meta-командах #238