Back to Networking

WireGuard VPN

Modern, fast, secure VPN

WireGuardVPN

Why WireGuard?

  • * Simple: ~4,000 lines of code vs 100,000+ for OpenVPN
  • * Fast: Kernel-level implementation, minimal overhead
  • * Modern crypto: ChaCha20, Curve25519, BLAKE2s
  • * Roaming: Handles IP changes
  • * Cross-platform: Linux, Windows, macOS, iOS, Android

Server Configuration

Install WireGuard

# Ubuntu/Debian
sudo apt update && sudo apt install wireguard

# Enable IP forwarding
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Generate Keys

# Generate server keys
wg genkey | tee server_private.key | wg pubkey > server_public.key

# Set secure permissions
chmod 600 server_private.key

Server Config

# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <server_private_key>

# NAT for clients
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Client 1
PublicKey = <client1_public_key>
AllowedIPs = 10.0.0.2/32

Client Configuration

Generate Client Keys

wg genkey | tee client_private.key | wg pubkey > client_public.key

Client Config

[Interface]
Address = 10.0.0.2/24
PrivateKey = <client_private_key>
DNS = 1.1.1.1

[Peer]
PublicKey = <server_public_key>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

AllowedIPs Options

  • * 0.0.0.0/0 - Route all traffic through VPN (full tunnel)
  • * 10.0.0.0/24, 192.168.1.0/24 - Only route specific networks (split tunnel)

Management Commands

# Start/stop interface
sudo wg-quick up wg0
sudo wg-quick down wg0

# Enable on boot
sudo systemctl enable wg-quick@wg0

# Check status
sudo wg show

# Add peer on the fly
sudo wg set wg0 peer <public_key> allowed-ips 10.0.0.3/32

Best Practices

  • * Rotate keys periodically: Generate new key pairs annually
  • * Use PersistentKeepalive: Required for NAT traversal (25 seconds typical)
  • * Restrict allowed IPs: Only permit necessary traffic
  • * Firewall the server: Only allow UDP 51820 from needed sources
  • * Use QR codes: For mobile client deployment

Tip: Use qrencode -t ansiutf8 < client.conf to generate QR codes for mobile clients.