Exploring Modern VPN Solutions: Tailscale vs Traditional Approaches
When I first needed to connect to my home server remotely, I thought setting up a VPN would be straightforward. Just install OpenVPN, configure some files, and I'd be done, right? Three days and countless configuration errors later, I realized the world of VPNs had evolved far beyond traditional solutions. This post explores my journey through both traditional and modern VPN approaches, and why solutions like Tailscale are revolutionizing remote connectivity.
My First Attempt: Traditional OpenVPN
Like many beginners, I started with OpenVPN because it was the most mentioned solution online. The experience was... educational, to put it mildly. Here's what setting up OpenVPN looked like:
Traditional OpenVPN Setup Processbash
1# Install OpenVPN and EasyRSA2sudoapt update
3sudoaptinstall openvpn easy-rsa
45# Set up Certificate Authority6 make-cadir ~/openvpn-ca
7cd ~/openvpn-ca
8source vars
9 ./clean-all
10 ./build-ca
11 ./build-key-server server
12 ./build-dh
13 openvpn --genkey --secret keys/ta.key
1415# Create server configuration16sudonano /etc/openvpn/server.conf
1718# Server configuration (simplified)19 port 119420 proto udp
21 dev tun
22 ca ca.crt
23 cert server.crt
24 key server.key
25 dh dh2048.pem
26 server 10.8.0.0 255.255.255.0
27 push "redirect-gateway def1 bypass-dhcp"28 push "dhcp-option DNS 8.8.8.8"29 keepalive 1012030 tls-auth ta.key 031 cipher AES-256-CBC
32 comp-lzo
33 max-clients 1034 persist-key
35 persist-tun
36 status openvpn-status.log
37 verb 33839# Generate client certificates40 ./build-key client1
4142# Create client configuration file43# (Another 30+ lines of configuration)
After hours of setup, I had a working VPN, but the complexity was overwhelming. Managing certificates, configuring firewall rules, setting up port forwarding on my router, and creating individual configuration files for each device felt like operating a small PKI infrastructure just to access my home server.
The Problems with Traditional VPNs
As I used OpenVPN for a few weeks, several pain points became apparent:
Certificate Management Hell: Every new device needed certificates generated, signed, and distributed securely
Port Forwarding Nightmares: Required router configuration and a static IP or dynamic DNS
Performance Issues: All traffic routed through my home connection, creating a bottleneck
Client Configuration: Each device needed a complex configuration file
Mobile Unfriendly: Battery drain and connection drops were constant issues
No Mesh Networking: Everything went through the central server, even local connections
Enter WireGuard: A Breath of Fresh Air
Frustrated with OpenVPN's complexity, I discovered WireGuard. The difference was night and day:
WireGuard's elegance was immediately apparent. The entire configuration fit on a single screen, used modern cryptography by default, and performed significantly better than OpenVPN. But even WireGuard had limitations—I still needed to manage keys manually and handle NAT traversal myself.
The Mesh VPN Revolution
Then I discovered mesh VPNs, and everything changed. Instead of all traffic flowing through a central server, devices connect directly to each other when possible. This approach offers several advantages:
Traditional VPN (Hub and Spoke)
Device A
↓
VPN Server ←→ Internet
↑
Device B
Mesh VPN (Direct Connections)
Device A ←→ Device B
↓ ↓
Device C ←→
Tailscale: VPN Made Simple
Tailscale was my introduction to how modern VPNs should work. Built on WireGuard, it adds automatic key management, NAT traversal, and mesh networking. Here's how simple the setup was:
Tailscale: VPN in 60 Secondsbash
1# Install Tailscale2curl -fsSL https://tailscale.com/install.sh |sh34# Start and authenticate5sudo tailscale up
67# That's it! Really!89# Check your network10 tailscale status
1112# Access other devices directly13ssh user@device-name
14ping laptop
15curl http://home-server:8080
The contrast was stark. What took hours with OpenVPN took literally one minute with Tailscale. No certificates, no port forwarding, no configuration files. It just worked.
How Modern VPNs Solve Traditional Problems
Modern solutions like Tailscale, ZeroTier, and Nebula solve traditional VPN problems elegantly:
1. NAT Traversal
Traditional VPNs require port forwarding and public IPs. Modern solutions use techniques borrowed from WebRTC:
STUN: Discovers your public IP and port
Direct connections: Devices find each other and connect directly
DERP relays: Fallback when direct connection isn't possible
2. Key Management
Instead of manually managing certificates:
Keys are generated automatically
Distributed through a control plane
Rotated without user intervention
Devices authenticate through SSO providers
3. Performance
Mesh networking means:
Direct peer-to-peer connections when possible
Lower latency for local connections
No central bottleneck
Automatic failover if one path fails
Comparing Modern VPN Solutions
I've tested several modern VPN solutions. Here's how they compare:
Tailscale
Pros: Easiest setup, great documentation, reliable NAT traversal
Cons: Requires third-party coordination server (or self-hosted Headscale)
Best for: Personal use, small teams, quick deployments
ZeroTier
Pros: Layer 2 networking, very mature, self-hostable
Cons: More complex than Tailscale, slower performance
Best for: Complex network topologies, bridging networks
Nebula (by Slack)
Pros: Fully open source, designed for scale, no third-party dependencies
Cons: More manual configuration, weaker NAT traversal
Best for: Large organizations, full control requirements
NetBird
Pros: Open source, good UI, self-hostable
Cons: Newer project, smaller community
Best for: Open source enthusiasts, privacy-conscious users
Real-World Use Cases
Here's how I use modern VPN solutions in practice:
My VPN Use Casesyaml
1# Home Lab Access2- Connect to home server from anywhere
3- Access local services (Plex, Home Assistant)
4- Remote development on powerful desktop
56# Multi-Device Sync7- Share files between laptop, desktop, phone
8- Access development environments from any device
9- Consistent workspace across locations
1011# Secure Public WiFi12- Route traffic through home connection
13- Access geo-restricted content
14- Protect sensitive data on untrusted networks
1516# Collaborative Development17- Share local development servers with team
18- Pair programming with screen sharing
19- Access staging environments securely
2021# IoT Management22- Secure access to smart home devices
23- Monitor security cameras remotely
24- Update IoT devices without exposing them to internet
Self-Hosting: Taking Back Control with Headscale
While Tailscale's hosted solution is convenient, I wanted full control over my infrastructure. This led me to Headscale, an open-source implementation of the Tailscale control server. My journey into self-hosting Tailscale was both challenging and rewarding.
1# On client machines:2# Linux3 tailscale up --login-server https://headscale.example.com:8085
45# macOS - had issues with network extension6 tailscale up --login-server https://headscale.example.com:8085 --accept-routes
78# Using pre-auth key (for servers)9 tailscale up --login-server https://headscale.example.com:8085 --authkey YOUR_KEY_HERE
1011# Check connection12 tailscale status
1314# Common issues I faced:15# 1. Certificate errors - ensure valid HTTPS16# 2. Port 8085 blocked - check firewall17# 3. DNS issues - use IP first, then domain
Understanding DERP: The Magic Behind NAT Traversal
DERP (Designated Encrypted Relay for Packets) servers are what make Tailscale's magic work when direct connections fail. Understanding and potentially self-hosting DERP became my next challenge.
What DERP Actually Does
When two devices can't connect directly (due to strict NATs or firewalls), DERP servers relay the encrypted traffic. Think of them as a fallback post office when direct delivery isn't possible.
Investigating DERP Connectionsbash
1# Check if using DERP2 tailscale status
3# Look for relay "der" in the output45# Test DERP server connectivity6curl https://derp.example.com/derp/probe
78# Monitor DERP usage9 tailscale debug derp
1011# See which DERP region you're using12 tailscale netcheck
1314# Example output:15 Report:
16 * UDP: true17 * IPv4: yes, PUBLIC_IP:PORT
18 * IPv6: no
19 * MappingVariesByDestIP: false20 * DERP latency:
21 - sin: 32.2ms (Singapore)22 - tok: 45.1ms (Tokyo)23 - fra: 120.3ms (Frankfurt)
My DERP Server Experiments
I spent weeks trying to self-host DERP servers. Here's what I learned:
Attempting to Run My Own DERP Serverbash
1# Building DERP from source2git clone https://github.com/tailscale/tailscale.git
3cd tailscale/cmd/derper
4 go build -o derper
56# Attempt 1: Basic DERP server7 ./derper -hostname derp.example.com -a :443 -certmode manual -certfile /etc/letsencrypt/live/derp.example.com/fullchain.pem -keyfile /etc/letsencrypt/live/derp.example.com/privkey.pem
89# Attempt 2: DERP with STUN10 ./derper -hostname derp.example.com -a :443 -stun -certmode letsencrypt
1112# Attempt 3: Behind nginx (this was tricky!)13 ./derper -hostname derp.example.com -a :8090 -stun-port 3478 -certmode manual
1415# The nginx config that finally worked:16# Note: DERP needs WebSocket support17 location /derp {18 proxy_pass http://127.0.0.1:8090;19 proxy_http_version 1.1;20 proxy_set_header Upgrade $http_upgrade;21 proxy_set_header Connection "upgrade";22 proxy_set_header Host $host;23 proxy_buffering off;24 proxy_read_timeout 86400;25}2627# STUN needs UDP (can't proxy through nginx)28# Had to open port 3478 directly in firewall
DERP Configuration in Headscale
Integrating custom DERP servers with Headscale was complex:
Custom DERP Configurationyaml
1# Embedded DERP in Headscale (experimental)2derp:3server:4enabled:true5region_id:9996region_code:"custom"7region_name:"My Region"8stun_listen_addr:"0.0.0.0:3478"910# Using custom DERP map11derp:12server:13enabled:false14urls:[]# Disable default Tailscale DERP15paths:16- /etc/headscale/derp.json
1718# My custom derp.json:19{20"regions":{21"900":{22"regionid":900,23"regioncode":"myderp",24"regionname":"My DERP",25"nodes":[{26"name":"1",27"regionid":900,28"hostname":"derp.example.com",29"ipv4":"YOUR_IP",30"stunport":3478,31"stunonly":false,32"derpport":44333}]34}35}36}
DERP Challenges and Lessons
My DERP journey taught me several hard lessons:
TLS is mandatory: DERP clients expect HTTPS, self-signed certificates don't work
Port conflicts: DERP wants port 443, but so does everything else
STUN requirements: UDP port 3478 must be accessible for NAT traversal
Bandwidth costs: DERP servers can use significant bandwidth when relaying
Monitoring is hard: Limited visibility into DERP performance
Updates break things: DERP protocol changes with Tailscale updates
My Current Setup
After all the experimentation, here's what actually works:
Self-hosting the control plane with Headscale while using Tailscale's DERP infrastructure gave me the best balance of control and reliability. Running custom DERP servers remains an ongoing experiment—fascinating but not yet production-ready for my needs.
Performance Comparisons
I ran some informal benchmarks on my setup:
VPN Performance Teststext
1Test: File transfer between two devices on different networks
2 Baseline (no VPN): 95 Mbps
34 OpenVPN (AES-256):
5 - Throughput: 45 Mbps
6 - CPU usage: 60%
7 - Latency: +25ms
89 WireGuard (raw):
10 - Throughput: 85 Mbps
11 - CPU usage: 15%
12 - Latency: +5ms
1314 Tailscale (direct connection):
15 - Throughput: 82 Mbps
16 - CPU usage: 18%
17 - Latency: +6ms
1819 Tailscale (DERP relay):
20 - Throughput: 50 Mbps
21 - CPU usage: 20%
22 - Latency: +30ms
2324 ZeroTier:
25 - Throughput: 70 Mbps
26 - CPU usage: 25%
27 - Latency: +10ms
WireGuard-based solutions consistently outperformed OpenVPN, with Tailscale's direct connections nearly matching raw WireGuard performance.
Lessons Learned
My journey through VPN technologies taught me several valuable lessons:
Simple is better: Complex configurations lead to security mistakes
Modern protocols matter: WireGuard's performance advantage is real
Mesh Hub-and-spoke: Direct connections improve everything
Automation is key: Manual key management doesn't scale
Consider your needs: Not everyone needs a complex setup
Test everything: What works for others might not work for you
Choosing the Right Solution
Here's my decision framework for choosing a VPN solution:
Just need it to work? → Tailscale
Need Layer 2 networking? → ZeroTier
Full control and scale? → Nebula or self-hosted Headscale
The shift from traditional to modern VPNs represents a fundamental change in how we think about secure networking. Instead of building walls and gates, we're creating secure, direct paths between devices. This approach aligns better with our modern, distributed world where the perimeter is everywhere and nowhere.
As I continue exploring these technologies, I'm excited about innovations like:
Better mobile support with improved battery life
Integration with service mesh technologies
Post-quantum cryptography preparations
Decentralized coordination servers
Native operating system integration
"Moving from OpenVPN to modern mesh VPNs was like upgrading from a flip phone to a smartphone. Both make calls, but one transforms how you think about communication. Modern VPNs don't just connect networks—they reimagine what secure networking can be."
💬 Comments & Discussion
Share your thoughts, ask questions, or discuss this post. Comments are powered by GitHub Discussions.
💬 Comments & Discussion
Share your thoughts, ask questions, or discuss this post. Comments are powered by GitHub Discussions.
💡 Tip: You need a GitHub account to comment. This helps reduce spam and keeps discussions high-quality.