Wireguard machen

Eine kleine Anleitung, um Wireguard mit Linux zu verdrahten. Leider nur mit Legacy IPv4 (FIXME).

Die beiden Knoten, die verbunden werden sollen, heißen node1 und node2. Bei Wireguard sind diese gleichberechtigt.

Voraussetzungen

  • Linux
  • Debian: linux-headers
    • Grund: Das Kernelmodul muss noch gebaut werden

Installation

Debian

Falls noch kein linux-headers installiert ist:

# apt install linux-headers-amd64

Ansonsten:

# apt install wireguard

Arch

# pacman -S wireguard-tools wireguard-arch

Schlüsselpaar erstellen

Jetzt werden die für die Verschlüsselung nötigen Private-Public-Keypairs erzeugt. Aufpassen, dass man den Private-Key nicht aus Versehen global lesbar macht!

Auf beiden Nodes:

# wg genkey > /root/wg.priv
# chmod 700 /root/wg.priv
# wg pubkey < /root/wg.priv > /root/wg.pub

Netzwerkgerät erstellen

Die Netzwerkgeräte müssen ebenfalls auf beiden Hosts angelegt werden.

Zuvor sollte man sicherstellen, dass das Kernelmodul wireguard geladen wurde. Falls nicht:

# modprobe wireguard

Das Wireguard-Interface kann per ip-Kommando hinzugefügt werden. Die IP-Adresse kann man auch gleich setzen. Die Netzwerkgeräte bei Wireguard heißten üblicherweise wgX:

node1# ip link add dev wg0 type wireguard
node1# ip address add 10.0.12.1/24 dev wg0
node2# ip link add dev wg0 type wireguard
node2# ip address add 10.0.12.2/23 dev wg0

Listener einrichten

Hier kommt jetzt der zuvor generierte Private-Key zu Einsatz. Wireguard wird gesagt, auf welchem Port gelauscht werden soll und mit welchem Private-Key gearbeitet wird:

node1# wg set wg0 listen-port 51820 private-key /root/wg.priv
node2# wg set wg0 listen-port 51820 private-key /root/wg.priv

Interface aktivieren

Jetzt kann man die Interfaces und damit die Wireguard-Dienste aktivieren:

node1# ip link set wg0 up
node2# ip link set wg0 up

Keys austauschen/registrieren

Jetzt werden die Public Keys ausgetauscht, d.h. node1 registriert den Public Key von node2 und node2 registriert den Public Key von node1. Der Einfachheit halber tun wir so, als sein dies die Public Keys:

node1# cat /root/wg.pub
pub1

node2# cat /root/wg.pub
pub2

In der Realität stünde hier eine Zeichenkette.

Die Keys werden jetzt auf dem jeweils anderen Node konfiguriert und festgelegt, welche IP-Adressen jeweils über den Tunnel kommunizieren dürfen (aka. welche Quelladressen in den eingehenden IP-Paketen stehen dürfen):

node1# wg set peer pub2 allowed-ips 10.0.12.2/32
node2# wg set peer pub1 allowed-ips 10.0.12.1/32

Endpunkte bekannt machen

Als nächstes muss man die Endpunkte einander bekannt machen. Jedenfalls sollte wenigstens eine Partei einen Endpunkt eintragen. Man kann hier sowohl IP-Adressen als auch DNS-Namen benutzen:

node1# wg set peer pub2 endpoint 192.168.1.2:51820
node2# wg set peer pub1 endpoint node1.example.com:51820

Bei IPv6-Adressen sollte man die IPv6-Adresse in Klammern packen. Je nach Shell muss man die Klammern noch escapen, z.B.:

node3# wg set peer pub4 endpoint \[fd00::1\]:51820

An diesem Punkt sollten die Tunnel funktionieren. Man sollte beachten, dass Wireguard ohne Sessions arbeitet und auch keine Traffic erzeugt, wenn keine IP-Pakete über den Tunnel gehen. Entsprechend sollte man beachten, dass man, wenn man auf nur einem Rechner die Adresse der Gegenstelle eingetragen hat, nur einer der beiden Knoten die Adresse des anderen kennt, solange noch keine Pakete verschickt wurden. Wenn also Daten von der Gegenstelle nicht ankommen, hilft es manchmal, einfach mal die Gegenstelle anzupingen, damit diese die aktuelle IP-Adresse erhält, mit der man gerade erreichbar ist. Das ist auch notwendig, wenn man hinter einer Firewall oder NAT hängt. Alternativ kann man auch Wireguard beibringen, Keepalive-Pakete in einem konfigurierbaren Sekundenintervall zu senden:

# wg set wg0 persistent-keepalive INTERVALL

Konfiguration speichern und automatisch laden

Bis zu diesem Zeitpunkt ist bei einem Reboot die Konfiguration weg. Das wird jetzt geändert. Wireguard liefert das Tool wg-quick mit, welches sich einer bestehenden Konfigurationsdatei bedient und damit alle obigen ip- und wg-Kommandos selbst ausführen kann.

Die Konfiguration speichert man mit:

# wg showconf wg0 > /etc/wireguard/wg0.conf

Danach kann man den Dienst per systemd automatisch laufen lassen:

# systemctl enable wg-quick@wg0.service