run-as-daemon.dev
← Writing
vpn · networking · quic

Your anti-DDoS provider is eating your VPN — and QUIC is hiding it

2026-07-20 · ~7 min

Two failure modes that look like "the server is broken" but aren't. One is your hosting provider silently scrubbing UDP. The other is Google refusing to fall back from QUIC. Both are one line to fix once you can see them.

Failure #1 — inbound UDP that never arrives

You stand up a WireGuard / AmneziaWG server on a DDoS-protected host. The daemon is listening. The keys are right. Clients time out. Meanwhile the same box happily joins your mesh as a client and passes traffic all day.

That contradiction is the whole clue. Many scrubbing providers pass outbound-initiated flows (your node dialing out to a hub keeps a NAT mapping open) but drop unsolicited inbound UDP to your listen port. So:

How to confirm it (without lying to yourself)

Do not trust a single nc -u probe — a garbage datagram is not a valid handshake and gets dropped for unrelated reasons, giving false "blocked" readings even on a working host. Instead:

The fixes

The host isn't broken. The network in front of it has opinions. Diagnose the path, not just the daemon.

Failure #2 — Google/AI apps hang over a working tunnel

Now the tunnel is up and general browsing works — but Gemini, Google, YouTube stall or won't load. The exit node itself reaches them fine (curl to the API returns a normal 400 "API key not valid"; the web endpoints return 200). So why does the client hang?

QUIC. Google's clients try HTTP/3 over QUIC (UDP/443) first. Through a proxy tunnel that QUIC path often can't complete, and the app sits there instead of cleanly falling back to TCP/HTTP2.

The one-line fix — block QUIC egress, force the fallback

Reject UDP/443 on the exit so clients drop to TCP immediately. In an Xray-style router:

"routing": { "rules": [
  { "type": "field", "network": "udp", "port": 443, "outboundTag": "block" }
]}

In a Hysteria2 ACL:

acl:
  inline:
    - reject(all, udp/443)
    - direct(all)

Restart, reconnect. Google and Gemini load over TCP, which the tunnel carries reliably. It's counter-intuitive — you fix "can't reach Google" by blocking a Google protocol — but forcing the well-behaved fallback is exactly the point.

Takeaway

Both bugs share a shape: the endpoint is healthy, the transport assumptions are wrong. UDP you assumed would arrive gets scrubbed; QUIC you assumed would fall back doesn't. Production networking is mostly this — the daemon is fine, the path has a personality, and the fix is to stop assuming and start measuring end-to-end.

This is what keeping infrastructure alive under hostile conditions actually looks like. If your business can't afford the guessing, that's the service: ftops.space.