Skip to content

feat: route proxy core egress through the selected WAN provider#87

Closed
kittylabassistant wants to merge 2 commits into
jameszeroX:mainfrom
kittylabassistant:feature/multiwan
Closed

feat: route proxy core egress through the selected WAN provider#87
kittylabassistant wants to merge 2 commits into
jameszeroX:mainfrom
kittylabassistant:feature/multiwan

Conversation

@kittylabassistant

Copy link
Copy Markdown

Что и зачем

При двух провайдерах Keenetic маршрутизирует по fwmark (метка политики «Приоритеты подключений»). Прокси-ядро (Xray/Mihomo) метило свои исходящие сокеты захардкоженной меткой 255 — она не соответствует ни одной политике провайдера, поэтому роутер всегда уходил в основное подключение. Выход ядра игнорировал провайдера, выбранного галкой в политике XKeen (Known issues, FAQ #22 — «галка Резервное не работает»).

Решение

Метка egress ядра теперь принимается как 255 либо как fwmark политики XKeen (XKeen уже резолвит её из API роутера). Пользователь вписывает десятичное значение метки в конфиг ядра вместо 255 — выход идёт через выбранного в политике провайдера, с failover (провайдера выбирает сама политика, метка стабильна).

Изменения

scripts/_xkeen/02_install/07_install_register/04_register_init.sh

  • get_policy_mark — резолвит метку политики в чистый 0xNN (первая совпавшая, hex-валидация, lowercase, отсев нулевой метки) либо "".
  • validate_routing_mark — принимает sockopt.mark / routing-mark ∈ {255, policy_mark} (Xray + Mihomo), переиспользует get_policy_mark; предупреждение показывает точное десятичное значение метки.
  • add_output — anti-loop RETURN теперь и на 255, и на метку политики (upstream ядра не зацикливается).
  • api_cache_init перенесён перед validate_routing_mark (метка должна быть доступна валидатору).

scripts/_xkeen/04_tools/03_tools_diagnostic.sh

  • xkeen -diag печатает метку политики XKeen (hex + десятичное).

Документацияwiki/Configuration.md (раздел multi-WAN), wiki/FAQ.md #22 (Способ 1 — метка политики, Способ 2 — sockopt.interface), wiki/Knownissues.md, test/README.md.

Совместимость и безопасность

  • Single-WAN — нулевая регрессия: путь с меткой 255 идентичен прежнему.
  • Проксирование Entware сохраняется: немеченый трафик Entware по-прежнему перехватывается и проксируется; из anti-loop RETURN выходит только меченый upstream ядра.

Тестирование

  • shellcheck -s sh — без ошибок, sh -n — OK.
  • Логика резолва/валидации метки прогнана изолированно: 255 / policy_mark, lowercase, reject-0, не-hex, multiline.
  • Требует проверки на роутере (нет тестовой среды): деплой на Keenetic с двумя провайдерами; xkeen -diag показывает метку; внешний IP через прокси = резервный провайдер; iptables -t mangle -nL xkeen_out содержит оба RETURN; failover-переключение провайдера в политике.

Вне scope (отдельными задачами)

  • Полнота Mihomo-валидации: proxy-providers проверяется по принципу «хотя бы один», listeners[].routing-mark не проверяется (преэкзистинг, не связано с этой фичей).
  • Метки ≥ 0x80000000 на mips32 (signed overflow в POSIX-арифметике) — Keenetic назначает малые метки, на практике не наблюдается.

On routers with two providers Keenetic does policy-based routing by
fwmark. The proxy core (Xray/Mihomo) stamped its upstream sockets with
a hardcoded mark 255, which matches no provider policy, so the router
always fell back to the main provider — egress ignored the provider
chosen in the XKeen connection-priority policy (the "backup" checkbox;
see Known issues / FAQ jameszeroX#22).

Accept the core egress mark as 255 OR the XKeen policy fwmark:

- get_policy_mark: resolve the policy fwmark from the router API into a
  clean, lowercased, non-zero "0xNN" (or "" when absent). Lowercasing
  fixes the case-sensitive awk match in configure_route; rejecting 0
  prevents "--mark 0 -j RETURN" from matching all unmarked traffic.
- validate_routing_mark: accept sockopt.mark / routing-mark in
  {255, policy_mark} for Xray and Mihomo, reusing get_policy_mark; the
  warning now shows the exact decimal mark to configure.
- add_output: the anti-loop RETURN now matches both 255 and the policy
  mark, so the core's own upstream still escapes re-proxying.
- api_cache_init runs before validate so the policy mark is available.
- xkeen -diag prints the policy fwmark (hex + decimal).

Single-WAN behavior is unchanged (the mark 255 path is identical) and
Entware proxying keeps working: unmarked Entware traffic is still
captured and proxied; only the core's marked upstream returns.

Docs: Configuration.md, FAQ jameszeroX#22 (policy-mark method + interface
fallback), Known issues, test release notes.
@jameszeroX jameszeroX closed this Jun 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants