Wireguard einrichten

Veröffentlicht von

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.

Teile diesen Beitrag

4 Kommentare

  1. 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.

    1. 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.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert