diff --git a/host-config/wireguard-lab/10-after-docker.conf b/host-config/wireguard-lab/10-after-docker.conf new file mode 100644 index 0000000..fd9170a --- /dev/null +++ b/host-config/wireguard-lab/10-after-docker.conf @@ -0,0 +1,13 @@ +# /etc/systemd/system/wg-quick@lab.service.d/10-after-docker.conf +# +# ⚠️ ABGELEITET, NICHT VOM HOST KOPIERT — vor Gebrauch gegen CFGMON abgleichen +# (siehe README, Abschnitt "Noch aus dem Live-Stand zu ergaenzen"). +# +# Zweck: Der Tunnel muss NACH Docker starten. wg-quick traegt eine ACCEPT-Regel in +# die DOCKER-USER-Kette ein; startet Docker danach, baut es seine Ketten neu auf und +# die Regel ist weg — der Tunnel steht dann zwar, aber der Verkehr wird verworfen. +# Der Fehler ist unangenehm, weil `wg show` einen gesunden Handshake zeigt. + +[Unit] +After=docker.service +Wants=docker.service diff --git a/host-config/wireguard-lab/README.md b/host-config/wireguard-lab/README.md new file mode 100644 index 0000000..fe1025e --- /dev/null +++ b/host-config/wireguard-lab/README.md @@ -0,0 +1,70 @@ +# wireguard-lab — Site-to-Site-Tunnel CFGMON ↔ Lab + +Host-Konfiguration für den WireGuard-Tunnel aus +[ADR-0004](https://git.lab/axion1337.chat/management/-/blob/main/docs/adr/0004-site-to-site-vpn-hetzner-lab.md) +(Zonen: [ADR-0017](https://git.lab/axion1337.chat/management/-/blob/main/docs/adr/0017-split-dns-cfgmon-vier-zonen.md)). + +Läuft **auf dem Host**, nicht als Pod — deshalb hier unter `host-config/` und nicht als +Flux-Manifest (siehe die Erklärung in der Repo-`CLAUDE.md`). Angelegt, weil diese Dateien +bisher **nur auf dem Host existierten**: ein Neuaufbau von CFGMON hätte sie aus AAR-Prosa +rekonstruieren müssen (management #0027, W4 Punkt 4). + +## Was wohin gehört + +| Datei hier | Ziel auf dem Host | Secret? | +|---|---|---| +| `lab.conf.example` | `/etc/wireguard/lab.conf` (Mode 0600, root) | **ja** — `PrivateKey` | +| `10-after-docker.conf` | `/etc/systemd/system/wg-quick@lab.service.d/` | nein | +| — (liegt in `ci/lab-ca-chain.crt`) | `/usr/local/share/ca-certificates/axionlabs-root.crt` | nein | + +**Der Private Key steht bewusst nicht im Repo.** Er wird auf dem Host eingesetzt und ist +nirgends sonst hinterlegt — geht er verloren, wird auf der UDM ein neues Keypair für den +Client „Hetzner" erzeugt und hier eingetragen. Gleiches Muster wie `maintenance-notify` +(`config.example` / `msmtprc.template`). + +## Einrichten + +```bash +# 1. Konfiguration ablegen und Key eintragen +sudo install -m 0600 -o root -g root lab.conf.example /etc/wireguard/lab.conf +sudo vi /etc/wireguard/lab.conf # PrivateKey + PublicKey eintragen + +# 2. Start-Reihenfolge: der Tunnel muss nach Docker hoch (sonst fehlen die iptables-Ketten) +sudo mkdir -p /etc/systemd/system/wg-quick@lab.service.d +sudo cp 10-after-docker.conf /etc/systemd/system/wg-quick@lab.service.d/ +sudo systemctl daemon-reload + +# 3. Root-CA in den Truststore (Zertifikat liegt im Repo unter ci/) +sudo cp ../../ci/lab-ca-chain.crt /usr/local/share/ca-certificates/axionlabs-root.crt +sudo update-ca-certificates + +# 4. Starten +sudo systemctl enable --now wg-quick@lab +``` + +## Prüfen + +```bash +sudo wg show # Handshake jünger als ~2 min? +resolvectl domain # gerouteten Zonen (siehe ADR-0017) +curl -sI https://git.lab/users/sign_in | head -1 # 302 = Tunnel + DNS + CA stimmen +``` + +⚠️ **Nicht mit `ping` prüfen.** Durch den Tunnel sind nur HTTPS (443 auf `10.58.73.17`) und +DNS (53 auf `10.58.73.1`) offen; ICMP ist gesperrt. Ein fehlgeschlagener Ping bedeutet hier +**nicht**, dass etwas kaputt ist — das hat schon eine Session in die falsche Richtung +geschickt. + +## Noch aus dem Live-Stand zu ergänzen + +Diese Dateien sind aus ADR-0004/ADR-0017 abgeleitet, **nicht** vom laufenden Host kopiert +(von außerhalb ist `/etc/wireguard/` nicht lesbar). Vor dem ersten Einsatz als Vorlage +einmal gegen CFGMON abgleichen: + +```bash +# auf CFGMON, Private Key geschwärzt: +sudo sed 's/^PrivateKey.*/PrivateKey = /' /etc/wireguard/lab.conf +cat /etc/systemd/system/wg-quick@lab.service.d/10-after-docker.conf +``` + +Abweichungen hier einpflegen; danach diesen Abschnitt entfernen. diff --git a/host-config/wireguard-lab/lab.conf.example b/host-config/wireguard-lab/lab.conf.example new file mode 100644 index 0000000..d54782a --- /dev/null +++ b/host-config/wireguard-lab/lab.conf.example @@ -0,0 +1,39 @@ +# /etc/wireguard/lab.conf auf CFGMON — Mode 0600, root:root. +# +# Werte aus ADR-0004 (Architektur v2) und ADR-0017 (Split-DNS-Zonen). +# CFGMON ist CLIENT/Initiator; die UDM ist der WireGuard-SERVER. Die Richtung ist +# umgedreht gegenueber dem urspruenglichen Entwurf, weil UniFi WireGuard nur als +# Server anbietet ("Networks Behind Client" fuer die Rueckroute). +# +# ⚠️ PrivateKey NICHT ins Repo. Beim Verlust auf der UDM ein neues Keypair fuer den +# Client "Hetzner" erzeugen und hier eintragen. + +[Interface] +# Adresse dieses Clients im Tunnelnetz 10.58.75.0/24 +Address = 10.58.75.2/32 +PrivateKey = + +# Split-DNS: nur diese Zonen gehen an den Lab-Resolver, alles andere an den +# System-Resolver. Begruendung je Zone in ADR-0017. +# ~lab -> git.lab / wiki.lab (existieren oeffentlich nicht) +# ~axionlabs.de -> ca.axionlabs.de zeigt intern auf 10.58.73.13 (Split-Horizon) +# ~axion1337.de -> git.axion1337.de existiert nur intern +# ~lab.de wurde per ADR-0017 entfernt: kein interner Name darunter, und es leitete +# eine fremde oeffentliche Domain ueber den Lab-Resolver. +DNS = 10.58.73.1 +Domains = ~lab ~axionlabs.de ~axion1337.de + +[Peer] +PublicKey = + +# Bewusst eng: nur das Lab-VLAN und der Server im Tunnelnetz. KEIN 0.0.0.0/0 — +# der oeffentliche Verkehr von CFGMON darf nicht durch den Tunnel. +AllowedIPs = 10.58.73.0/24, 10.58.75.1/32 + +# "Alternate Address for Clients" der UDM; Port 51841 (NICHT 51820 — der Versatz +# zwischen Fritzbox-Freigabe und UDM-Port hat eine halbe Nacht gekostet). +Endpoint = 178.25.213.70:51841 + +# CFGMON haelt den Tunnel offen; die Lab-Seite kann ihn nicht selbst oeffnen +# (Bedarfsfall-Prinzip: der Schalter liegt in der UniFi-UI). +PersistentKeepalive = 25