Every VPS comparison on this site lists it: "single /128 IPv6 by default", "/64 IPv6", "no IPv6 on the base plan". It reads like a spec-sheet detail. For a self-hosted WireGuard server it is not - it decides whether your peers can have IPv6 at all.
WireGuard does not care which stack you use
Start with the easy part. The WireGuard documentation is explicit: "Any combination of IPv4 and IPv6 can be used, for any of the fields."
The endpoint can be IPv4 while the tunnel carries IPv6, or the reverse. There is no separate IPv6 mode to enable and no second daemon to run. A dual-stack tunnel is just two addresses on the same interface.
What /64 and /128 actually mean for you
This is where the host's spec sheet starts to matter.
A /128 is one single address. It is your server's own IPv6 and nothing more. You can give the server IPv6 connectivity, but you have no addresses left to hand out - your peers cannot each have one.
A /64 is a block. It is the standard allocation size for a single network segment, and it leaves you free to assign an address to every peer from inside it.
So a host advertising "IPv6 included" with a single /128 is telling the truth and still not giving you what a VPN server needs. That is the line worth reading twice in a comparison table, ours included.
AllowedIPs does two different jobs
This is the part people get wrong, and it is documented plainly. The same field behaves differently depending on direction:
"when sending packets, the list of allowed IPs behaves as a sort of routing table"
"when receiving packets, the list of allowed IPs behaves as a sort of access control list"
WireGuard calls the whole arrangement a Cryptokey Routing Table - "the simple association of public keys and allowed IPs".
The consequence for IPv6 is direct: if you want a peer's IPv6 traffic to go through the tunnel, ::/0 has to be in its AllowedIPs. Setting 0.0.0.0/0 alone routes IPv4 only, and the peer's IPv6 traffic leaves through its normal connection - outside the tunnel, with its real address.
That is a leak, and it is not a WireGuard bug. It is the access control list doing exactly what it was told.
The configuration in practice
On the server, give the interface both an IPv4 and an IPv6 address from your allocation. On each peer, list both stacks in AllowedIPs. If you want everything tunnelled, that is 0.0.0.0/0, ::/0; if you want a split, list the specific prefixes for each stack.
Two things to keep in mind. Forwarding has to be enabled for both families, not just IPv4 - they are separate sysctl settings, and enabling one does nothing for the other. And your firewall rules exist twice as well: iptables and ip6tables are different tables, so a masquerade or a kill switch written only for IPv4 leaves IPv6 unprotected.
Verify rather than assume
After setting it up, check from the client that your public IPv6 is the server's and not your own. A tunnel that carries IPv4 correctly while leaking IPv6 looks perfectly healthy from the inside - the handshake succeeds, traffic flows, and nothing in the logs complains.
If your host only gives you a /128, the honest options are to run IPv4-only in the tunnel and block IPv6 on the peers so it cannot leak, or to change host. Half-configured dual stack is worse than no IPv6 at all.

★ Nuremberg GDPR datacenter · ✓ Dedicated IPv4 included · 200+ Mbps guaranteed
Self-host your VPN on your own VPS → ContaboFull root access · public IPv4 · pick your region→


