VPN protocols at home: where WireGuard, OpenVPN and IKEv2 differ

Choose the protocol last. WireGuard, OpenVPN and IPsec with IKEv2 are the three options still worth running at home, and the useful difference between them is not a speed ranking but a failure mode: each one breaks somewhere the other two do not. Leviathan Security's TunnelVision disclosure of 6 May 2024 (CVE-2024-3661) makes the case better than a benchmark. The researchers pushed traffic out of the tunnel using a DHCP feature and reported that "the strength of the encryption algorithm a VPN uses makes no difference. TunnelVision's effect is independent of the underlying VPN protocol (e.g., WireGuard, OpenVPN, or IPsec) because it reconfigures the operating system network stack the VPN relies on." They were explicit that "we have not broken the VPN's cryptographically secured protocol, and the VPN is still fully functional." Decide what the tunnel is for. The protocol falls out of that answer.

WireGuard: no negotiation, and a fixed address per key

The WireGuard whitepaper states the design position in one line: "WireGuard is cryptographically opinionated. It intentionally lacks cipher and protocol agility." The consequence is spelled out in the same paragraph: "If holes are found in the underlying primitives, all endpoints will be required to update." There is no cipher list to get wrong and no downgrade to negotiate, and there is also no way to swap a primitive without shipping new software everywhere.

The primitives are named on the project's protocol page: ChaCha20 for symmetric encryption authenticated with Poly1305 using RFC 7539's AEAD construction, Curve25519 for ECDH, BLAKE2s for hashing, HKDF for key derivation, and SipHash24 for hashtable keys. The handshake is a variant of Noise, identified by the literal construction string "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s", and completes in one round trip: initiator to responder, responder to initiator.

Because the first message must authenticate the initiator, the responder can keep nothing before authentication. The paper's section on that is titled "Silence is a Virtue": "With no state stored for unauthenticated packets, and with no response generated, WireGuard is invisible to illegitimate peers and network scanners." A port scan of the listening UDP port returns nothing at all.

Routing is the part people get wrong. Peers "are identified strictly by their public key, a 32-byte Curve25519 point", and each key carries a list of allowed source IPs. Outbound, the destination address selects the key. Inbound, after decrypting and authenticating a packet, the interface "will only accept it if its source IP resolves in the table to the public key used in the secure session for decrypting it". Roaming follows from the same rule: "Both client and server send encrypted data to the most recent IP endpoint for which they authentically decrypted data."

The timers are fixed and short, which is why a WireGuard interface has no visible connect step.

TimerValue
Rekey-After-Time120 seconds
Reject-After-Time180 seconds
Rekey-Attempt-Time90 seconds
Rekey-Timeout5 seconds
Keepalive-Timeout10 seconds

WireGuard was merged into Linux 5.6, released on 29 March 2020, so on any current distribution it is already in the kernel.

The privacy cost of one key mapping to one tunnel address is real and was demonstrated against a large provider. On 20 May 2026 Mullvad published a fingerprinting write-up: "The issue arises when connecting to different VPN servers with the same internal tunnel address. Then the user is likely to be assigned an exit address with the same relative position in each VPN server's range of exit addresses." A site could therefore link two sessions from two different servers back to one device. Mullvad's interim advice was to "log out and log in again in the Mullvad app if switching servers. This will regenerate the WireGuard key and change the internal IP address." The project's own known limitations page adds a second identity issue: a compromised responder key plus recorded handshakes reveals who initiated, though not what was said.

OpenVPN: the TCP mode is the trap

The default is --proto udp, and the manual is direct about why: "OpenVPN is designed to operate optimally over UDP, but TCP capability is provided for situations where UDP cannot be used." That same page links to an archived copy of Olaf Titz's "Why TCP Over TCP Is A Bad Idea", which explains the failure mode. Titz sets out what happens once the carrier connection starts losing packets: "The lower layer TCP queues up a retransmission and increases its timeouts." Because "the timeout is still less than the lower layer timeout, the upper layer will queue up more retransmissions faster than the lower layer can process them". Titz calls the result "an internal meltdown effect". Those upper layer retransmissions are unnecessary "since the carrier guarantees delivery", but "the upper layer TCP can't know this".

TCP mode is therefore a firewall workaround, not a speed setting, and it costs you exactly when the path is worst. WireGuard refuses to offer it for the same reason, citing "the classically terrible network performance of tunneling TCP-over-TCP".

Data Channel Offload is the answer to OpenVPN's other historic complaint, the trip through userspace for every packet. OpenVPN says netdev maintainers "accepted OpenVPN DCO for inclusion on April 17, 2025", and the kernel module named ovpn "has been merged upstream as of linux-6.16", with the caveat that it "is compatible only with OpenVPN 2.7 and greater". The design limits are worth reading before you assume your config survives: "Layer 3 (dev tun) only", "only the following AEAD ciphers are currently supported: Chacha20-Poly1305 and AES-GCM-128/192/256", and "no support for compression or compression framing". A fast OpenVPN is an OpenVPN configured to look like WireGuard.

IPsec with IKEv2: built for the address moving underneath it

IKEv2 is RFC 7296, October 2014, and carries STD 79. Setup is short: "In the common case, there is a single IKE_SA_INIT exchange and a single IKE_AUTH exchange (a total of four messages) to establish the IKE SA and the first Child SA." Raw ESP does not survive NAT, so home use depends on RFC 3948 (January 2005), "UDP Encapsulation of IPsec ESP Packets", which puts ESP inside UDP on port 4500.

The reason phones prefer it is MOBIKE, RFC 4555, June 2006. "MOBIKE allows the IP addresses associated with IKEv2 and tunnel mode IPsec Security Associations to change", and the stated use case is exactly the mobile one: "A mobile Virtual Private Network (VPN) client could use MOBIKE to keep the connection with the VPN gateway active while moving from one address to another." The move is announced, not inferred: the initiator sends "an INFORMATIONAL request containing the UPDATE_SA_ADDRESSES notification". Nothing is renegotiated, so the security associations and the authentication survive the handover.

Both mobile platforms ship this. Apple lists under IKEv2 the features "MOBIKE, IKE fragmentation, server redirect, split tunnel" for iOS, iPadOS, macOS, tvOS, visionOS and watchOS. On the other side, "In Android 11, the IPsec/IKEv2 Library module's IKEv2 negotiation library is the platform's default implementation of an IKEv2 client, supporting initial establishment, periodic re-key, dead peer detection, and handoff."

What happens when the phone's outer IP changes One event, a phone leaving Wi-Fi for mobile data so its outer IP address changes, feeding three responses. WireGuard updates the peer endpoint from the most recent authenticated packet. OpenVPN needs the float option and works only over UDP transport. IKEv2 sends an explicit UPDATE_SA_ADDRESSES notification and keeps its security associations. Phone leaves Wi-Fi, outer IP address changes New outer IP tunnel keys unchanged WireGuard Peer endpoint set to the source of the last authenticated packet nothing to renegotiate OpenVPN float accepts authenticated packets from the new address UDP transport only IPsec with IKEv2 UPDATE_SA_ADDRESSES notification, security associations kept needs MOBIKE both ends
What each protocol does at the moment a phone's outer IP address changes.
Address change handled byConstraint
WireGuardEndpoint updated from the most recent authenticated packetServer only learns after the client sends
OpenVPN--float, which accepts authenticated packets from a new address"only works when using UDP transport"
IKEv2Explicit UPDATE_SA_ADDRESSES notificationNeeds MOBIKE at both ends

MTU is where most reports of a slow VPN come from

Every tunnel shrinks the usable packet. RFC 2516 (February 1999) already caps a PPPoE link: "the PPP MTU MUST NOT be greater than 1492." Put a tunnel inside that and the budget shrinks again. The wg-quick manual says the interface MTU "is automatically determined from the endpoint addresses or the system default route, which is usually a sane choice", and the script itself subtracts 80 bytes from the discovered path MTU, falling back to 1500 when it finds nothing, which is where the familiar 1420 comes from. OpenVPN defaults --tun-mtu to 1500 and --mssfix to 1492 mtu.

Payload left after PPPoE and a tunnel header Four bars drawn to the same scale. A 1500 byte Ethernet payload, a 1492 byte PPPoE limit set by RFC 2516, a 1420 byte WireGuard interface produced by wg-quick subtracting 80 bytes from 1500, and the 1300 byte value the OpenVPN manual suggests as a first try when path MTU discovery is broken. Bytes of payload left, same scale Ethernet payload 1500 PPPoE link, RFC 2516 1492 WireGuard, wg-quick 1420 80 bytes of outer IP, UDP and WireGuard header OpenVPN, first try 1300 OpenVPN also defaults tun-mtu to 1500 and mssfix to 1492 mtu. Each nested header comes off the same 1500 byte budget.
The byte budget of a 1500 byte path once PPPoE and a tunnel header are subtracted.

The mechanism that is meant to sort this out is Path MTU Discovery, RFC 1191, November 1990. A host "initially assumes that the PMTU of a path is the (known) MTU of its first hop, and sends all datagrams on that path with the DF bit set", then learns better from ICMP messages carrying "fragmentation needed and DF set". Those messages routinely never arrive. RFC 8899 (September 2020) is blunt about it: "ICMP messages can be filtered by middleboxes, including firewalls", and "Classical PMTUD is subject to protocol failures. One failure arises when traffic using a packet size larger than the actual PMTU is black-holed (all datagrams larger than the actual PMTU are discarded)."

That produces a specific and very recognisable symptom, described in OpenVPN's own manual: "The usual symptom of such a breakdown is an OpenVPN connection which successfully starts, but then stalls during active usage." Small packets pass, the handshake completes, the status shows connected, and then a large download or an SSH session with a big paste hangs. People report that as a slow VPN and go looking for a faster protocol. It is a size problem.

The manual gives the first thing to try, lowering the maximum UDP packet size to 1300, "a good first try for solving MTU-related connection problems", using --tun-mtu 1500 --fragment 1300 --mssfix. Each of those options "only makes sense when you are using the UDP protocol". On WireGuard the equivalent is setting MTU explicitly in the interface section, well below the automatic value, and testing upward.

A tunnel home is not an exit node

These are two different products that happen to share software.

A self-hosted tunnel back to your own router gives you your LAN: the printer, the NAS, the camera, the admin page. Your public address stays your home address, your home ISP still sees every site you reach, and your ceiling is your home upload speed, not your download speed. If the far end sits behind NAT and sends nothing for a while, the mapping expires; the wg manual suggests that such an interface "might benefit from having a persistent keepalive interval of 25 seconds".

A commercial exit node does the opposite. It removes your ISP as an observer and installs the provider in that seat, which is a transfer of trust, not a removal of it. Australia's competition regulator documented what that can mean on 26 July 2023, when the Federal Court ordered Facebook Israel and Onavo Inc "to each pay $10 million" over the Onavo Protect app. Onavo Protect was "a free app providing a virtual private network (VPN) service", "installed more than 270,000 times by Australian users between February 2016 and October 2017", promoted with lines such as "Use a free, fast and secure VPN to protect personal information", while the companies "shared the personal activity data from users collected by the app in anonymised and aggregated form with parent company Meta". Read the operator's written policy, and prefer one whose business model is the subscription.

Tunnel home compared with a commercial exit node Two paths from the same laptop on a cafe network. The upper path runs the tunnel to the user's own router, so the exit address is the home address and the home ISP still sees every destination. The lower path runs the tunnel to a commercial provider, so the cafe network and the home ISP see nothing but the provider sees every destination. Same laptop, same cafe network, two different products Laptop cafe Wi-Fi Your home router tunnel ends here Home ISP sees every site Internet home IP shows Tunnel home: you reach your own LAN, capped by home upload speed VPN provider tunnel ends here sees every site Internet provider IP shows Exit node: your ISP is removed as an observer and the provider takes that seat Neither path removes the need to trust somebody
Who can still see your traffic with a tunnel home compared with a commercial exit node.

Check these before you change protocol

Test the failure you actually have. If a connection establishes and then stalls on bulk transfer, drop the tunnel MTU and retest before touching anything else. If a phone drops the tunnel every time it leaves Wi-Fi, MOBIKE or WireGuard roaming is the fix, not a faster cipher. If you are on an untrusted network, the TunnelVision result applies whatever you run, with one documented exception: "because Android does not implement support for DHCP option 121, it was uniquely unaffected."

Sources