Your Home Network Is One Coffee Shop Away From Disaster
You’re at a hotel. You need to SSH into your home server to grab a file, restart a container, or just check whether that cron job you set up at 2am actually runs. You open your laptop, connect to the hotel WiFi (password: “hotel1234”, naturally), and… pray.
This is exactly the scenario that makes self-hosted VPNs worth the weekend of pain it takes to set one up. Whether you’re tunneling back to your home lab, hiding your traffic from your ISP, or just getting around some overzealous corporate firewall at a conference, a VPN you control is a fundamentally different animal than paying NordVPN $15/month.
The question in 2026 isn’t whether to self-host a VPN — it’s which one. And in this corner, we have two contenders: the battle-hardened OpenVPN, which has been doing this since before Docker was a word, and WireGuard, the upstart that decided everything about VPNs was too complicated and fixed it with a chainsaw.
Let’s dig in.
Why Self-Host a VPN at All?
Before we get into the cage match, let’s briefly justify why you’re doing this to yourself.
Home lab remote access is the big one. You’ve got Proxmox, TrueNAS, a Jellyfin instance, maybe a Pi-hole — and you want to reach all of it from your phone when you’re out. A VPN drops you into your home network as if you never left your couch.
Privacy on untrusted networks is the second reason. Hotel WiFi, airport lounges, that coffee shop with suspiciously fast internet — all of these are exactly the kind of networks where you want your traffic encrypted and routed somewhere you trust. Your own server counts.
Travel and geo-routing rounds it out. If you’re traveling internationally and want your traffic to appear to originate from home, or you need to test something from your own IP, a self-hosted VPN is the obvious answer.
Now. On to the fight.
WireGuard: The New Kid With a Chip on Its Shoulder
WireGuard launched into the Linux kernel in 2020 and spent the next few years making OpenVPN users feel vaguely inadequate. It was written by Jason Donenfeld as a reaction to the complexity and attack surface of existing VPN protocols. His thesis: VPNs don’t need to be complicated. They need to be correct.
The headline numbers: WireGuard is approximately 4,000 lines of code. OpenVPN is somewhere north of 600,000. For reference, that’s roughly the difference between a short story and the complete works of Tolstoy. Fewer lines of code means a smaller attack surface, easier auditing, and less for something to go wrong in.
WireGuard lives in the Linux kernel as a proper kernel module, which is part of why it’s so fast. There’s no userspace overhead eating your throughput. On modern hardware, WireGuard can saturate gigabit links without breaking a sweat. In practical speed tests on typical home server hardware (say, an Intel N100 mini PC), you’ll see:
- WireGuard: 700–900 Mbps throughput, 1–3ms added latency
- OpenVPN (UDP): 200–400 Mbps throughput, 5–15ms added latency
- OpenVPN (TCP): 100–200 Mbps throughput, 10–30ms added latency
That’s not a rounding error. WireGuard is measurably, consistently faster.
Protocol: WireGuard is UDP only. Always. This is a design choice, not a limitation — UDP is faster, and WireGuard handles the reliability layer itself. The downside is that if you’re in a place where UDP is blocked (certain corporate networks, some hotel configurations), you’re stuck.
Roaming support is one of WireGuard’s genuinely killer features. Switch from WiFi to LTE in the middle of a connection? WireGuard doesn’t care. It tracks peers by public key, not IP address, so when your IP changes, the tunnel just… keeps working. This is witchcraft by OpenVPN standards.
Key management is dead simple. It’s a public/private key pair per peer. Generate keys, exchange public keys, configure a [Peer] block. That’s it. There’s no certificate authority, no CRL to manage, no PKI infrastructure to accidentally misconfigure.
The config file for a WireGuard peer looks like this:
[Interface]
PrivateKey = <your-private-key>
Address = 10.0.0.2/24
DNS = 10.0.0.1
[Peer]
PublicKey = <server-public-key>
Endpoint = your.server.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
That’s the whole thing. Your OpenVPN config file is longer than your lease agreement.
OpenVPN: The Workhorse That Refuses to Retire
OpenVPN has been around since 2001. It has seen off competitors, survived security audits, powered commercial VPN products, and outlasted entire generations of sysadmins who swore they’d replace it. It is not glamorous. It is reliable.
TCP and UDP support is OpenVPN’s trump card. You can run OpenVPN on UDP port 1194 (default), but you can also run it on TCP port 443. TCP/443 looks exactly like HTTPS traffic to a deep packet inspector. This means OpenVPN can get through firewalls that would stop WireGuard cold — corporate networks, certain hotel configurations, some national firewalls. If your threat model includes “I need to connect from inside a heavily restricted network,” OpenVPN is still the answer.
Firewall evasion is a serious consideration. WireGuard’s UDP-only nature makes it fingerprint-able and blockable. OpenVPN on TCP/443 is considerably harder to block without also blocking HTTPS, which is not something most network admins are willing to do.
Certificate infrastructure is OpenVPN’s other strength (and its curse). It uses TLS with a full PKI — certificate authority, server cert, client certs. This is complex to set up, but it also means you can integrate with enterprise authentication, issue and revoke certificates per user, and plug into existing 2FA infrastructure. For a corporate or multi-user deployment, this matters.
2FA support is mature and well-documented. OpenVPN plays nicely with TOTP, LDAP, RADIUS. WireGuard has no built-in authentication layer beyond the key exchange, so 2FA requires additional tooling.
The downside of all this flexibility: OpenVPN config files are a bureaucratic nightmare. A typical client config with inline certs looks like a ransom note assembled from RFC fragments. It works, but you’re not going to enjoy reading it.
wg-easy: WireGuard With a Web UI (Because Life Is Short)
If you want to run WireGuard without memorizing wg commands, wg-easy is the Docker image you want. It wraps WireGuard in a clean web interface for managing peers, viewing connection status, and generating QR codes for mobile clients.
Here’s a working Docker Compose setup:
version: "3.8"
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:latest
container_name: wg-easy
environment:
- LANG=en
- WG_HOST=your.domain.com # Your public IP or domain
- PASSWORD_HASH=$$2y$$10$$... # bcrypt hash of your UI password
- WG_PORT=51820
- WG_DEFAULT_ADDRESS=10.8.0.x
- WG_DEFAULT_DNS=1.1.1.1
- WG_ALLOWED_IPS=0.0.0.0/0
- WG_PERSISTENT_KEEPALIVE=25
- UI_TRAFFIC_STATS=true
volumes:
- ./wg-easy-data:/etc/wireguard
ports:
- "51820:51820/udp"
- "51821:51821/tcp" # Web UI
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
Deploy it, hit port 51821, create a peer, scan the QR code with the WireGuard mobile app, done. Your phone is now on your home network. The whole process takes about 10 minutes if you’ve done it before and about an hour if you haven’t, because you’ll need to open the right firewall port and inevitably forget what cap_add does.
Firewall and NAT: The Part Nobody Mentions
Both VPNs require port forwarding on your router, and this is where a lot of home lab setups quietly fail.
WireGuard needs UDP port 51820 (or whatever you configure) forwarded to your server. That’s it. But because it’s UDP, some routers and ISPs handle this less gracefully. Carrier-grade NAT (CGNAT) — increasingly common with IPv4 exhaustion — can break inbound connections entirely. If your ISP gives you a CGNAT address, neither VPN will work without a VPS relay (or IPv6, if your ISP supports it).
OpenVPN on TCP/443 can sometimes survive situations where WireGuard can’t, precisely because TCP through NAT is better understood by most networking gear.
The solution for CGNAT scenarios: rent a cheap VPS ($3–5/month), run your VPN server there, and tunnel your home traffic through it. Not ideal, but it works.
Comparison Table
| Feature | WireGuard | OpenVPN |
|---|---|---|
| Lines of code | ~4,000 | ~600,000+ |
| Protocol | UDP only | TCP + UDP |
| Throughput (typical) | 700–900 Mbps | 100–400 Mbps |
| Latency overhead | 1–3ms | 5–30ms |
| Config complexity | Low | High |
| Firewall evasion | Limited | Excellent (TCP/443) |
| Roaming (IP change) | Native support | Breaks connection |
| Certificate PKI | No | Yes |
| 2FA integration | Requires extra tooling | Built-in support |
| Mobile app quality | Excellent | Good |
| Docker setup | wg-easy (easy) | kylemanna/openvpn (workable) |
| Kernel integration | Native (Linux 5.6+) | Userspace |
| Audit surface | Small | Large |
The Tailscale Option: WireGuard With Training Wheels
Worth a mention: Tailscale takes WireGuard’s protocol and wraps it in a managed control plane. You install the client, log in with Google or GitHub, and your devices automatically find each other through NAT without any port forwarding. It’s genuinely magical.
The trade-off is that Tailscale’s control plane (the part that brokers connections and manages keys) is their servers, not yours. The data plane is still peer-to-peer WireGuard — Tailscale doesn’t see your traffic — but if Tailscale the company goes down or goes evil, your coordination layer goes with it.
For most home lab users, Tailscale is probably the right answer. For the self-hosting purists reading this blog (you know who you are), it’s cheating. But it’s good cheating.
If you want self-hosted Tailscale, look at Headscale — an open-source Tailscale control server you can run yourself.
So Which One Should You Use?
Use WireGuard if:
- You want something fast, simple, and modern
- Your use case is home lab access and personal privacy
- You’re comfortable with port forwarding
- You want a mobile experience that doesn’t break when you switch networks
- You want your Docker compose file to fit on one screen
Use OpenVPN if:
- You need to punch through restrictive firewalls (corporate, hotel, travel)
- You’re running a multi-user deployment with certificate management
- You need 2FA integration with existing infrastructure
- You need TCP support for reliability on lossy networks
- Your threat model includes nation-state-level traffic inspection
Use Tailscale/Headscale if:
- You hate port forwarding with the burning intensity of a thousand suns
- You’re behind CGNAT and don’t want to rent a VPS
- You value “works instantly” over “I built this”
The Bottom Line
In 2026, WireGuard is the default choice for personal and home lab use. It’s faster, simpler, and modern enough that it’s hard to argue against. If you’re setting up a VPN for the first time, start with wg-easy in Docker and have it running before dinner.
OpenVPN isn’t dead — it’s the right tool for specific situations where WireGuard’s limitations actually matter. Corporate deployments, heavy firewall environments, and use cases that need certificate-based authentication all have legitimate reasons to stick with it.
But if you’re still running OpenVPN because that’s what you set up in 2017 and it works fine, maybe spend a Saturday afternoon trying WireGuard. Your config files will be shorter. Your throughput will be higher. And you’ll spend less time wondering what half those OpenVPN directives actually do.
Some of them, if we’re being honest, nobody really knows anymore.