Zum Inhalt

WireGuard-Tunnel einrichten

Ziel

Ein Host im Rechenzentrum ist über einen WireGuard-Tunnel mit dem Server-VLAN im Maschinendorf verbunden und erreicht containerhost.

Voraussetzungen

Die Werte unten sind die von werner, Stand 2026-10-04. Für einen anderen Host bekommst du Tunnel-Adresse und Pre-Shared Key von der Person mit Zugang zum Gateway; frag dabei nach, ob noch andere Werte abweichen. Name und öffentlicher Schlüssel des Gateways können sich ändern; lass sie dir in Schritt 1 bestätigen.

Einstellung Wert
Name der Verbindung wg0
Tunnel-Adresse von werner 172.16.11.1/32
Gateway (Endpoint), kann sich ändern maschinendorf.resolve.bar:31339
Öffentlicher Schlüssel des Gateways, kann sich ändern PlmUqMssJaRhRLtaCa0kz81/TRidWZ9QBPxAiaN3QlE=
Netze durch den Tunnel (AllowedIPs) 172.16.11.0/24, 10.0.0.0/8
DNS-Server auf dem Gateway 172.16.11.254
Port auf dem Host (listen-port) 31339

Alle Befehle laufen auf dem Host, nach ssh <fqdn>.

Schritte

1. Schlüsselpaar erzeugen

Bash
wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

Erwartet: der öffentliche Schlüssel in einer Zeile. Schick ihn in Signal an die Person mit Zugang zum Gateway, zusammen mit der Bitte um eine Tunnel-Adresse und einen Pre-Shared Key für den Host und um den aktuellen Namen und öffentlichen Schlüssel des Gateways. Weichen diese von der Tabelle ab, setz in den folgenden Schritten die neuen Werte ein.

2. Konfigurationsdatei anlegen

Leg /etc/wireguard/wg0.conf an und setz den Pre-Shared Key aus Schritt 1 ein:

INI
1
2
3
4
5
6
7
8
9
[Interface]
Address = 172.16.11.1/32

[Peer]
PublicKey = PlmUqMssJaRhRLtaCa0kz81/TRidWZ9QBPxAiaN3QlE=
PresharedKey = <pre-shared-key>
AllowedIPs = 172.16.11.0/24, 10.0.0.0/8
Endpoint = maschinendorf.resolve.bar:31339
PersistentKeepalive = 30

Die Datei enthält keinen DNS-Server; die Namensauflösung kommt in Schritt 5 dazu.

3. Verbindung in NetworkManager anlegen

Bash
PRIVKEY=$(cat /etc/wireguard/privatekey)
nmcli connection import type wireguard file /etc/wireguard/wg0.conf
nmcli connection modify wg0 wireguard.listen-port 31339
nmcli connection modify wg0 wireguard.private-key "$PRIVKEY"
nmcli connection modify wg0 ipv4.method manual
nmcli connection modify wg0 ipv4.addresses "172.16.11.1/32"
nmcli connection modify wg0 ipv4.never-default yes
nmcli connection modify wg0 connection.autoconnect yes
nmcli connection modify wg0 connection.autoconnect-priority 5
nmcli connection modify wg0 connection.autoconnect-retries 3
nmcli connection up wg0

Erwartet: Connection 'wg0' (…) successfully added. nach dem Import und Connection successfully activated am Ende. ipv4.never-default sorgt dafür, dass nur die Netze aus AllowedIPs durch den Tunnel gehen, nicht der übrige Verkehr ins Internet.

Setz an der Verbindung keine DNS-Server (ipv4.dns): Meldet eine Verbindung einen DNS-Server, schreibt NetworkManager /etc/resolv.conf vermutlich neu, und die Einträge aus Schritt 5 gehen verloren.

4. Tunnel in firewalld freigeben

Bash
1
2
3
firewall-cmd --permanent --zone=trusted --add-interface=wg0
firewall-cmd --reload
firewall-cmd --zone=trusted --list-interfaces

Erwartet: success zweimal, dann wg0 in der Liste.

Auf werner stehen außerdem die beiden Subnetze des Netzwerks caddy in der Zone trusted. Das Netzwerk gibt es erst nach dem ersten apply von infra-caddy.cue; Podman vergibt die Subnetze dabei selbst, bei einem neuen Host also vermutlich andere als heute auf werner (10.89.0.0/24, fd33:c21b:6624:7c3b::/64). Lies sie nach dem apply aus und trag sie ein:

Bash
1
2
3
4
podman network inspect caddy --format '{{range .Subnets}}{{.Subnet}} {{end}}'
firewall-cmd --permanent --zone=trusted --add-source=<ipv4-subnetz>
firewall-cmd --permanent --zone=trusted --add-source=<ipv6-subnetz>
firewall-cmd --reload

Erwartet: zwei Subnetze, ein IPv4- und ein IPv6-Subnetz, danach success je Befehl.

5. DNS-Server des Gateways eintragen

Die Namen unter garage-lab.net löst nur der DNS-Server auf dem Gateway auf. Trag ihn in /etc/resolv.conf als erste Zeile ein:

Text Only
nameserver 172.16.11.254

Die Zeilen darunter lässt du stehen: Bei Netcup trägt cloud-init beim ersten Start die Resolver von Netcup ein, und die können sich ändern. Auf werner sieht die Datei so aus (Stand 2026-10-04):

Text Only
1
2
3
nameserver 172.16.11.254
nameserver 46.38.225.230
nameserver 46.38.252.230
Bash
dig +short vm-containerhost.garage-lab.net

Erwartet: 10.0.101.3.

6. WireGuard-Port bei Netcup freigeben

Nur bei Netcup. Gib in der Web-Oberfläche von Netcup in der Firewall vor der VM den UDP-Port 31339 frei (siehe Netcup).

Prüfen

  • wg show wg0 zeigt den Peer mit latest handshake vor wenigen Sekunden und wachsenden Werten bei transfer.
  • ping -c 3 vm-containerhost.garage-lab.net bekommt drei Antworten.
  • Nach einem Neustart des Hosts ist wg0 wieder aktiv (nmcli connection show --active), und /etc/resolv.conf ist unverändert.

Wenn etwas schiefgeht