TROUBLESHOOTING
WireGuard Handshake Failures: Causes and Fixes
Nothing is more frustrating than a VPN tunnel that just sits there spinning, and the fix for WireGuard handshake failed errors is usually simpler than it…
✓What a failed handshake actually✓Top causes: wrong keys, blocked✓Log-guided fixes for each cause
Quick Answer
A WireGuard handshake failure almost always means the two sides cannot reach or recognize each other: wrong keys, blocked UDP, a CGNAT-blocked home connection, or a stale endpoint address. It is a reachability or identity problem, not a broken protocol. HomeIPVPN troubleshooting starts by confirming the symptom is truly a handshake failure.
- Confirm it: no data transferred and repeated initiation attempts, while the server logs stay silent.
- Keys: mismatched public keys are the top cause after hand-editing configs; check each side references the other.
- Blocked UDP: hotel, airport, and corporate networks sometimes block UDP entirely, so try another port.
- CGNAT: if your home ISP uses carrier-grade NAT, inbound connections never arrive; fix the path before anything else.
Nothing is more frustrating than a VPN tunnel that just sits there spinning, and the fix for WireGuard handshake failed errors is usually simpler than it looks. A handshake is WireGuard's way of introducing the client and server to each other: they exchange cryptographic messages, verify keys, and agree on session keys before any data flows. When that introduction fails, the tunnel never comes up. This guide explains what a failed handshake actually means, the most common causes, and how to fix each one using the logs your router or app already gives you.
What a failed handshake actually means
WireGuard is a "silent" protocol: unlike some VPNs, it doesn't send error messages back to the client. The client periodically sends handshake initiation packets, and if nothing comes back, it keeps retrying. In the logs you'll see repeated "handshake did not complete" style messages on the client, while the server logs show… nothing. That silence is normal WireGuard behavior, not a special error. It means your initiation packets never reached a working server, or the replies never made it back.
Key insight: a failed handshake is almost always a reachability or identity problem, not a broken protocol. The two sides either can't talk to each other on the network, or they don't recognize each other's keys. That narrows your troubleshooting to a short list.
Before diving in, confirm the symptom is really a handshake failure and not something else: the client shows no data transferred (0 B sent or sent bytes that never get replies), there is no successful connection, and the issue persists across networks. If the tunnel connects but no websites load, that's a routing or DNS problem, not a handshake failure.
Top causes: wrong keys, blocked UDP, CGNAT, clock skew
1. Wrong or mismatched keys. Every WireGuard peer is identified by its public key. If the client's config contains the wrong server public key, or the server's peer list contains the wrong client public key, the cryptographic exchange silently fails. This is the most common cause after editing configs by hand. Double-check that each side's config references the other side's public key, and that you haven't accidentally swapped private and public keys.
2. UDP blocked on the path. WireGuard uses UDP (typically port 51820, though many home setups use custom ports). Hotel, airport, and corporate networks sometimes block UDP entirely or block non-standard ports. If your tunnel works from home but fails from a hotel, UDP blocking is the prime suspect.
3. The server isn't reachable: wrong endpoint or no port forward. If the client's endpoint address or port is wrong, initiation packets go nowhere. Similarly, if the home router's port forward to the VPN server is misconfigured (wrong internal IP, wrong port, or UDP not forwarded), the packets arrive at the home network but die at the router.
4. CGNAT at home. If your home ISP uses Carrier-Grade NAT, your router doesn't have a public IP address, so inbound WireGuard packets can never reach your server no matter how perfect the port forward is. The handshake will fail 100% of the time from outside. This one is insidious because everything looks correct locally.
5. Clock skew. WireGuard handshakes include timestamps to prevent replay attacks. If the client's clock is badly off (dead CMOS battery, a travel router that lost time), the server may reject handshakes. Modern devices sync time automatically, but a router with no internet access at boot can start with a wrong clock.
6. Server not running. The obvious one: after a power outage or firmware update, the WireGuard server process on the home router may not have restarted. Always verify the server is actually listening before chasing network ghosts.
Log-guided fixes for each cause
Step 1. Verify the server is listening. On the home router or server, check that WireGuard is running and listening on the expected UDP port. In GL.iNet's admin panel, the VPN server page shows its status; on a Linux server, a quick check of the WireGuard interface status shows whether the interface is up.
Step 2. Confirm the endpoint. From the client side, verify the endpoint address and port in the client config. If you use a DDNS hostname, resolve it from the client's network to confirm it points at your current home public IP. A stale DDNS entry after an IP change looks exactly like a dead server.
Step 3. Check keys both ways. Compare the public key in the client config against the server's actual public key, and the peer public key on the server against the client's actual public key. Regenerate the peer config from the server side (QR code or exported file) rather than hand-editing. This eliminates transcription errors.
Step 4. Test from a known-good network. Connect the client from a phone hotspot. If the handshake succeeds there but fails on hotel Wi-Fi, the hotel network is blocking UDP. Switch the server to a commonly-open port or use a TCP-based fallback.
Step 5. Rule out CGNAT. Compare your home router's WAN IP with your public IP (search "what is my IP"). If they differ, you're behind CGNAT: no port forward will ever work, and you'll need a relay-based approach instead.
Step 6. Check the clock. Make sure both devices show the correct date and time. On travel routers, enabling NTP and giving the router a minute of internet access before starting the VPN resolves most clock issues.
| Symptom | Likely cause | First thing to check |
|---|---|---|
| Never connects from anywhere | Wrong keys or server down | Key match + server status |
| Works at home, fails at hotel | UDP blocked by hotel network | Try phone hotspot |
| Fails from outside, fine on LAN | Bad port forward or CGNAT | WAN IP vs public IP test |
| Stopped working after IP change | Stale DDNS | Resolve hostname, check DDNS |
| Fails after router reboot | Server didn't auto-start | Server status page |
FAQ
How long should a WireGuard handshake take?
Does "handshake did not complete" mean my keys are wrong?
Why does my tunnel work on mobile data but not hotel Wi-Fi?
Can a firewall cause handshake failures?
My server was working and suddenly stopped. What changed?
Should I just reinstall everything?
Need help setting this up?
Handshake failures are annoying because WireGuard gives you so little to go on. If you'd like a second pair of eyes, our VPN audit walks through your whole setup, keys, ports, firewall, DNS, the lot, and tells you exactly what's wrong. Details at https://homeipvpn.com.

