最初,我的博客设置是作为一个纯 IPv6 项目通过 WireGuard 运行的,因为整个系统部署在家庭服务器上(顺便提一下,你可以在 route64.org 获取免费的 IPv6 地址)。为了提高可访问性,我现在增加了一个外部 IPv4 代理(感谢 @Larvitz)。

但这立即引发了 SSL 问题:由于最初 A 记录和 AAAA 记录都指向代理,导致我服务器上的 Let's Encrypt 验证失败。

解决方案:“IPv6 Hack”

解决方案是将 AAAA 记录显式地直接指向我服务器的 WireGuard IP,而不是也通过代理转发。

  • 域名: blog.burningboard.org
  • A 记录 (代理): 194.28.98.217
  • AAAA 记录 (服务器): 2a11:6c7:f05:a8::2 (WireGuard)

通过将 AAAA 记录直接指向我的 WireGuard IP,Let's Encrypt 仍然可以通过 IPv6 直接访问我的服务器(因为 AAAA 记录默认具有更高优先级)并签发 SSL 证书。而 IPv4 流量则由代理加密后转发给我。

最终配置

为了确保通信顺畅,我们需要调整 Caddy 服务器配置:

1. 在我的服务器上 (NixOS, blog.nix)

为了确保正确接收真实的访客 IP,而不被代理的 IP 覆盖,必须将其标记为受信任的代理:

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

2. 在外部代理上 (Caddy)

为了让代理能通过 HTTPS 正确访问我的服务器,它必须发送主机名 (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
    }
}

现在博客可以通过 IPv4 和 IPv6 访问,安全加密,且我的家庭 IP 依然保持私密! 🚀