Ursprungligen var min blogguppsättning planerad som ett rent IPv6-projekt via WireGuard, eftersom det hela körs på en hemserver (gratis IPv6-adresser kan man förresten få hos route64.org). För att öka tillgängligheten har jag nu lagt till en extern IPv4-proxy (tack @Larvitz).

I samband med detta uppstod dock omedelbart SSL-problem: Eftersom både A- och AAAA-posterna ursprungligen gick via proxyn, misslyckades Let's Encrypt-valideringen på min server.

Lösningen: ”IPv6-hacket”

Lösningen var att rikta AAAA-posten explicit direkt mot min servers WireGuard-IP, istället för att även leda den via proxyn.

  • Domän: blog.burningboard.org
  • A-post (Proxy): 194.28.98.217
  • AAAA-post (Server): 2a11:6c7:f05:a8::2 (WireGuard)

Genom denna direkta AAAA-post till min WireGuard-IP når Let’s Encrypt fortfarande min server direkt via IPv6 (eftersom AAAA-posten prioriteras som standard) och utfärdar SSL-certifikatet. IPv4-trafiken skickas vidare krypterad från proxyn till mig.

Den slutgiltiga konfigurationen

För att kommunikationen ska fungera smidigt var vi tvungna att anpassa Caddy-servrarna:

1. På min server (NixOS, blog.nix)

För att de riktiga besökar-IP-adresserna ska komma fram korrekt och inte skrivas över av proxyns IP, måste denna markeras som betrodd:

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

2. På den externa proxyn (Caddy)

För att proxyn ska anropa min server korrekt via HTTPS måste den skicka med värdnamnet (SNI):

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

Bloggen är nu tillgänglig via både IPv4 och IPv6, säkert krypterad, och min hem-IP förblir ändå privat! 🚀