VLESS + REALITY, in plain English
I was on airport WiâFi, trying to send a build log to a teammate. WireGuard wouldnât handshake. Shadowsocks connected, then died a minute later. The only thing that stayed up was a VLESS+REALITY profile Iâd forgotten I still had installed.
Thatâs the moment REALITY clicked for me.
VLESS is boring on purpose
VLESS is not the clever part. VLESS is the âcarry the bytesâ part.
If youâve used Xray-core (or anything based on it), youâve seen VLESS as one of the outbound choices. By itself, VLESS doesnât try to look like anything. It also doesnât try to encrypt anything. Itâs basically an identification + transport wrapper that expects the outer layer (TLS, REALITY, or something else) to do the heavy lifting.
That design choice is why youâll see people pair VLESS with things like:
- VLESS + REALITY (the topic here)
- VLESS + TLS (the classic âwebsocket behind a CDNâ era)
- VLESS + XTLS Vision (when you control both ends and care about throughput)
Censors donât block âVLESSâ as a word. They block patterns: handshakes, packet timing, cipher suites, and the little tells that scream âthis is a tunnel.â
REALITY is one of the better attempts at removing those tells.
What REALITY actually does
REALITY is part of the XTLS/Xray ecosystem. If you want the mental model, think âTLS camouflage without running a normal TLS service.â
A regular TLS server has a certificate. It sends that certificate in cleartext during the handshake. Middleboxes and DPI boxes love that. Itâs stable, parseable, and it gives them hooks to match on.
REALITY flips the script:
- The connection looks like a client talking TLS to a normal website.
- The server does not present its own certificate chain the way a typical TLS service would.
- Client and server authenticate each other using a public key (X25519 in practice) plus a few extra parameters.
So instead of standing up âvpn.example.comâ with a cert that becomes a big blinking target, the server pretends itâs just another HTTPS endpoint, and it does the verification using keys that are meaningful only to the client and server.
If youâve ever had a censor block you by SNI or TLS fingerprinting, this is why REALITY feels different. It tries hard to resemble the sort of TLS traffic that would break half the internet if it got blocked.
Itâs not magic. Itâs misdirection.
Why it survives blocks that kill WireGuard
WireGuard is still my default when I can get away with it. Itâs simple, fast, and the codebase is small enough that I can explain it to a coworker without pulling up slides.
The problem is that WireGuard traffic is distinctive. Itâs UDP. The handshake has recognizable structure. A lot of networks just take the lazy route and throttle UDP hard or kill it entirely. Some places go further and fingerprint the handshake.
REALITY usually rides over TCP on port 443, and it tries to look like gardenâvariety HTTPS. That matters because a censor has a much harder time blocking â443/TCP that looks like TLS to common sitesâ without angering normal users.
There are a few censorship moves REALITY is specifically good against:
- SNI filtering: blocking based on the hostname in the TLS ClientHello.
- TLS fingerprint matching: spotting unusual client hellos, weird extension order, rare cipher suite choices.
- Active probing: connecting to a suspected proxy IP to see if it behaves like one.
REALITY can still lose. If the server IP is blocked, youâre done. If the network is doing aggressive traffic shaping, you can get stalls. And if you pick a âfakeâ destination (the site you impersonate) thatâs unpopular or itself blocked, youâve sabotaged the whole point.
Still, in practice, REALITY gives you a shape of traffic that blends in better than most.
The config looks scary, but itâs the same four knobs
When people bounce off REALITY, itâs rarely because the crypto is hard. Itâs because the config has a bunch of fields with names that feel like they came straight from a GitHub issue thread.
Hereâs what a typical VLESS+REALITY profile needs, regardless of client:
- Server address and port (often port 443)
- UUID (your VLESS user id)
- Public key (the serverâs REALITY public key)
- SNI / ServerName (the hostname you want the traffic to resemble)
- ShortID (a small hex id the server expects)
Sometimes youâll also see a flow like xtls-rprx-vision. If your provider supplies a link, donât âoptimizeâ it by changing fields at random. REALITY is picky about matching what the server is configured to accept.
This part is annoying, honestly.
Clients people actually use
If youâre testing this on your own gear, these are the apps I keep seeing in real setups:
- V2RayNG (Android)
- NekoBox (Android, and forks exist for desktop)
- Shadowrocket (iOS)
- Hiddify (multi-platform, depends on build)
- v2rayN (Windows)
On OpenWrt, youâre usually dealing with sing-box or Xray as a service rather than a âclient app,â and the pain shifts from UI taps to config files and firewall rules.
Phones are messy.
Between battery savers, captive portals, and networks that flip you between LTE and WiâFi mid-session, your tunnel is going to get knocked around. REALITY can handle reconnects fine, but youâll feel the difference between a stable wired line and a mobile network with packet loss.
Performance: fast enough, but not always smooth
The speed story with VLESS+REALITY is mostly about physics and transport choices.
WireGuard over UDP tends to be snappy under loss because it doesnât have TCPâs head-of-line blocking. With REALITY, youâre often on TCP, so one bad patch of packet loss can trigger retransmits and backoff. Youâll see it as a pause in a video call or a download that suddenly âthinksâ for a second.
Latency can be great if the server is close.
Latency can also be weird if you pick a server across the planet, then run everything through a tunnel that already has extra handshake and filtering logic. No free lunch.
Battery is the other trade-off people ignore until it bites them. Keeping a tunnel up on iOS or Android means keepalives. Keepalives mean radio wakeups. If youâre on a flaky network and the client keeps reconnecting, itâs even worse. In practice, Iâve found REALITY profiles that are stable tend to be fine on battery, and unstable ones drain fast, because the phone never gets to settle.
If you want to sanity-check whether youâre fighting the network or your config, try two tests:
1) Run the same profile on macOS or Windows over a stable WiâFi connection.
2) Then try it on mobile data while walking around.
If it only breaks on mobile, itâs probably packet loss or carrier shaping, not some mystical REALITY failure.
Where REALITY fits next to Shadowsocks-2022 and friends
I still keep a couple tools in the kit because networks vary.
Shadowsocks-2022 can be a solid fallback when you need something lightweight and youâre not dealing with sophisticated DPI. Hysteria2 and TUIC exist for people who want UDP-based performance while still trying to survive hostile networks, though they come with their own fingerprinting and tuning challenges.
REALITY sits in a sweet spot for âlooks like normal TLSâ without requiring you to play games with CDNs or hostnames you donât control.
The catch is server management. If youâre self-hosting, you need to care about server IP reputation, routing quality, and keeping your Xray-core build current. If youâre not self-hosting, youâre trusting a provider to do that work and to expose sane configs.
If youâre comparing providers, Iâd focus less on shiny claims and more on whether they explain what they run and how youâre supposed to connect. A decent feature breakdown should tell you which protocols are available and which platforms they support without forcing you to guess.
Practical advice I wish someone told me earlier
Pick the âfakeâ destination carefully. REALITY needs a ServerName (SNI) that makes sense. If you choose an obscure domain or something already blocked on that network, youâve built a disguise out of a mask everyone recognizes.
Also, donât over-tweak. People love to flip every transport knob because they saw a screenshot on a forum. Most of the time, using the providerâs shared link or QR code is the least painful route.
When you do need to debug, check the simple stuff first: wrong time on the device, a captive portal you didnât accept, or a firewall that blocks outbound 443/TCP unless youâve opened the browser once.
If youâre the kind of person who wants to know what youâre paying for, skim the pricing details and then immediately check the FAQ for setup notes and the usual âwhy canât I connect on hotel WiâFiâ questions. Those two pages tell you more than a dozen breathless blog posts.
A low-friction way to run it
If you just want working configs without babysitting a server, DuduVPN is a practical option, and grabbing profiles via their Telegram bot is convenient when youâre setting up a second phone or moving between Android and iOS.
One last tip: if REALITY connects but you get random timeouts, try changing the ServerName (SNI) to a different high-traffic hostname and keep the rest of the profile exactly the same.
Related articles
Picking a VPN that stays up at 7 p.m.
Peak-hour VPN drops are usually capacity, protocol, or client issues. Hereâs how to test providers and pick one that stays connected.
What a no-logs VPN promise really covers
No-logs sounds simple, but it isnât. Learn what VPNs can still see, which logs matter, and how to sanity-check a providerâs policy.
VPN vs Proxy: What Do You Actually Need?
VPN or proxy? A practical, engineer-tested guide to what each hides, what leaks, and when a full VPN like DuduVPN is worth it on WiâFi or at work.
Can a VPN really lower your game ping?
A practical, engineer-style guide to when a VPN helps gaming latency, when it makes it worse, and how to test routes, jitter, and packet loss.