VPN network security tunnel

Install WireGuard VPN on VPS in 10 Minutes

June 2026 · 6 min read

WireGuard is a modern VPN protocol designed to be significantly faster, lighter, and more secure than OpenVPN or IPSec. The entire codebase consists of only about 4,000 lines, compared to OpenVPN's hundreds of thousands of lines, making it easier to audit for security and incurring far less overhead. This article will guide you through setting up a WireGuard VPN Server on a Linux VPS from start to finish and having it fully operational within 10 minutes.

Why Choose WireGuard?

Before diving into the installation, here's a summary of why WireGuard has gained such rapid popularity over recent years:

WireGuard has been integrated into the Linux Kernel since version 5.6 (2020). On Ubuntu 20.04+ or Debian 11+, it can be installed immediately without needing to add any special repositories.

Prerequisites

Step 1 — Update System and Install WireGuard

SSH into your VPS and run the following commands:

sudo apt update && sudo apt upgrade -y
sudo apt install wireguard -y

Verify the installation was successful:

wg --version

Step 2 — Generate Key Pair for the Server

WireGuard uses a Public/Private Key system similar to SSH, where the Private Key stays on the server and the Public Key is shared with clients:

cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key

Display the generated keys (you'll need these in the next step):

cat server_private.key
cat server_public.key
Never expose your Private Key to anyone. The Private Key proves the identity of your server. If it's compromised, regenerate it immediately.

Step 3 — Create the Server Configuration File

Create the file /etc/wireguard/wg0.conf, replacing SERVER_PRIVATE_KEY with the private key from the previous step and YOUR_SERVER_IP with your VPS's public IP address:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

# Enable IP forwarding to allow traffic to route through the VPN to the internet
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
The network interface name may vary by VPS provider. Some systems use ens3 or enp1s0 instead of eth0. Check with ip route | grep default

Step 4 — Enable IP Forwarding

Enable IP forwarding to allow Linux to route packets between networks:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

Step 5 — Open Firewall Port

Allow UDP port 51820 through the firewall:

# If using UFW
sudo ufw allow 51820/udp
sudo ufw reload

# If using iptables directly
iptables -A INPUT -p udp --dport 51820 -j ACCEPT

Step 6 — Generate Key Pair and Configuration for Client

Perform this step on the server to create keys for each client (repeat for multiple clients):

wg genkey | tee client1_private.key | wg pubkey > client1_public.key
cat client1_private.key
cat client1_public.key

Add a Peer (client) to your server's /etc/wireguard/wg0.conf file, replacing CLIENT1_PUBLIC_KEY with the client's public key:

[Peer]
PublicKey = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

Next, create a configuration file for the client (to be used on the user's device), replacing all necessary values:

[Interface]
Address = 10.0.0.2/24
PrivateKey = CLIENT1_PRIVATE_KEY
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = YOUR_SERVER_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0 means all traffic routes through the VPN. To route only specific subnets, adjust this value as needed, for example 10.0.0.0/24

Step 7 — Start the WireGuard Server

# Start the service
sudo systemctl start wg-quick@wg0

# Enable it to start automatically on reboot
sudo systemctl enable wg-quick@wg0

# Check the status
sudo systemctl status wg-quick@wg0

# View connections from clients
sudo wg show

Step 8 — Install WireGuard on Client Devices

Windows / macOS

Download the WireGuard app from wireguard.com/install, then import the .conf file you created in Step 6.

Ubuntu / Debian

sudo apt install wireguard -y
# Place the config file at /etc/wireguard/wg0.conf, then run
sudo wg-quick up wg0

Android / iOS

Install the WireGuard app from the Play Store or App Store, then scan the QR code from the config file (generate a QR code with qrencode -t ansiutf8 < client1.conf on the server).

Test the Connection

After connecting, verify that the VPN is working correctly:

  1. Check your IP at whatismyip.com — it should show your VPS's IP, not your own
  2. Ping the server within the VPN: ping 10.0.0.1
  3. View traffic on the server: sudo wg show displays handshake time and bytes sent/received
sudo wg show

# Example output:
# interface: wg0
#   public key: xxxxxxxxxxxxxxxxxxxx
#   private key: (hidden)
#   listening port: 51820
#
# peer: CLIENT_PUBLIC_KEY_HERE
#   endpoint: 203.0.113.45:54321
#   allowed ips: 10.0.0.2/32
#   latest handshake: 23 seconds ago
#   transfer: 1.24 MiB received, 820 KiB sent

Managing Additional Clients

Add a New Client with Hot-reload (No Service Restart)

# Add a peer without restarting the service
sudo wg set wg0 peer NEW_CLIENT_PUBLIC_KEY allowed-ips 10.0.0.3/32

# Save changes to the config file
sudo wg-quick save wg0

Remove a Client

sudo wg set wg0 peer CLIENT_PUBLIC_KEY_TO_REMOVE remove
sudo wg-quick save wg0

Enhance Security

We recommend completing these additional steps to improve your server's security.

Summary

WireGuard is the best choice for building a private VPN on a VPS in 2026, being significantly lighter, faster, and easier to set up than alternative solutions. After completing this guide, you can:

A VPS with 512 MB RAM and 1 TB/month bandwidth is more than sufficient to run WireGuard VPN for a small family or team of 5–10 people. Check out 29VPS's VPS packages that are perfect for this use case.

Verify WireGuard is Working Correctly

# Check service status
systemctl status wg-quick@wg0

# View interface and connected peers
wg show

# Test routing through the VPN (run from client)
ping 10.0.0.1          # ping the VPS through the VPN tunnel
curl ifconfig.me       # should display the VPS IP, not the client IP

# Check IP forwarding
sysctl net.ipv4.ip_forward
# Should return: net.ipv4.ip_forward = 1
Tip: Use wg show to check the "latest handshake" for each peer — if there's no handshake within 3-5 minutes, the client is not connected or has incorrect keys.

Common Issues & Troubleshooting

Error: "RTNETLINK answers: Operation not permitted" when starting wg-quick

The kernel module hasn't been loaded or the kernel doesn't support WireGuard. Check:

# Check if the kernel module is loaded
lsmod | grep wireguard
modprobe wireguard   # load the module manually

# If your kernel is too old (< 5.6), install wireguard-dkms
apt install wireguard-dkms -y

Error: Client connects but internet doesn't work (no traffic through VPN)

Usually caused by IP forwarding not being enabled or iptables MASQUERADE rules not working:

# Check IP forwarding
cat /proc/sys/net/ipv4/ip_forward
# Should be 1

# Check NAT rules
iptables -t nat -L POSTROUTING -n -v | grep MASQUERADE

# Verify the interface name is correct (not all systems use eth0)
ip route | grep default   # find the actual interface (eth0/ens3/enp1s0)

Error: Client can't connect — "handshake did not complete"

Public key mismatch or UDP port 51820 is blocked by the firewall:

# Check if the port is open
ufw status | grep 51820
# Should show: 51820/udp ALLOW Anywhere

# Test connectivity from client
nc -vzu YOUR_VPS_IP 51820

# Verify the public key in the server config matches the client's
cat /etc/wireguard/wg0.conf | grep PublicKey

Error: WireGuard won't start after reboot

The service needs to be enabled, not just started:

# Check if it's enabled
systemctl is-enabled wg-quick@wg0

# If not enabled
systemctl enable wg-quick@wg0

Error: Need to add a new client but service won't reload config

Use wg set to add peers with hot-reload without restarting and dropping existing connections:

# Add a new peer without restarting
wg set wg0 peer NEW_CLIENT_PUBLIC_KEY allowed-ips 10.0.0.5/32

# Save to the config file
wg-quick save wg0

# Verify it was added
wg show wg0 peers

Frequently Asked Questions

Is WireGuard secure enough for production?

Yes. WireGuard was integrated into the Linux kernel mainline in 2020 and has undergone security audits by experts. It uses modern cryptography (Curve25519, ChaCha20, Poly1305) and only ~4,000 lines of code, making it far smaller than OpenVPN and reducing the attack surface. It's suitable for both personal use and enterprise deployments.

Can my VPS provider see the traffic in my VPN?

Traffic between your client and VPS is encrypted by WireGuard. The provider only sees UDP packets flowing out, but not their contents. However, traffic from your VPS to the internet is not encrypted anymore, so providers on that path will see it as normal.

How many clients can I connect simultaneously?

WireGuard doesn't impose a hard limit. It depends on your VPS's bandwidth and CPU. A VPS with 512 MB RAM and 1 TB/month bandwidth can comfortably handle 10–20 active clients, especially if they're just browsing and using SSH rather than streaming or downloading constantly.