最初,我的博客设置是作为一个纯 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 依然保持私密! 🚀