← Main page

How to Set Up a Custom VPN on Your Own Server with WireGuard

Setting up your own VPN gives you full control over your privacy and security. Unlike commercial VPN services, a custom VPN on your own server means no logs, no third-party access, and you decide where your traffic goes. WireGuard is the modern choice—it's fast, simple, and secure. This guide walks you through setting up WireGuard on a Linux server and connecting your devices.

Why Choose WireGuard?

WireGuard is a next-generation VPN protocol that uses state-of-the-art cryptography. It’s much simpler than OpenVPN or IPsec, with a codebase of just a few thousand lines. This means fewer vulnerabilities and easier configuration. WireGuard runs in the kernel on Linux, offering near-zero latency. It’s perfect for personal use, remote work, or securing your home network.

Prerequisites

Step 1: Install WireGuard on the Server

SSH into your server and run the following commands to install WireGuard and generate keys:

sudo apt update
sudo apt install wireguard -y
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key

The private key stays on the server; the public key will be shared with clients.

Step 2: Configure the Server

Create a configuration file /etc/wireguard/wg0.conf with the following content. Replace SERVER_PRIVATE_KEY with the content of server_private.key and SERVER_PUBLIC_IP with your server's IP address.

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

# Enable IP forwarding (required for routing)
PostUp = sysctl -w net.ipv4.ip_forward=1
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

Replace eth0 with your server's main network interface (check with ip link). The PostUp rules enable NAT so clients can access the internet through the server.

Step 3: Start WireGuard

Enable and start the WireGuard service:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

Verify it's running with sudo wg show.

Step 4: Configure a Client

On your client machine, install WireGuard (visit wireguard.com/install for all platforms). Generate a key pair on the client:

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

Create a configuration file on the client (e.g., wg0.conf on Linux or import into the WireGuard app):

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

AllowedIPs = 0.0.0.0/0 routes all traffic through the VPN. If you only want to access the server's network, use 10.0.0.0/24.

Step 5: Add the Client to the Server

Add the client's public key to the server's configuration by editing /etc/wireguard/wg0.conf and appending:

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

Then restart WireGuard: sudo systemctl restart wg-quick@wg0.

You can add multiple clients by repeating Steps 4 and 5 with different IP addresses (e.g., 10.0.0.3/32).

Security and Performance Tips

Testing Your VPN

Connect the client and verify your IP is now the server's IP. Check for leaks by visiting a site like ipleak.net. Ensure your DNS resolves through the VPN (you set DNS in client config).

If you need a reliable server provider or additional IPs for your VPN, consider using proxies from proxyuniverse.org for extra redundancy and location options.

Common Troubleshooting

Setting up WireGuard is a rewarding project that gives you a fast, secure tunnel to the internet. Once configured, you can add as many clients as you need. For advanced setups, you can route specific traffic or use a VPS with multiple IPs from proxyuniverse.org to bypass geo-restrictions.


Related articles