Wireguard, ein kurz und bündiges Beispiel

Wireguard ist schnell und einfach konfiguriert. Hier ein Beispiel zwischen Host-A und Host-B.

Wireguard, ein kurz und bündiges Beispiel

Ob Wireguard bereits nativ im Kernel verfügbar ist, entnimmt man der Dokumentation seiner Distribution. Offiziell hat Wireguard den Einzug in Linux Version 5.6 erhalten.
Fern der Linux Welt gibt es allerdings auch Implementationen für Windows, Android und IOS.

Distribution (Version) Kernel Version Paket
Ubuntu 20.04 5.4 wireguard
Ubuntu 18.08 4.15 wireguard
Ubuntu 16.04 4.4 wireguard
Arch Linux 5.6 wireguard-tools

Wireguard ist prinzipiell verbindungslos, kommuniziert über UDP und handelt zu beginn beim Handshake einen symmetrischen Schlüssel aus, der bis zum Ablauf zwischen zwei Partnern genutzt wird.
Die sichere Übertragung des gemeinsamen Schlüssels wird hierbei über die Ver- und Entschlüsselung mittels asymmetrischen Verfahrens gewährleistet. Jeder Host muss deshalb den öffentlichen Schlüssel des jeweilig anderen Partners kennen. Die Entschlüsselung kann nur mittels privatem Schlüssel erfolgen, der unbedingt geheim gehalten werden muss. Jeder Host nutzt einen individuellen öffentlichen und privaten Schlüsel!

Verbindungen können in Wireguard beiseitig aufgebaut werden, sofern der verwendete UDP-Port vom initalisierenden Host erreicht werden kann.
Befindet sich zum Beispiel Host-A hinter einem NAT-Gateway (ohne entsprechende Forwarding Regeln), kann die Verbindung nur von Host-A zu Host-B aufgebaut werden.

Mehr Informationen zu Wireguard unter Links!

Hinweis zur Konfiguration

Alle vorgenommenen Konfigurationen geschehen mittels Systemd-Networkd. Dies wird sowohl von Ubuntu, als auch Arch Linux unterstützt.


Keys generieren

Auf jeden Host werden die eigenen Schlüssel generiert! Bei diesem Beispiel host-a durch z.B. host-b, host-c ersetzen...

mkdir -p /etc/wireguard
cd /etc/wireguard
# umask 0077 sorgt für alleinige Schreibrechte vom Datei-Besitzer
(umask 0077; wg genkey > host-a.key)
wg pubkey < host-a.key > host-a.pub

Preshared Key (optional!)

Zusätzliche Sicherheit wird durch einen gemeinsam bekannten und identischen Schlüssel erreicht. Dieser ist optional und muss zusätzlich auf einem Host generiert werden. Der Inhalt wird abschließend auf beiden Hosts in die die Konfiguration "PresharedKey" geschrieben.

mkdir -p /etc/wireguard
cd /etc/wireguard
wg genpsk > host-a_zu_host-b.psk

Interface (netdev) konfigurieren

Diese Konfiguration erzeugt das Interface und die darauf aufbauenden Tunnel.
Wichtig hierbei: Die Key-Parameter sind keine Pfade zu Dateien, sondern die Schlüssel selbst!

AllowedIPs wird verwendet um IP-Netze (oder einzelne IPs /32) festzulegen, die von der Gegenseite eingeliefert werden dürfen. Man definiert somit implizit eine Whitelist und sichert sich gegen spoofing ab, denn werden andere IP-Adressen durch den Tunnel geschickt, werden die Pakete verworfen. Gleichzeitig wird nur für konfigurierte Netze eine Route (durch den Tunnel) angelegt.
Die Gegenstelle muss hierbei die IP-Adressen nicht selbst gebunden haben, sondern kann diese auch als Router weiterleiten...
Pro Netz (IP-Adresse) wird eine AllowedIPs-Zeile konfiguriert.

Host-A

#File: /etc/systemd/network/90-wg0.netdev

[NetDev]
Name=wg0
Kind=wireguard
Description=WireGuard tunnel wg0

[WireGuard]
ListenPort=55667
PrivateKey=PRIVATE_KEY_VON_HOST_A

# pro Host der verbunden werden soll, muss eine WireGuardPeer-Definition erfolgen
[WireGuardPeer]
PublicKey=PUBLIC_KEY_VON_HOST_B
AllowedIPs=10.0.0.2/32
#AllowedIPs=192.168.44.0/24
# optinal (!), falls Port von host-b auch über Internet erreichbar wäre
#Endpoint=host-b.com:34455
# optional für mehr Sicherheit (siehe weiter unten - Preshared Keys)
#PresharedKey=PSK_host-a_zu_host-b

Host-B

#File: /etc/systemd/network/90-wg0.netdev

[NetDev]
Name=wg0
Kind=wireguard
Description=WireGuard tunnel wg0

[WireGuard]
ListenPort=34455
PrivateKey=PRIVATE_KEY_VON_HOST_B

# pro Host der verbunden werden soll, muss eine WireGuardPeer-Definition erfolgen
[WireGuardPeer]
PublicKey=PUBLIC_KEY_VON_HOST_A
AllowedIPs=10.0.0.1/32
#AllowedIPs=172.16.16.64/26
# einer der beiden Partner muss die Verbindung initiieren, in diesem Fall Host-B zu Host-A
Endpoint=host-a.com:55667
# optional für mehr Sicherheit (siehe weiter unten - Preshared Keys)
#PresharedKey=PSK_host-a_zu_host-b

Network konfigurieren

Die lokale IP-Konfiguration wird auf das Tunnel-Interface gebunden. Hierbei muss der Name (wg0) bei weiteren Tunneln ggf. angepasst werden!

Die lokale IP-Adresse muss mit der erlaubten (AllowedIPs) die auf den anderen Hosts konfiguriert ist übereinstimmen.

Host-A

#File: /etc/systemd/network/90-wg0.network

[Match]
Name=wg0

[Network]
Address=10.0.0.1/24

Host-B

#File: /etc/systemd/network/90-wg0.network

[Match]
Name=wg0

[Network]
Address=10.0.0.1/24

Nach der Konfiguration muss diese noch neugeladen werden:

systemctl restart systemd-networkd

Weitere Einstellungen, Hilfestellungen sind sehr gut im Wiki von Archlinux beschrieben!


https://www.wireguard.com/
https://wiki.archlinux.org/index.php/WireGuard