Torrify routes your whole system through Tor on top of your active VPN connection. It works over most Kodachi protocols, but bare system torrify does not work over xray-vless-reality (XTLS Vision) by default. This is a known, by-design limitation of the XTLS Vision flow, not a Kodachi bug.
Root cause. The Reality protocol uses XTLS Vision (flow: xtls-rprx-vision). Vision is designed to detect the TLS handshake inside the tunnel, pad it, and then splice the raw stream directly, bypassing an extra TLS wrapper. Tor relay connections are themselves TLS, so when your system is torrified over Reality, Vision sees Tor's nested TLS handshake as an anomaly, mangles the stream, and Tor gets stuck at roughly 10% bootstrap with unexpected eof while reading / TLS_ERROR on every relay. The Xray-core project closed the relevant issue (#3206) as "not planned" because the behavior is intentional: Vision is built to splice exactly one TLS layer and a second nested TLS layer breaks that assumption.
How it was confirmed. All tests used the same exit server (198.105.112.55). Through that server, switching to xray-vmess (no Vision flow) or WireGuard made Tor bootstrap to 100% and exit through a real Tor IP. Only xray-vless-reality failed. The failure is Vision-specific, not server-specific.
Fix 1: use an obfs4 bridge (works today, verified). obfs4 wraps Tor's traffic in obfuscated, non-TLS bytes. Vision's TLS-in-TLS detection never triggers because there is no TLS handshake for it to find. With an obfs4 bridge configured in Tor Browser, Tor bootstrapped to 100% over a Reality VPN connection and exited through a real Tor node. Configure Tor Browser to use obfs4 bridges (Settings > Connection > Use a bridge > obfs4) and use it on top of your Reality connection. Kodachi is adding bridge support to the system-wide tor-switch torrify command so the full system can torrify over Reality via bridges without needing Tor Browser specifically.
Fix 2: switch to a non-Vision protocol for Tor (no bridges needed). WireGuard and OpenVPN use native kernel routing with no TLS splicing involved, so plain system torrify works over both. xray-vmess, Shadowsocks, V2Ray, Hysteria2, and Mita/Mieru also carry no Vision flow, so torrify works over them as well.
Protocol compatibility table.
| Protocol |
Routing type |
Bare torrify |
With obfs4 bridge |
Notes |
| WireGuard |
Native kernel (wg0) |
Works (verified) |
Works |
Recommended for VPN-over-Tor. No proxy layer involved. |
| OpenVPN |
Native kernel (tun0) |
Works (expected) |
Works |
Same native-routing model as WireGuard. Not individually tested with torrify but the mechanism is identical. |
| xray-vmess |
tun2socks, no Vision |
Works (verified) |
Works |
No XTLS Vision flow. Tor bootstrapped to 100% in testing through the same server that failed under Reality. |
| Shadowsocks / V2Ray / Dante / Mita / Hysteria2 |
tun2socks, no Vision |
Works (expected) |
Works |
Non-Vision proxy stack. Not all individually tested with torrify, but none carry the xtls-rprx-vision flow so the incompatibility does not apply. |
| xray-vless-reality (Reality) |
tun2socks, XTLS Vision |
Does NOT work (verified) |
Works (verified) |
Vision mangles Tor's nested TLS handshake. Tor stalls at ~10% bootstrap. An obfs4 bridge bypasses it: this works today in Tor Browser (Settings > Connection > Use a bridge > obfs4) on top of a Reality connection, and in system torrify once Kodachi bridge support ships. |
| Other XTLS Vision profiles (e.g. vless-TLS or trojan using xtls-rprx-vision) |
tun2socks, Vision |
Likely fails (same cause) |
Works with obfs4 bridge |
Any Xray profile using the xtls-rprx-vision flow has the same limitation. Not individually tested, but the root cause applies equally. |
The underlying reason is XTLS Vision's TLS-in-TLS handling. There is no server-side or client-side configuration that makes plain (non-bridged) Tor survive through a Vision-enabled Xray path. You must either drop Vision (switch protocol) or use an obfs4 bridge.