Wireguard in fünf Minuten

Wireguard ist ein VPN mit direkter Integration in den Linux Kernel. Wireguard ist mit ca. 4000 Zeilen Code vergleichsweise übersichtlich und deshalb wartbarer als z.B. OpenVPN. Wireguard ist außerdem schneller und um Längen leichter aufzusetzen. Alle benötigten Werkzeuge zur Schlüsselverwaltung sind dabei

In den meisten Distributionen ist Wireguard verfügbar. In CentOS 8 sollte man einfach Kernel 6.x nachinstallieren, denn das Wireguard Modul ist dort fest einkompiliert. Nach erfolgreicher Installation kann man das Kernelmodul testen.

modinfo wireguard

Server Grundkonfiguration

Wenn diese Ausgabe nicht leer ist, kann man loslegen. Wir generieren einen privaten Schlüssel und schreiben ihn direkt in eine neue Konfigurationsdatei.

sudo -i
cd /etc/wireguard/
wg genkey | tee wg0.conf
vim wg0.conf

Dann die Datei editieren und speichern.

[Interface]
PrivateKey = <privater Schlüssel>
Address = 192.168.10.1/24
ListenPort = 12345
PostUp = iptables -A FORWARD -i wg1 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens11 -j MASQUERADE;
PostDown = iptables -D FORWARD -i wg1 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens11 -j MASQUERADE;

Den Service aktivieren und starten

systemctl enable wg-quick@wg0.service --now

Firewall

Beispielkonfiguration für firewall-cmd

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Wireguard</short>
  <description>Ports for currently configured Wireguard instances</description>
  <port protocol="udp" port="12345"/>
  ...
</service>

Konfigurationsdatei nach /etc/firewalld/services/wireguard.xml speichern. Dann den Service aktivieren und die Firewallkonfiguration neu laden.

firewall-cmd --add-service=wireguard --permanent
firewall-cmd --reload

Klient vorbereiten

Auf dem Klienten ebenfalls einen privaten Schlüssel erstellen.

wg genkey | tee wg0.conf | wg publickey >> wg0.conf

Der zugehörige öffentliche Schlüssel wird hier ebenfalls erzeugt und mit in die Konfigurationsdatei gespeichert, da wir ihn später brauchen und nur umständlich neu generieren können.

[Interface]
PrivateKey = <Privater Schlüssel (Zeile 1)>
Address = 192.168.10.2/24
# <Öffentlicher Schlüssel (Zeile 2)

# Angaben zum Server
[Peer]
Publickey = <Ausgabe des Kommandos `wg` auf Server enthält öffentlichen Schlüssel>
Endpoint = <öffentliche IP>:12345
AllowedIPs = 0.0.0.0/0 # Defaultroute für alle Pakete dieser Verbindung
PersistentKeepalive = 25

Klient auf dem Server hinzufügen

Auf dem Server für den Klienten einen Abschnitt in der Serverkonfiguration anlegen.

....
[Peer]
AllowedIPs = 192.168.10.2/32 # Ja, es muss 32 sein.
PublicKey = <öffentlicher Schlüssel des Klienten (2te Zeile aus der Konfigurationsdatei)> 

Dann Server neu starten.

systemctl restart wg-quick@wg0.service

Klient starten

Mobiltelefon

Man kann die Klient Konfiguration verwenden, um damit z.B. ein Mobiltelefon zu konfigurieren. Dafür auf dem Telefon die Wireguard App installieren und die Konfigurationsdatei als QR-Code darstellen. Den QR-Code dann für die Einrichtung am Mobiltelefon verwenden.

qrencode -t ansiutf8 < wg0.conf

Als Systemd Service

systemctl enable wg-quick@wg0.service --now

Via NetworkManager

Man kann die Konfigurationsdatei auch in den NetworkManager importieren.

nmcli connection import type wireguard file wg0.conf

Über nm-connection-editor kann man die Verbindung nachträglich bearbeiten und z.B. automatische Verbindung konfigurieren.