Setup Wireguard VPN Server on Ubuntu

This tutorial is going to show you how to set up your own WireGuard VPN server on Ubuntu.
WireGuard is made specifically for the Linux kernel. It runs inside the Linux kernel and allows you to create fast, modern, and secure VPN tunnel.
TL;DR

Prerequisites

This tutorial assumes that the VPN server and VPN client are both going to be running on Ubuntu 20.04 operating system.

Setting Up the WireGuard Server

Install Wireguard from the default Ubuntu repository:

1sudo apt update
2sudo apt install wireguard

You should got the two cli wg and wg-quick now.
Generate a key pair for your server:

1wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
2cat /etc/wireguard/privatekey
3cat /etc/wireguard/publickey

Keep the server key pair in your clipboard or somewhere temporary place.
Now, edit the wireguard server configuration file.
Check the name of your public network interface first:

1ip -o -4 route show to default | awk '{print $5}'

Then create wireguard configuration file:

1sudo vim /etc/wireguard/wg0.conf

Add this content:

1[Interface]
2Address = 10.0.0.1/24
3SaveConfig = true
4ListenPort = 51820
5PrivateKey = SERVER_PRIVATE_KEY
6PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
7PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
  • Address - A comma-separated list of v4 or v6 IP addresses for the wg0 interface. Use IPs from a range that is reserved for private networks (10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16).

  • SaveConfig - When set to true, the current state of the interface is saved to the configuration file when shutdown.

  • PostUp - Command or script that is executed before bringing the interface up. In above configuration, we’re using iptables to enable masquerading. This allows traffic to leave the server, giving the VPN clients access to the Internet.

  • eth0 - Name of your public network interface

Secure the configuration file and private key file like so:

1sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}

Launch the vpn network interface you just configured:

1sudo wg-quick up wg0
2sudo systemctl enable [email protected]
3# `wg0` is just name of the config file you've created above.

Configure Server Networking and Firewall

IP forwarding must be enabled for NAT to work. Do the following:

1sudo vim /etc/sysctl.conf

Uncomment or add this line:

1net.ipv4.ip_forward=1

Apply the change:

1sudo sysctl -p

Optionally, if ufw is active on your server, do this:

1sudo ufw allow 51820/udp

Client Setup

Installation is all the same, and so the key pair generation is:

1wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

Create Wireguard client configuration:

1sudo vim /etc/wireguard/wg0.conf
1[Interface]
2PrivateKey = CLIENT_PRIVATE_KEY
3Address = 10.0.0.2/24
4
5
6[Peer]
7PublicKey = SERVER_PUBLIC_KEY
8Endpoint = SERVER_IP_ADDRESS:51820
9AllowedIPs = 0.0.0.0/0
  • Address - A comma-separated list of v4 or v6 IP addresses for the wg0 interface. Your client machine will have this private ip.

  • PrivateKey - To see the contents of the file on the client machine run: sudo cat /etc/wireguard/privatekey

  • AllowedIPs - A comma-separated list of v4 or v6 IP addresses from which incoming traffic for the peer is allowed and to which outgoing traffic for this peer is directed. We’re using 0.0.0.0/0 because we are routing the traffic and want the server peer to send packets with any source IP.

Add the Client Peer to the Server Peer

On the server, use this command:

1sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2

You should be able to launch your client now:

1sudo wg-quick up wg0
2sudo wg show wg0

If you want to remove a peer from your server, this will work:

1sudo wg set wg0 peer CLIENT_PUBLIC_KEY remove

That's it.
Happy networking! 😎

comments powered by Disqus