AnonymFlow
vpn-protocolsINFO

WireGuard Handshake Works But No Internet: The Five Causes, in Diagnostic Order

A successful handshake proves your keys and your endpoint are fine, which is why the problem is never authentication. Four ping commands narrow it to routing, forwarding, DNS or MTU in about a minute.

By Eric Gerard · Editor · AnonymFlow4 min readPhoto: Pexels

A completed handshake and no traffic is one of the most misleading states in networking, because it looks like a failure while proving that a great deal already works. Understanding what the handshake certifies is what turns this from guesswork into a two-minute diagnosis.

What the handshake already proved

WireGuard's handshake succeeds only if your keys match, the endpoint is reachable, and UDP passes between you and the server. That is a large slice of everything that can go wrong, and it is now ruled out.

So: stop re-generating keys. Stop changing ports. The tunnel is up. What is broken is what happens to packets after they enter it.

A VPN changes your IP. It does not change your browser.

A tunnel replaces the address a service sees. It changes nothing about what your browser announces on its own - fonts, screen, time zone, graphics stack - and that combination is often stable enough to recognise you across sessions, tunnel or no tunnel.

Measure your own browser fingerprint - passive, no questions, no account, no email.

The four commands that locate the fault

Run these in order. Each one rules out everything above it.

#CommandIf it fails, the cause is
1ping 10.0.0.1 (server's tunnel IP)AllowedIPs, traffic is not entering the tunnel
2ping 1.1.1.1Forwarding or NAT on the server
3ping example.comDNS
4Load a real web pageMTU
Two cream-coloured network wall plates seen at an angle, blue and purple cable plugs inserted, one of the sockets glowing bright red
Two wall sockets with cables plugged in, one glowing red. The link is established and the indicator still says something is wrong, which is exactly the state a completed handshake with no traffic puts you in.

1. AllowedIPs, the client never sent the traffic

AllowedIPs on the client is not a permission list. It is a routing table: it tells WireGuard which destinations to send into the tunnel. Set it to 10.0.0.0/24 and only tunnel-internal addresses go through; everything else takes your normal connection, which is why the internet appears untouched by the VPN.

For a full tunnel, the client peer needs AllowedIPs = 0.0.0.0/0, ::/0.

2. Forwarding and NAT, the server received it and dropped it

Two separate settings on the server, and missing either produces the same silence.

IP forwarding must be enabled, or the kernel refuses to pass packets between interfaces. It also resets on reboot unless written into the sysctl configuration, which is why this failure often appears weeks after a working setup, right after a restart.

Masquerading rewrites the source address of packets leaving the server. Without it, your traffic reaches its destination carrying a private tunnel address, and the reply has nowhere to go. Nothing errors; packets simply never come back.

3. DNS, names fail, numbers work

If ping 1.1.1.1 succeeds and ping example.com does not, the tunnel carries traffic and cannot resolve names. Either there is no DNS line in the client config, or it points at a resolver only reachable outside the tunnel.

One trap worth knowing on Linux: the DNS directive requires resolvconf or systemd-resolved to be installed. Without it, the line is silently ignored, indistinguishable from a resolver that is not answering.

4. MTU, the one most guides skip

This is the signature everyone misdiagnoses: ping works, small pages load, then transfers freeze.

Encapsulation adds overhead, so the usable payload inside the tunnel is smaller than on the raw link. When a packet is too large to pass and the ICMP message that would say so is blocked, which is common, the packet is dropped in silence. Small packets sail through, large ones vanish. The connection opens, then hangs.

Set MTU = 1420 on the interface. If it persists, try 1280, the IPv6 minimum, which almost any path will carry.

The order matters more than the list

Every one of these has been written about individually, and that is precisely why the problem takes people hours: five plausible causes, no way to tell them apart, so they try fixes at random and change three things at once.

The four pings above cost about a minute and eliminate roughly one cause each. Run them before touching a configuration file, and change one thing at a time afterwards, so you learn which one it was.

Editorial pick
4.6 / 5

Get NordVPN at its best price

2-year plan · audited no-logs (PwC) · 30-day money-back

Deloitte audit 202430-day guarantee14M+ users
See the offer
Everything you need to know.

Frequently asked questions

What does a successful WireGuard handshake actually prove?

Three things, and only three: your keys match, the endpoint address and port are reachable, and UDP gets through the network between you. That is why a working handshake rules out the entire category of authentication and connectivity problems. If traffic still does not flow, the fault is downstream - in routing, forwarding, DNS or packet size - and nothing you change in your keys will help.

How do I tell which of the causes it is?

Four commands, in this order. Ping the server's tunnel address (usually 10.0.0.1): if that fails, your AllowedIPs are not routing traffic into the tunnel. Then ping 1.1.1.1: if that fails, the server is not forwarding or not masquerading. Then ping a domain name: if that fails while 1.1.1.1 works, it is DNS. Then load a real web page: if it stalls after connecting, it is MTU. Each step rules out everything above it.

Why does ping work but web pages hang?

That is the MTU signature, and it is the cause most guides omit. Ping sends tiny packets that fit anywhere; a web page sends full-size ones. If the tunnel's MTU is larger than the path can carry and the ICMP messages that would say so are blocked, large packets are silently dropped. The connection opens, then freezes mid-transfer. Lowering the interface MTU to 1420, then 1280 if needed, is the usual fix.

I set AllowedIPs to 0.0.0.0/0 and still nothing. What now?

Then the client is doing its job and the server is not. On the server, check that IP forwarding is on (net.ipv4.ip_forward must be 1, and it resets on reboot unless written into sysctl configuration), and that a masquerade rule rewrites the source address of outgoing packets. Without masquerading, your traffic leaves the server carrying a private tunnel address that the wider internet has no route back to.

Everything resolves by IP but names do not work

DNS. Either no DNS line in the client configuration, or one pointing at a resolver only reachable outside the tunnel. Set DNS to a resolver the tunnel can reach - the server's own tunnel address if it runs one, or a public resolver. Note that on Linux the DNS directive needs resolvconf or systemd-resolved installed; without it the line is silently ignored, which looks exactly like a DNS server that is not answering.

Does this mean my VPN provider is at fault?

Rarely, if you are using a commercial provider's own app - it ships a configuration that handles all four of these. These symptoms overwhelmingly appear on hand-written configurations, self-hosted servers, or configs copied from a tutorial written for a different network layout. The fix is in your own files, not with the provider.