Oorspronkelijk was mijn blog-setup gepland als een puur IPv6-project via WireGuard, omdat het geheel op een homeserver draait (gratis IPv6-adressen kun je overigens krijgen bij route64.org). Om de bereikbaarheid te vergroten, heb ik nu een externe IPv4-proxy toegevoegd (met dank aan @Larvitz).

Daarbij ontstonden echter direct SSL-problemen: Omdat oorspronkelijk zowel het A- als het AAAA-record via de proxy liepen, mislukte de Let's Encrypt-validatie op mijn server.

De oplossing: De „IPv6-hack“

De oplossing was om het AAAA-record expliciet rechtstreeks naar het WireGuard-IP van mijn server te laten verwijzen, in plaats van dit ook via de proxy te leiden.

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

Door dit directe AAAA-record naar mijn WireGuard-IP bereikt Let’s Encrypt mijn server nog steeds rechtstreeks via IPv6 (omdat het AAAA-record standaard prioriteit krijgt) en wordt het SSL-certificaat uitgegeven. Het IPv4-verkeer wordt door de proxy versleuteld naar mij doorgegeven.

De uiteindelijke configuratie

Om de communicatie soepel te laten verlopen, moesten we de Caddy-servers aanpassen:

1. Op mijn server (NixOS, blog.nix)

Om ervoor te zorgen dat de echte IP-adressen van bezoekers correct aankomen en niet worden overschreven door het IP van de proxy, moet deze als vertrouwd worden gemarkeerd:

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

2. Op de externe proxy (Caddy)

Om ervoor te zorgen dat de proxy mijn server correct via HTTPS benadert, moet deze de hostnaam (SNI) meesturen:

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
    }
}

De blog is nu bereikbaar via IPv4 en IPv6, veilig versleuteld en mijn thuis-IP blijft toch privé! 🚀