VLESS Reality is the most detection-resistant proxy protocol available in 2026, but its advanced security features mean that misconfigurations produce cryptic error messages. This guide covers every common VLESS error, explains exactly what causes it, and provides the precise fix. All solutions are tested on xray-core 25.x with V2rayN 7.x and v2rayNG 1.9.x as of April 2026.
Error: "VLESS Reality Handshake Failed"
What This Error Means
The VLESS Reality handshake is a cryptographic key exchange that happens inside what looks like a normal TLS connection. When this error appears, the client successfully connected to the server on the network level, but the Reality authentication failed. The server rejected the client's credentials.
What Causes It
- Mismatched public key: The client's
pbk(public key) does not match the server's private key. This is the most common cause. - Wrong shortId: The
sid(short ID) in the client config is not in the server'sshortIdsarray. - SNI mismatch: The
sniin the client does not match any entry in the server'sserverNamesarray. - Server not running Reality: The server is configured for regular TLS, not Reality, but the client is trying to use Reality.
How to Fix It
Step 1: On the server, regenerate and verify the key pair:
xray x25519
# Output:
# Private key: MC4CAQAwBQYDK2VuBCIE... (use this in server config)
# Public key: MCowBQYDK2VuAyEA... (give this to client)
Step 2: Verify the server config contains the private key and shortIds:
"realitySettings": {
"dest": "www.microsoft.com:443",
"serverNames": ["www.microsoft.com"],
"privateKey": "YOUR-PRIVATE-KEY-HERE",
"shortIds": ["abcdef1234", ""]
}
Step 3: Verify the client config uses the matching public key:
vless://uuid@server:443?security=reality&pbk=YOUR-PUBLIC-KEY&sid=abcdef1234&sni=www.microsoft.com&fp=chrome&flow=xtls-rprx-vision#name
Step 4: Ensure the sni matches a serverNames entry exactly (case-sensitive, including www. prefix if present).
Step 5: Restart xray-core after any config change:
sudo systemctl restart xray
Error: "Connection Refused" / "Connection Timeout"
What This Error Means
The client cannot establish a TCP connection to the server at all. The connection either gets actively rejected (connection refused, meaning the server's port is closed) or silently dropped (connection timeout, meaning packets are being blocked by a firewall).
What Causes It
- Firewall blocking port 443: The server's firewall (iptables, ufw, or cloud provider security group) is not allowing incoming connections on the configured port.
- xray-core not running: The xray process crashed or was not started.
- Wrong server IP or port: The client config points to the wrong address.
- ISP/network blocking: The client's network is blocking outbound connections to the server IP.
- Server overloaded: The server has too many connections and is refusing new ones.
How to Fix It
Step 1: Verify xray-core is running on the server:
sudo systemctl status xray
# Should show "active (running)"
# If not running:
sudo systemctl start xray
sudo journalctl -u xray -n 50 --no-pager # Check for startup errors
Step 2: Verify the port is open and listening:
sudo ss -tlnp | grep 443
# Should show xray listening on 0.0.0.0:443 or [::]:443
Step 3: Check firewall rules:
# UFW:
sudo ufw status
sudo ufw allow 443/tcp
# iptables:
sudo iptables -L INPUT -n | grep 443
# Cloud providers: check security group / firewall rules in the web console
Step 4: Test connectivity from the client side:
# From client machine:
telnet your-server-ip 443
# Or:
curl -v https://your-server-ip:443 --connect-timeout 5
Step 5: If timeout persists, the server IP may be blocked by the client's ISP. Test from a different network (mobile data, different Wi-Fi) to confirm. If the IP is blocked, you need to change the server IP or use a CDN relay.
Error: "TLS: Failed to Verify Certificate"
What This Error Means
The client is trying to verify a TLS certificate during the connection, but verification fails. This error typically occurs when using standard VLESS+TLS (not Reality) or when the client is misconfigured to use TLS verification with a Reality connection.
What Causes It
- Using TLS mode instead of Reality: The client's
securityis set totlsinstead ofreality. - Expired certificate: If using standard VLESS+TLS (not Reality), the Let's Encrypt certificate has expired.
- Wrong SNI: The SNI in the client does not match the certificate's domain.
- Self-signed certificate: The server uses a self-signed cert without the client being configured to accept it.
How to Fix It
For VLESS Reality users: Ensure your client config uses security=reality, not security=tls. Reality does not use traditional TLS certificate verification. The connection string should look like:
vless://uuid@server:443?security=reality&...
Not:
vless://uuid@server:443?security=tls&...
For standard VLESS+TLS users: Renew the certificate:
# If using certbot:
sudo certbot renew
sudo systemctl restart xray
# If using acme.sh:
~/.acme.sh/acme.sh --renew -d your-domain.com --force
sudo systemctl restart xray
Verify certificate status:
echo | openssl s_client -connect your-domain.com:443 -servername your-domain.com 2>/dev/null | openssl x509 -noout -dates
Error: "DNS Leak Detected"
What This Error Means
Your proxy tunnel is working for HTTP/HTTPS traffic, but DNS queries are bypassing the tunnel and going directly to your ISP's DNS servers. This means your ISP (or anyone monitoring your network) can see which domains you are visiting, even though the actual page content is encrypted through the VLESS tunnel.
What Causes It
- DNS not routed through tunnel: The client is only tunneling TCP traffic, not DNS queries.
- System DNS override: The operating system's DNS settings are overriding the tunnel's DNS configuration.
- Split tunneling misconfigured: Only some traffic goes through the proxy, and DNS is in the "direct" category.
How to Fix It
V2rayN (Windows):
- Go to Settings, then Core: basic settings
- Set "Domain Strategy" to
IPIfNonMatch - Under DNS settings, add a DNS server that routes through the proxy:
{ "dns": { "servers": [ "8.8.8.8", { "address": "1.1.1.1", "domains": ["geosite:geolocation-!cn"] } ] } } - Enable "Sniffing" in the inbound settings to capture DNS queries from the TUN interface.
v2rayNG (Android):
- Tap the server entry, then Edit
- Scroll to "Domain Strategy" and set to
IPIfNonMatch - Under "DNS", add
8.8.8.8or1.1.1.1 - Enable "Enable local DNS" and set it to
1.1.1.1 - Enable "Enable sniffing"
Verify the fix: Visit browserleaks.com/dns while connected. All DNS servers listed should be the ones you configured (8.8.8.8, 1.1.1.1), not your ISP's servers.
Error: "xray-core: Failed to Start"
What This Error Means
The xray-core binary cannot start, usually because of a configuration file error. This error appears in the system journal (server-side) or in the V2rayN log panel (client-side).
What Causes It
- Invalid JSON in config: A missing comma, extra comma, or mismatched bracket in
config.json. - Port already in use: Another process (nginx, Apache, another xray instance) is already listening on port 443.
- Missing binary permissions: The xray binary does not have execute permissions.
- Incompatible config version: Config syntax from an older xray version that is no longer supported.
How to Fix It
Step 1: Check the exact error message:
# Server (systemd):
sudo journalctl -u xray -n 100 --no-pager
# V2rayN: Click the log icon in the bottom-left corner of the main window
Step 2: Validate the JSON config:
# Test config without starting:
xray run -test -c /usr/local/etc/xray/config.json
# Or use jq to check for JSON syntax errors:
jq . /usr/local/etc/xray/config.json > /dev/null
Step 3: Check for port conflicts:
sudo ss -tlnp | grep 443
# If another process is using 443, either stop it or change xray's port
Step 4: Verify binary permissions:
ls -la /usr/local/bin/xray
# Should show -rwxr-xr-x. If not:
sudo chmod +x /usr/local/bin/xray
Common JSON mistakes to check:
- Trailing comma after the last item in an array or object:
["item1", "item2",](remove the last comma) - Missing quotes around string values:
"port": 443is correct,"port": "443"is wrong for numeric fields - Using single quotes instead of double quotes: JSON requires double quotes exclusively
Error: "V2rayN Green Tray Icon but No Connection"
What This Error Means
V2rayN shows a green system tray icon (indicating the local proxy is running), but no traffic actually passes through the proxy. Websites load slowly or not at all, or they load using your real IP instead of the proxy IP.
What Causes It
- System proxy not set: V2rayN started its local SOCKS/HTTP listener, but the operating system is not configured to use it.
- Wrong proxy mode: V2rayN is set to "Direct" mode instead of "Global" or "Rule-based" proxy mode.
- TUN mode not activated: Some applications bypass the system proxy settings and need TUN (virtual network adapter) mode to be proxied.
- Antivirus/firewall blocking local proxy: Windows Defender or a third-party security tool is blocking V2rayN's local listener.
How to Fix It
Step 1: Check the proxy mode in V2rayN's bottom status bar. Click it to cycle through modes:
- Global: All traffic goes through the proxy (use this for testing)
- Rule-based: Only traffic matching rules goes through the proxy
- Direct: No traffic is proxied (this is your problem if you are in this mode)
Step 2: Verify the system proxy is set. Open Windows Settings, then Network and internet, then Proxy. You should see "Manual proxy setup" enabled with address 127.0.0.1 and port 10809 (or whatever port V2rayN uses).
Step 3: If applications still bypass the proxy, enable TUN mode in V2rayN:
- Go to Settings, then TUN mode settings
- Enable "TUN mode"
- V2rayN will request administrator privileges to create the virtual network adapter
- All system traffic (including apps that ignore system proxy settings) will now go through the tunnel
Step 4: Add V2rayN to your antivirus exceptions list. In Windows Defender: Virus and threat protection, then Manage settings, then Exclusions, then add the V2rayN installation folder.
Error: "Time Synchronization Error"
What This Error Means
VLESS Reality's handshake includes a timestamp validation step. If the client's system clock differs from the server's clock by more than approximately 90 seconds, the handshake is rejected. This is a security feature to prevent replay attacks.
What Causes It
- Wrong system time: The client's clock is set incorrectly (wrong timezone or drifted time).
- NTP disabled: The client's automatic time synchronization is turned off.
- Server time drift: The server's clock has drifted (less common on cloud VMs with NTP, more common on bare-metal servers).
How to Fix It
Windows:
# Open PowerShell as Administrator:
w32tm /resync
# Or: Settings then Time and language then Date and time then "Sync now"
Linux (server):
# Check current time:
timedatectl
# Enable NTP:
sudo timedatectl set-ntp true
# Force immediate sync:
sudo systemctl restart systemd-timesyncd
# Or if using chrony:
sudo chronyc makestep
Android: Settings, then System, then Date and time, then enable "Automatic date and time" and "Automatic time zone."
macOS:
# System Settings then General then Date and Time then "Set time and date automatically"
# Or from Terminal:
sudo sntp -sS time.apple.com
Verify both sides:
# On server:
date -u
# On client:
# Compare with https://time.is/ -- difference should be under 30 seconds
Skip VLESS Server Management Entirely
Every error on this page has one thing in common: they come from managing your own VLESS server. You need to configure xray-core, maintain certificates (for non-Reality setups), keep the server updated, monitor uptime, and debug cryptic error messages when something breaks.
There is a simpler approach: use a VLESS endpoint that is already configured, monitored, and running on real mobile carrier infrastructure.
Proxy Poland provides VLESS endpoints on physical 4G modems connected to Polish mobile carriers (Orange, T-Mobile, Play). You get a vless:// connection string. Paste it into V2rayN, v2rayNG, or Streisand. Done. No server to manage, no xray-core to update, no firewall rules to configure, no certificates to renew.
Your VLESS traffic exits through a genuine CGNAT mobile IP, which means it is classified as real mobile user traffic by every anti-bot system. The combination of VLESS Reality's protocol-level stealth and a real carrier IP's network-level trust is the strongest proxy setup available.
- Provisioned in under 5 minutes
- 1-click IP rotation (new carrier IP in 1-5 seconds)
- HTTP, SOCKS5, and VLESS endpoints on the same modem
- 24/7 monitoring and automatic modem recovery
- No VPS, no xray-core, no configuration files