We already have on the forum an XKeen installation on Mihomo kernel and the Remnawave HWID subscription add-on. Both are about how to set it up. This material is about what changed afterward: on June 6 XKeen 2.0 was released, and some things were changed, making some old instructions outdated in places.
We break it down feature by feature: what appeared, why it’s useful, and what needs to be reconfigured.
Who is this even for. XKeen is a POSIX-shell utility that runs on a Keenetic router (in Russia the brand is renamed to Netcraze) to transparently proxy through Xray or Mihomo via the router. The point is that routing is solved on the router, not on every client. A TV, a console, a smart bulb, a guest laptop — none of them will ever get a sing-box client, but they will get the required route from the router.
For operation you need Entware on a USB drive with ext4 — without it nothing will work.
Change 1. User policies
Previously XKeen lived in one rigid Keenetic policy. Now in 2.0 there is a stated support for user policies — you create your own policy in “Connection Priorities”, assign the necessary devices to it, and XKeen operates with that policy.
Practical meaning: different groups of devices can be managed differently, without cobbling together workarounds. Plus, the built-in Keenetic policy “No Internet access” compatibility has been separately refined — previously combining them produced odd effects.
Change 2. DNS proxying and DNS-over-VLESS
This is arguably the most valuable. The usual scheme of “traffic through proxy, DNS through provider” is leaky: the list of domains you resolve remains with the provider, and DPI can easily see where you go.
XKeen 2.0 can proxy DNS (xkeen -dns), and the project wiki separately describes the scheme DNS-over-VLESS — when DNS queries go inside the same VLESS/Reality tunnel rather than a separate DoH.
The scheme boils down to three pieces of Xray config: dokodemo-door on a separate port with tproxy, a separate outbound with "protocol": "dns", and a routing rule that sends port 53 to this outbound:
{ "port": 53, "outboundTag": "dns-out" }
The pitfall from the same wiki: many server configs block geoip:private, and that includes the system resolver 127.0.0.53. With such a rule, DNS-over-VLESS simply won’t work — you need to remove the rule or send that address to direct.
A note about the xkeen -dns mode: it works correctly for devices that are not in the XKeen policy, only if they do not have default DNS settings. Check the result not by feel but by watching where UDP packets actually go on port 53.
Change 3. IPSET and exclusion of Russian subnets
In 2.0 there is support for IPSET and the ability to exclude Russian IP subnets from proxying — this is chosen directly at the installation stage (step 7 of the installer).
There are four pairs (IPv4 + IPv6), and understanding who is responsible for what saves hours of debugging:
| Set | What’s in it |
|---|---|
user_exclude / user_exclude6 |
Your own addresses and subnets |
geo_exclude / geo_exclude6 |
Russian subnets |
geo_override / geo_override6 |
Exceptions to exceptions — what still should be proxied |
ext_exclude / ext_exclude6 |
External applications should go here |
Your addresses go into /opt/etc/xkeen/ip_exclude.lst, one entry per line, empty lines and comments are ignored.
A live scenario from the project FAQ: if you occasionally experience dropped connections, the authors explicitly say that Xray is not designed for streaming traffic. It’s fixed by adding an IP service with a /32 mask to ip_exclude.lst — or by moving to the Mihomo kernel.
Change 4. DSCP-based routing: one program — one route
The most unusual feature of the release. The router can see packets but not which app generated them. DSCP markings solve this on the client side:
- DSCP 63 — force traffic into the normal XKeen chain (i.e., into the proxy), even if the ports wouldn’t normally route there;
- DSCP 62 — exclude from proxying.
On Windows, the mark is set via QoS policy: gpedit.msc → “QoS based on policy” → create a policy, specify the executable, DSCP mark, and optionally addresses, protocol and ports. Before that you need a registry tweak:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\QoS]
"Do not use NLA"="1"
After creating the policy, just restart the application; a system reboot is not required.
Limitations: gpedit.msc is only in the full editions of Windows. Home users will have to edit the registry manually. And yes, this works specifically for Windows — a TV or Android box doesn’t have this lever.
Change 5. Mixed became Hybrid, and port 443 is not needed for everyone
The mode formerly called Mixed is now called Hybrid. If you copy configs or year-old instructions, keep that in mind.
More importantly: the second point: exposing port 443 is now required only for TProxy mode. Previously the step of moving Keenetic’s web configurator from 443 to 8443/5443 was mandatory for everyone. Now with Hybrid you can skip it.
What else changed in minor details
- Port files were reduced to two:
port_proxying.lst(what to proxy) andport_exclude.lst(what not to proxy). They do not work simultaneously — if both are filled, the proxying list has priority. - Gate to its own GitHub proxy via
gh_proxyin/opt/etc/xkeen/xkeen.json— relevant when GitHub on the router won’t respond. - Re-try downloads:
retries_download(default 1) andretry_delay_download(2 seconds). Useful to increase if the installer fails mid-way. - File descriptor limits moved to config:
arm64_fd(default 40000) andother_fd(10000). - AdGuard Home finally shows the IP of the specific client, not the router — with the command
xkeen -aghfix on(for 2.0+) or the config option"routeOnly": truein the Xray config. - The Entware traffic is proxied as well.
Quick reference: commands you actually need
| Command | What it does |
|---|---|
xkeen -start / -stop |
Start and stop proxying |
xkeen -status |
Current status |
xkeen -ux |
Switch the Xray core version, including rollback |
xkeen -dns |
Proxy DNS |
xkeen -aghfix on |
Fix client detection in AdGuard Home |
xkeen -fd |
Enable file descriptor control |
xkeen -d <seconds> |
Delay start after router boot |
xkeen -diag |
Collect diagnostic report |
xkeen -io |
Offline installation (archive and binaries pre-staged in /opt/sbin/) |
xkeen -h |
Full current list — the only reliable source |
If you’re setting it up from scratch (Entware must be present):
opkg update && opkg install curl tar && cd /tmp
sh -c "$(curl -sSL https://raw.githubusercontent.com/jameszeroX/XKeen/main/install.sh)"
The installer will guide you through nine steps: XKeen version → selection of proxying cores → their versions → GeoSite databases → GeoIP databases → whether to exclude Russian subnets → auto-update of geo-files and its schedule → auto-start on router boot.
Configs after installation are located at /opt/etc/xray/configs/ (or /opt/etc/mihomo/): 03_inbounds.json — listening mode, 04_outbounds.json — your server data, 05_routing.json — routing rules.
Hardware: what it will run on, and what it will struggle with
| Architecture | Models (partially) | Reality |
|---|---|---|
| aarch64 — take this | Peak KN-2710, Ultra/Titan KN-1811/1812, Giga KN-1012, Hopper KN-3811/3812/2312, Hero 5G KN-4110 | Normal speeds, recommended option |
| mipsel | Giga/Hero KN-1010/1011, Ultra KN-1810, Viva/Skipper KN-1910/1912/1913, Giant KN-2610, Hero 4G KN-2310/2311, Hopper KN-3810 | Will boot, but won’t give high internet speeds |
| mips | Ultra SE/Peak DSL KN-2510, Giga SE/Hero DSL KN-2410, DSL/Omni KN-2010, Hopper DSL KN-3610 | Budget option, some models at 580 MHz |
Separately named KN-3810 and KN-3610 on EcoNet processors: they physically can’t run Xray. If you have one of these — the only thing that helps is to limit proxying to ports 80/443 and trim the geosite/geoip sets. Expecting gigabit speeds is pointless. Another concrete pitfall: on the architecture mipsle do not use Xray core 26.3.27.
Web panel: XKeen-UI
If you don’t want to tinker with SSH, there’s a third-party project XKeen-UI — a panel in TypeScript and Rust that provides config editing with validation, log viewing with filtering, switching and updating Xray/Mihomo cores, generating outbound links, and working with Clash API for Mihomo.
curl https://raw.githubusercontent.com/zxc-rv/XKeen-UI/main/setup.sh | sh
The panel runs on port 1000, the port is changed in /opt/etc/init.d/S99xkeen-ui. Management — with the same script: start, restart, stop, status.
The panel authors warn: opening access to it from the Internet without additional protection is a direct path to compromising the router. Keep it only in the local network, and if you need external access — wrap it in a VPN rather than port-forwarding. A reminder why this is not paranoia: in November 2025 Keenetic forcibly updated devices on KeeneticOS below 4.3 precisely because automatic password scanners were breaking routers with an exposed web configurator and weak passwords.
What XKeen will not do
An honest list of limitations — it’s present right in the project FAQ, and that’s a good sign.
Ping and tracert through a proxy won’t work. ICMP lives at the network layer, proxies operate at the application layer. This isn’t a bug, it’s device incompatibility. You won’t be able to diagnose connectivity with usual tools over a tunnel.
Advertisements on YouTube aren’t cut by routing or DNS — they come from the same addresses as the video. Only SmartTube and similar clients or a subscription help.
WebRTC and QUIC leaks remain possible — a real IP can leak outside the tunnel. Fixed by disabling WebRTC in the browser or blocking UDP/443.
Router is a bottleneck. Transparent proxying is entirely dependent on the router’s CPU. The difference between aarch64 and mips here isn’t “slightly slower,” but orders of magnitude.
And a general note: XKeen solves the routing problem but not the reliability of the transport itself. If your VLESS/Reality throttles DPI — router rules won’t help; the problem lies lower in the stack. There are separate discussions about blocking by symptoms and how Reality works (linked).
Sources
- jameszeroX/XKeen — repository of the current fork
- Release 2.0 — changelog
- Wiki: Configuration — xkeen.json, IPSET, port lists
- Wiki: XKeen modes — TProxy / Hybrid / Redirect / Other
- Wiki: FAQ — typical malfunctions and limitations
- Wiki: DNS over VLESS
- Wiki: DSCP routing
- Wiki: Routers Info — compatibility table
- Wiki: Installation procedure
- zxc-rv/XKeen-UI — web panel
- Corvus-Malus/XKeen — community guide
- Official Keenetic blog: mandatory update to KeeneticOS 4.3
Who has already migrated to 2.0 — what broke during the update, and did you have to reconfigure policies? And separately interested in DSCP: is anyone actually using it in practice, or is it easier to run applications on separate devices?

