Central Server
A central server gives remote devices a reachable target, allowing them to traverse firewalls and NAT and connect. Let’s create a server and generate and add your first remote peer.
Preparation
You’ll need:
- Public Domain Name or Static IP
- Linux Server
- Ability to port-forward UDP 51830
A dynamic domain name will work and it’s reasonably priced (usually free). You just need something for the peers to connect to, though a static IP is best. You can possibly break connectivity if your IP changes while your peers are connected or have the old IP cached.
We use Debian in this example and derivatives should be similar. UDP 51820 is the standard port but you can choose another if desired.
You must also choose a VPN network that doesn’t overlap with your existing networks. We use 192.168.100.0/24 in this example.
Installation
sudo apt install wireguard-tools
Configuration
All the server needs is a single config file and it will look something like this:
[Interface]
Address = 192.168.100.1/24
ListenPort = 51820
PrivateKey = sGp9lWqfBx+uOZO8V5NPUlHQ4pwbvebg8xnfOgR00Gw=
We picked .1
as our server address (pretty standard), created a private key with the wg
tool, and put that in the file /etc/wireguard/wg0.conf
. Here’s the commands to do that.
# As root
cd /etc/wireguard/
umask 077
wg genkey > server_privatekey
wg pubkey < server_privatekey > server_publickey
read PRIV < server_privatekey
cat << EOF > wg0.conf
[Interface]
Address = 192.168.100.1/24
ListenPort = 51820
PrivateKey = $PRIV
EOF
Operation
The VPN operates by creating network interface and loading a kernel module. You use the linux ip
command to add a network interface of type wireguard (that automatically loads the kernel module) or use the wg-quick
command do do it for you. Name the interface wg0
and it will pull in the config wg0.conf
Test the Interface
wg-quick up wg0
ping 192.168.100.1
wg-quick down wg0
Enable The Service
For normal use, employ systemctl to create a service using the installed service file.
systemctl enable --now wg-quick@wg0
Administration
The most common procedure is adding new clients. Each must have a unique key and IP, as the keys are hashed and used as part of the internal routing.
Create a Client
Let’s create a client config file by generating a key and assigning them an IP. It’s not secure, but it is pragmatic.
wg genkey > client_privatekey # Generates and saves the client private key
wg pubkey < client_privatekey # Displays the client's public key
Add the client’s public key and IP to your server’s wg0.conf
and reload. For the IP, it’s fine to just increment. Note the /32, meaning we will only accept that IP from this peer.
[Interface]
Address = 192.168.100.1/24
ListenPort = 51820
PrivateKey = XXXXXX
## Some Client ##
[Peer]
PublicKey = XXXXXX
AllowedIPs = 192.168.100.2/32
wg-quick down wg0 && wg-quick up wg0
Send The Client Config
A client config file should look similar to this. The [Interface] is about the client and the [Peer] is about the server.
[Interface]
PrivateKey = THE-CLIENT-PRIVATE-KEY
Address = 192.168.100.2/32
[Peer]
PublicKey = YOUR-SERVERS-PUBLIC-KEY
AllowedIPs = 192.168.100.0/24
Endpoint = your.server.org:51820
Put in the keys and domain name, zip it up and send it on to your client as securely as possible. One neat trick is to display a QR code right in the shell. Devices that have a camera can import from that.
qrencode -t ANSIUTF8 < client-wg0.conf
Test The Client
You should be able to ping the server from the client. If not, take a look at the troubleshooting steps.
Next Steps
We haven’t enabled forwarding yet or set up firewall rules as those depend on what role your central peer will play. Proceed on to Remote Access or Remote Management as desired.
Troubleshooting
When something is wrong, you don’t get an error message, you just get nothing. You bring up the client interface but you can’t ping the server 192.168.100.1. But you can turn on log messages on the server with this command.
echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control
dmesg
# When done, send a '-p'
Key Errors
wg0: Invalid handshake initiation from 205.133.134.15:18595
In this case, you should check your keys and possibly take the server interface down and up.
Typeos
ifconfig: ioctl 0x8913 failed: No such device
Check your conf is named /etc/wireguard/wg0.conf
and look for any typoes.
Firewall Issues
If you see no wireguard error messages, you should suspect your firewall. Since it’s UDP you can’t test the port directly, but you can use netcat.
nc -ulp 51820 # On the server
nc -u some.server 51820 # On the client. Type and see if it shows up on the server
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.