🚀 20% OFF for new customers on Linux and Windows servers! Code: ILK20  |  Order Now →
shield Security & Hardening

Setting Up a WireGuard VPN Server on Ubuntu: Step-by-Step Guide

We walk you through installing WireGuard VPN on your Ubuntu server step by step. Boost your server security with a fast, secure, and modern VPN solution, with practical examples.

person
Editör
(Updated: Jul 28, 2026) schedule 5 min read visibility 16 views

What is WireGuard and Why Should You Choose It?

WireGuard has become one of the most popular VPN protocols in recent years. Compared to traditional solutions like OpenVPN, it is much faster, simpler, and more secure. Since it operates at the kernel level, latency is nearly zero. Moreover, being written in just 4,000 lines of code makes security audits easier. By setting up WireGuard on your Ubuntu server, you can establish both remote access and site-to-site connections. In this article, we will build and configure a WireGuard server from scratch.

Pre-Installation Requirements

Your server should be running Ubuntu 20.04 or later. We recommend having root privileges. Also, ensure that UDP port 51820 is open on your server. Adjust your firewall settings accordingly. For example, if you are using UFW, you can open the port with the following command:

sudo ufw allow 51820/udp

Installing WireGuard

To install WireGuard on Ubuntu, you need to add a PPA. First, update your system packages:

sudo apt update && sudo apt upgrade -y

Then, add the WireGuard repository and install it:

sudo add-apt-repository ppa:wireguard/wireguard
sudo apt update
sudo apt install wireguard -y

Once installation is complete, the wg and wg-quick commands will be ready for use. At this point, you can check if the module is loaded by running lsmod | grep wireguard. If there is no output, you may need to load the kernel module manually.

Generating a Key Pair

WireGuard works with private and public key pairs. You must generate unique keys for the server and each client. To generate the server keys:

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

This command writes the private key to /etc/wireguard/server_private.key and the public key to /etc/wireguard/server_public.key. Set the permissions so that only root can read them:

sudo chmod 600 /etc/wireguard/server_private.key

Server Configuration

Now, create the actual configuration file. Edit /etc/wireguard/wg0.conf as follows:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = (your_server_private_key)

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

The Address line sets the IP address assigned to the WireGuard interface. In this example, we used the 10.0.0.0/24 subnet. Paste the private key you generated earlier into the PrivateKey field. The PostUp and PostDown rules add and remove the iptables rules needed for routing VPN traffic. Replace eth0 with your main network interface.

If your server uses IPv6, you need to add similar rules with ip6tables. Also, to enable packet forwarding, find the line net.ipv4.ip_forward=1 in /etc/sysctl.conf and uncomment it. Then apply the setting with sysctl -p.

Adding a Client

You need to generate a key pair for each client. You can do this on the server and then send the configuration file to the client. A sample client configuration can be saved as client1.conf under /etc/wireguard/:

[Interface]
PrivateKey = (client_private_key)
Address = 10.0.0.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = (server_public_key)
Endpoint = (server_ip_address):51820
AllowedIPs = 0.0.0.0/0

Address is the IP assigned to the client, and DNS is the DNS server to use. With AllowedIPs, you can route all traffic through the VPN. After preparing the client file, you must also add a [Peer] section to the server configuration. In the same wg0.conf file, add the client's public key and IP address:

[Peer]
PublicKey = (client_public_key)
AllowedIPs = 10.0.0.2/32

This way, the server will accept packets from the client. To add multiple clients, simply create a separate [Peer] block for each.

Starting the WireGuard Interface

Once the configuration is complete, start the interface with:

sudo wg-quick up wg0

Check if it succeeded with sudo wg show. If everything is fine, enable the interface to start automatically at boot:

sudo systemctl enable wg-quick@wg0

Now, on the client side, you can establish a connection using the configuration file. For example, on a Linux client, the command wg-quick up client1.conf suffices. For mobile or Windows clients, use the official WireGuard applications.

Security Tips

Although WireGuard is secure by nature, it is wise to take some additional precautions. First, do not add unnecessary [Peer] entries to the server's wg0.conf file. Defining only one IP per client reduces the potential attack surface. Also, renew client keys regularly. Especially when mobile devices are lost, you can immediately revoke access by removing the corresponding client's public key from the server.

Another important point is to keep the AllowedIPs setting as narrow as possible. If you don't need to route all traffic, define only specific subnets. This avoids unnecessary bandwidth usage. Finally, ensure the security of other services running on the server. Leaving no open ports besides WireGuard will make it harder for attackers.

Common Issues and Solutions

Some users report being able to connect but unable to access the internet. The most common cause is the iptables rules not working correctly. Make sure the MASQUERADE rule in PostUp matches the correct interface. Also, if you use 0.0.0.0/0 in allowed-ips, remember that the client's default route changes. For DNS resolution issues, do not forget to specify a DNS server in the client configuration.

Another issue is a blocked port. Verify that your server allows incoming connections on UDP port 51820. Additionally, some cloud providers (AWS, Azure) may require you to open this port in their virtual firewalls. You can test port accessibility with tools like telnet or nc.

Conclusion

WireGuard is a VPN solution that can be set up on your Ubuntu server in a short time and offers high performance. By following the steps in this guide, you can achieve both secure remote access and a transparent network infrastructure. Remember, security is not just about proper configuration but also regular updates and monitoring. Keep track of updates released by the WireGuard team and always keep your server up to date.

Share This Article

Related Posts