Ursprünglich war mein Blog-Setup als reines IPv6-Projekt über WireGuard geplant, da das Ganze auf einem Homeserver betrieben wird (kostenlose IPv6-Adressen bekommt man übrigens bei route64.org). Um die Erreichbarkeit zu erhöhen, habe ich nun einen externen IPv4-Proxy dazugeholt (Danke @Larvitz).

Dabei gab es jedoch sofort SSL-Probleme: Da ursprünglich sowohl der A wie auch der AAAA Record über den Proxy liefen, schlug die Let's Encrypt-Validierung auf meinem Server fehl.

Die Lösung: Der „IPv6-Hack“

Die Lösung war, den AAAA-Eintrag explizit direkt auf die WireGuard-IP meines Servers zu richten, anstatt ihn ebenfalls über den Proxy zu leiten.

  • Domain: blog.burningboard.org
  • A-Record (Proxy): 194.28.98.217
  • AAAA-Record (Server): 2a11:6c7:f05:a8::2 (WireGuard)

Durch diesen direkten AAAA-Eintrag auf meine WireGuard-IP erreicht Let’s Encrypt meinen Server weiterhin direkt via IPv6 (da der AAAA-Record standardmäßig priorisiert wird) und stellt das SSL-Zertifikat aus. Der IPv4-Traffic wird vom Proxy verschlüsselt an mich weitergereicht.

Die finale Konfiguration

Damit die Kommunikation reibungslos klappt, mussten wir die Caddy-Server anpassen:

1. Auf meinem Server (NixOS, blog.nix)

Damit die echten Besucher-IPs korrekt ankommen und nicht durch die IP des Proxys überschrieben werden, muss dieser als vertrauenswürdig markiert werden:

services.caddy.globalConfig = ''
  servers {
      trusted_proxies static 2a06:9801:1c:1000::10
  }
'';

2. Auf dem externen Proxy (Caddy)

Damit der Proxy meinen Server korrekt per HTTPS anspricht, muss er den Hostnamen (SNI) mitschicken:

reverse_proxy [https://[2a11:6c7:f05:a8::2]:443](https://[2a11:6c7:f05:a8::2]:443) {
    header_up Host {host}
    transport http {
        tls_server_name blog.burningboard.org
    }
}

Der Blog ist jetzt über IPv4 und IPv6 erreichbar, sicher verschlüsselt und meine Heim-IP bleibt trotzdem privat! 🚀