#!/coding/blatt
Sammelsurium mit Schwerpunkten Linux & IT-Sicherheit

Wireguard: VPN unter Ubuntu einrichten (Client & Server)

Wireguard ist eine moderne VPN-Software, die alternativ zu OpenVPN oder IPsec für VPNs verwendet werden kann. Im Gegensatz zu den letztgenannten zielt Wireguard darauf ab einfacher, leichtgewichtiger, performanter sowie effizienter zu sein. Aus diesem Grund wird bspw. auch der Einsatz von Wireguard in eingebetten Systemen mit begrenzten Ressourcen, wie z.B. Routern, immer beliebter.

Des Weiteren setzt Wireguard nicht auf eine Client-Server-, sondern auf eine Peer-to-Peer-Architektur in Verbindung mit Public-Key-Verschlüsselung. Prinzipiell lässt sich mit Wireguard aber auch ein VPN mit bekannter Client-Server-Stuktur abbilden. Wie das in der einfachsten Form unter Ubuntu eingerichtet werden kann, zeigt der folgende Beitrag.

Folgende Software wurde verwendet:
  • Ubuntu v20.04 LTS
  • Wireguard v1.0.20200513

VPN mit Wireguard einrichten

Für diesen Beitrag wollen wir ein VPN zwischen zwei Teilnehmern (Peers) herstellen. Ein Teilnehmer nimmt dabei die Rolle des Clients und der andere des Servers ein.

Netzwerkaufbau

Client und Server befinden sich beide im Netzwerk 192.168.122.0/24, wobei beide folgende IPs haben:

  • Server: 192.168.122.19
  • Client: 192.168.122.70

Es soll nun ein VPN für den Netwerkbereich 192.168.9.0/24 aufgespannt werden. Folgende IPs & Ports sollen gelten:

  • Server: 192.168.9.1, Port: 55555
  • Client: 192.168.9.2, Port: 55556

Wireguard auf Server einrichten - 1. Teil

Als erstes wird Wireguard auf dem System installiert:

sudo apt install wireguard
Terminal / Konsole

Als nächstes muss ein neues Netzwerk-Interface angelegt und Wireguard konfiguriert werden. Für diese Schritte benötigen wir stets Root-Rechte, weshalb wir einfachhalber eine Root-Shell starten:

sudo -i
Terminal / Konsole

Nun legen wir ein neues Netzwerk-Interface mit dem Namen my-vpn an. Zudem weisen wir dem neuangelegten Interface eine IP zu (vgl. o.a. Netzwerkaufbau):

ip link add my-vpn type wireguard
ip addr add 192.168.9.1/24 dev my-vpn
Terminal / Konsole

Wechselt nun in das Konfigurationsverzeichnis /etc/wireguard/, welches bei der Installation angelegt wurde. Außerdem, bevor wir fortfahren, stellen wir per umask sicher, dass alle Dateien, die wir im weiteren Verlauf in der geöffneten Shell anlegen, nur Lese- und Schreibrechte für Root gesetzt bekommen.

cd /etc/wireguard/
umask 0077
Terminal / Konsole
Hinweis Warum ist umask 0077 wichtig?

Im Konfigurationsverzeichnis von Wireguard speichern wir den privaten Schlüssel (Private-Key) des Peers bzw. Servers. Auf den Private-Key sollte aus Sicherheitsgründen nur Root (Administrator des Systems) Zugriff haben.

Stellt euch den Private-Key als Passwort für den Zugang zu eurem VPN vor. Wer den Private-Key kennt, kann sich mit eurem sicheren bzw. verschlüsselten VPN verbinden. Insofern solltet ihr genauso wie ihr eure Passwörter vor dem Zugriff Dritter schützt, auch eure Private-Keys schützen und sicher aufbewahren.

Folgend erstellen wir nun das Schlüsselpaar für den Server, welches aus einem privaten sowie öffentlichen Schlüssel (Private-Key & Public-Key) besteht:

wg genkey | tee server.private-key | wg pubkey > server.public-key
Terminal / Konsole

Als nächstes nehmen wir eine weitere Konfiguration am Netzwerk-Interface vor. Zum einen legen wir den Port fest, auf dem das Interface lauschen wird und wir legen den zu verwendenden Private-Key fest:

wg set my-vpn listen-port 55555 private-key server.private-key
Terminal / Konsole

Es folgt die Ereugung bzw. Speicherung der eigentichen Wireguard-Konfigurationsdatei:

touch my-vpn.conf
wg-quick save my-vpn
Terminal / Konsole

Die erstellte Konfigurationsdatei sollte wie folgt aussehen:

[Interface]
Address = 192.168.9.1/24
ListenPort = 55555
PrivateKey = [Private-Key-Server]
/etc/wireguard/my-vpn.conf - Server

Unter dem Punkt PrivateKey sollte der generierte Private-Key, den wir in server.private-key gespeichert haben, eingetragen sein.

Ihr könnt nun die Root-Shell per exit verlassen. Damit wäre der erste Teil der Serverkonfiguration abgeschlossen. Bevor wir aber zum Client kommen, erstellen wir uns eine Verbindungsdatei mit den öffentlichen Daten des Servers. Diese Datei verwenden wir später zur Konfiguration des Clients.

Wir benötigen drei Informationen des Servers: den Public-Key, den Port des VPN-Interfaces sowie die "öffentliche" IP-Adresse, über die der Server vom Client erreichbar ist. Die Daten können wir über folgende Befehle erhalten:

sudo wg show my-vpn public-key
sudo wg show my-vpn listen-port
ip -c address
Terminal / Konsole

Mithilfe der erhaltenen Daten erstellen wir nun die besagte Verbindungsdatei server.peer-conf, so dass sie wie folgt aussieht:

[Peer]
# server
PublicKey = GX9BG67Gf1H1YA/bpZoQWEqNMqdWCgyCVFq8ui/dlBc=
Endpoint = 192.168.122.19:55555
AllowedIPs = 192.168.9.0/24
~/server.peer-conf

Mittels dieser Daten, die für jeden Client in die eigene Konfigurationsdatei kopiert werden, weiß der Client, wie der Server zu erreichen ist. In diesem Fall würde der Client alle Anfragen an AllowedIps mit dem PublicKey des Servers verschlüsseln und an den Server senden. Die Initialisierung der VPN-Verbindung mit dem Server erfolgt dabei über die Endpoint-Adresse.

Wireguard auf Client einrichten

Die Einrichtung auf dem Client erfolgt erst einmal analog zur Einrichtung auf dem Server. Aus diesem Grund gehe ich auf die folgenden Befehle nicht noch einmal näher ein:

sudo apt install wireguard
sudo -i
ip link add my-vpn type wireguard
ip addr add 192.168.9.2/24 dev my-vpn
cd /etc/wireguard/
umask 0077
wg genkey | tee client.private-key | wg pubkey > client.public-key
wg set my-vpn listen-port 55556 private-key client.private-key
touch my-vpn.conf
wg-quick save my-vpn
Terminal / Konsole

Kopiert nun die auf dem Server zuvor erstellte Datei server.peer-conf auf den Client ins Verzeichnis /etc/wireguard. Anschließend ergänzen wir die Konfiguration des Clients um die Serverdaten wie folgt:

wg addconf my-vpn server.peer-conf
wg-quick save my-vpn
Terminal / Konsole

Als Resultat sollte die Konfigurationsdatei my-vpn.conf auf dem Client so aussehen:

[Interface]
Address = 192.168.9.2/24
ListenPort = 55556
PrivateKey = [Private-Key-Client]

[Peer]
PublicKey = GX9BG67Gf1H1YA/bpZoQWEqNMqdWCgyCVFq8ui/dlBc=
AllowedIPs = 192.168.9.0/24
Endpoint = 192.168.122.19:55555
/etc/wireguard/my-vpn.conf - Client

Die Root-Shell kann nun wieder per exit geschlossen werden. Analog zum Server erstellen wir nun eine Verbindungsdatei client.peer-conf mit den öffentlichen Daten des Clients. Die entsprechenden Informationen lassen sich über die bekannten Befehle ermitteln:

sudo wg show my-vpn public-key
sudo wg show my-vpn listen-port
ip -c address
Terminal / Konsole

Die erstellte Verbindungdatei sieht dann etwas abweichend zum Server wie folgt aus:

[Peer]
# client
PublicKey = X4im6+fUMvo2wLA+EpbbD7nwX7gnwO8pwPBKAc4mtEM=
#Endpoint = 192.168.122.70:55556
AllowedIPs = 192.168.9.2/32
~/client.peer-conf

In unserer Client-Server-Nachbildung benötigen wir den Endpoint des Clients nicht (siehe auch Wireguard: Built-in Roaming). Außerdem ist wichtig, dass ihr bei AllowedIPs die Netzmaske 32 angebt. Unter dieser IP-Adresse ist euer Client im VPN dann erreichbar.

Die Einrichtung des Clients ist damit soweit abgeschlossen.

Wireguard auf Server einrichten - 2. Teil

Kopiert die zuvor erstellte client.peer-conf nach /etc/wireguard und passt die Serverkonfiguration wie folgt an:

sudo -i
wg addconf my-vpn client.peer-conf
wg-quick save my-vpn
Terminal / Konsole

Die angepasste Konfigurationsdatei sollte nun wie folgt aussehen:

[Interface]
Address = 192.168.9.1/24
ListenPort = 55555
PrivateKey = [Private-Key-Server]

[Peer]
PublicKey = X4im6+fUMvo2wLA+EpbbD7nwX7gnwO8pwPBKAc4mtEM=
AllowedIPs = 192.168.9.2/32
/etc/wireguard/my-vpn.conf - Server

Schließt die Root-Shell per exit. Damit ist auch die Konfiguration des Servers abgeschlossen.

Wireguard starten & VPN-Verbindung testen

Sowohl auf Client als auch Server starten wir nun noch das Netzerk-Interface:

sudo ip link set my-vpn up
sudo ip link set my-vpn up
Terminal / Konsole
Hinweis Firewall anpassen

Wenn ihr eine Firewall, wie z.B. ufw, verwendet müsst ihr sowohl auf dem Client als auch Server die entsprechenden UDP-Ports freigeben.

Zukünftig könnt ihr das Wireguard-VPN-Interface auch mit folgenden Befehlen einfach starten und beenden:

sudo wg-quick up my-vpn
sudo wg-quick down my-vpn
Terminal / Konsole

Zum Testen, ob die VPN-Verbindung erfolgreich hergestellt werden konnte, können wir z.B. auf dem Client den Server anpingen:

ping 192.168.9.1
Terminal / Konsole

Außerdem könnt ihr euch die VPN-Verbindungsinformationen mit folgendem Befehl anzeigen lassen:

sudo wg show my-vpn
interface: my-vpn
  public key: X4im6+fUMvo2wLA+EpbbD7nwX7gnwO8pwPBKAc4mtEM=
  private key: (hidden)
  listening port: 55556

peer: GX9BG67Gf1H1YA/bpZoQWEqNMqdWCgyCVFq8ui/dlBc=
  endpoint: 192.168.122.19:55555
  allowed ips: 192.168.9.0/24
  latest handshake: 19 seconds ago
  transfer: 476 B received, 564 B sent
Terminal / Konsole

Weiterführende Informationen

Je nach Anwendungsfall gibt es jetzt diverse Einstellungsmöglichkeiten, die ihr basierend auf der hier im Beitrag vorgestellten Konfiguration vornehmen könnt. Bspw. könntet ihr einstellen, dass der komplette Traffic des Clients über das Wireguard-VPN-Interface geroutet wird. Ihr könntet auch feingranular einstellen, welche Programme ihren Traffic über das VPN-Interface und welche ihren Traffic weiterhin über die normalen Ethernet- und/oder Wireless-Interfaces routen sollen (hierfür eignen sich bspw. Network-Namespaces).

Weitere Informatonen zu Wireguard findet ihr z.B. auf den folgenden Webseiten:

Fazit

Für mich und meine Anwendungsfälle ist Wireguard derzeit die bevorzugte VPN-Lösung. Es setzt auf aktuelle Krypto-Standards, ist einfach zu konfigurieren, effizient und schnell.