Die Performance zwischen Wireguard und IPSec hatte ich schon in einem vergangenen Beitrag verglichen. Aber wie wird Wireguard sinnvoll eingerichtet und debugged? Dieser Beitrag ist leicht abgewandelt aus meiner privaten Dokumentation übernommen und erklärt die Einrichtung anhand von Debian. Ich gehe von einem grundlegendem Wissen über Wireguard und Netzwerk im allgemeinen voraus. Für eine Einführung in Wireguard empfehle ich folgenden Link:
https://www.wireguard.com/#simple-network-interface
Installation - Debian
Dieser Teil ist in gekürzter Form aus dem Debian Wiki entnommen:
https://wiki.debian.org/Wireguard
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable-wireguard.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
apt update
apt install linux-headers-amd64
apt install wireguard
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ip_forward.conf
sysctl -p /etc/sysctl.d/99-ip_forward.conf
Private / Public Keys generieren
PRIV=$(wg genkey) && PUB=$(echo $PRIV | wg pubkey) && echo -e "PublicKey = $PUB\nPrivateKey = $PRIV"
Konfiguration
Bei Wireguard gibt es keinen "Server". Jeder Wireguard Endpoint ist ein Peer im Netzwerk. Die Konfiguration besteht bei jedem Peer aus einer Konfigurationsdatei.
Peer "Server"
Die folgende Beispielconfig unter /etc/wireguard mit z.B. dem Namen wg-internal.conf abspeichern.
[Interface]
# PublicKey = <SuperServerNotSecretblahblah>
PrivateKey = <SuperServerSecretblahblah=>
Address = 192.168.102.1/24
ListenPort = 51821
PostUp = iptables -t nat -A POSTROUTING -s 192.168.102.0/24 -d <Tolle.Server.IP> -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -s 192.168.102.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 192.168.102.0/24 -d <Tolle.Server.IP> -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 192.168.102.0/24 -o eth0 -j MASQUERADE
# Generate Keypair:
#
# PRIV=$(wg genkey) && PUB=$(echo $PRIV | wg pubkey) && echo -e "PublicKey = $PUB\nPrivateKey = $PRIV"
#
#
# Reload Config:
#
# wg syncconf wg-internal <(wg-quick strip wg-internal)
#
# User1
[Peer]
PublicKey = <SuperUser1NotSecretblahblah>
AllowedIPs = 192.168.102.2/32
Client
Unterstützte Betriebssysteme können auf der offiziellen Wireguard Seite nachgesehen werden:
https://www.wireguard.com/install/
Unterstützt werden unter anderem die Systeme:
- macOS
- Linux
- Android
- Windows
- iPhone
- FreeBSD (wobei diese Implementierung wohl noch mit Vorsicht zu genießen ist)
Folgende Konfiguration erzeugt am Peer "Client" einen VPN Split Tunnel. Nur die "internen" Netze werden über den Tunnel geschickt. Der Rest geht über den eigenen Internetzugang. Wenn dann noch Wireguard über den NetworkManager genutzt wird, setzt NetworkManager v1.16 voraus, kann Wireguard über den NetworkManager verwaltet werden. Nützlich, um z.B. die DNS-Search Domain(s) zu setzen, damit diese Domains über den im Wireguard Tunnel eingestellten DNS-Server aufgelöst werden.
[Interface]
# PublicKey = <SuperUser1NotSecretblah=>
PrivateKey = <SuperUser1Secretblah=>
Address = 192.168.102.2/24
DNS = 172.16.0.1
# "Server"
[Peer]
Endpoint = <Tolle.Server.IP>:51821
PublicKey = <SuperServerNotSecretblahblah>
AllowedIPs = 192.168.102.1/32
AllowedIPs = 10.0.0.0/8
AllowedIPs = 172.16.0.0/12
Diese Datei als z.B. wg-internal.conf abspeichern und per nmcli in den NetworkManager importieren.
nmcli connection import type wireguard file wg-internal.conf
nmcli connection modify wg-internal ipv4.dns-search contoso.com,internal.eu
nmcli connection up wg-internal
Und für die Menschen mit Bambusinternet...
nmcli connection modify wg-internal wireguard.mtu 1300
Oder ohne den NetworkManager, erfordert, dass die Konfiguration unter /etc/wireguard liegt:
sudo wg-quick up wg-internal
QR-Code aus Config Datei erstellen
Mobile Clients unter Android und iPhone können die Wireguard Konfiguration per QR-Code importieren.
qrencode -t ansiutf8 < wg-internal.conf
Neuen "Client" zum "Server" hinzufügen
Um einen neuen Client hinzuzufügen, muss ein neues Private / Public Keypair generiert und ein neuer Peer zur Serverkonfiguration hinzugefügt werden.
- Neues Client KeyPair erstellen (siehe Private / Public Keys generieren weiter oben)
- Auf dem "Server" Peer die Datei /etc/wireguard/wg-internal.conf um einen Peer erweitern
# User2
[Peer]
PublicKey = <SuperUser2NotSecretblahblah>
AllowedIPs = 192.168.102.3/32
AllowedIPs muss natürlich um eine Zahl erhöht und der erzeugte PublicKey genutzt werden.
- wireguard Konfiguration neu laden
wg syncconf wg-internal <(wg-quick strip wg-internal)
- Client wie weiter oben bei der Konfiguration "Client" beschrieben einrichten und als "Address" die selbe IP wie unter "AllowedIPs" beim Server Peer eintragen und den passenden PrivateKey einfügen
Wireguard debuggen
Um Wireguard zu debuggen, muss es nicht extra neu kompiliert werden. Es reicht, wenn debugfs unter /sys/kernel/debug gemountet ist.
Wireguard debugging einschalten
echo 'module wireguard +p' | sudo tee /sys/kernel/debug/dynamic_debug/control
Wireguard debugging ausschalten
echo 'module wireguard -p' | sudo tee /sys/kernel/debug/dynamic_debug/control
Logs ansehen
dmesg
oder
sudo journalctl -f
Beispielausgabe
[609111.685904] wireguard: wg-internal: Sending keepalive packet to peer 1 ([<Tolle.IP>]:51821/0%0)
[609120.971109] wireguard: wg-internal: Receiving handshake initiation from peer 3 ([<Tolle.IP>]:51821/0%0)
[609120.971111] wireguard: wg-internal: Sending handshake response to peer 3 ([<Tolle.IP>]:51821/0%0)
[609120.971340] wireguard: wg-internal: Keypair 14001 destroyed for peer 3
[609120.971341] wireguard: wg-internal: Keypair 14007 created for peer 3
[609120.988683] wireguard: wg-internal: Receiving keepalive packet from peer 3 ([<Tolle.IP>]:51821/0%0)
[609144.432936] wireguard: wg-internal: Sending keepalive packet to peer 1 ([<Tolle.IP>]:51821/0%0)
[609144.436857] wireguard: wg-internal: Sending keepalive packet to peer 2 ([<Tolle.IP>]:51821/0%0)
Fazit
Wireguard ist momentan meine favorisierte VPN Lösung. Mit der Aufnahme in den 5.6er Linux Kernel wird es hoffentlich eine breitere Unterstützung auch in Appliances finden. All meine Server sind über ein per ansible eingerichtetes Wireguard Full Mesh VPN miteinander verbunden und Tasker aktiviert auf meinem Android Smartphone automatisch eine Wireguard Verbindung nach Hause sobald es sich nicht mehr im heimischen WLAN befindet. Ich denke, für mich hat es sich schon längst bewährt.
Danke für den tollen Beitrag. Eine Frage habe ich allerdings bezüglich „Bambusinternet“. Was genau meinst du damit? Kabelprovider mit DS-lite? Davon abgesehen dachte ich, dass WireGuard die MTU zuverlässig selber aushandelt.
Mit Bambusinternet meine ich vor allem Internetanschlüsse mit geringer Bandbreite, wie sie leider immer noch in Deutschland weit verbreitet sind, und Anschlüsse die hinter einem Carrier Grade NAT stecken.
Wireguard selber macht keine Form PathMTU Discovery.
Was ist mit https://github.com/Nyr/wireguard-install ? Ist das ausreichend?
Für eine reine Roadwarrior Installation sieht das Skript gut aus. Ob es das wirklich ist, kann ich dir aber nicht beantworten weil ich es nicht nutze. Ich verwende die folgende Ansible Role: https://github.com/githubixx/ansible-role-wireguard
Bietet mehr Funktionen, die ich auch alle nutze. Neben der Roadwarrior Installation auch eine Full-Mesh Konfiguration meiner Server.