もともと、このブログのセットアップは、ホームサーバーで運用しているため、WireGuardを使用した純粋なIPv6プロジェクトとして計画されていました(ちなみに、無料のIPv6アドレスはroute64.orgで取得できます)。アクセシビリティを向上させるために、外部のIPv4プロキシを導入しました(@Larvitzに感謝)。

しかし、その際にすぐにSSLの問題が発生しました。当初、AレコードとAAAAレコードの両方がプロキシを経由していたため、サーバー上でのLet's Encryptの検証が失敗してしまったのです。

解決策:「IPv6ハック」

解決策は、AAAAレコードをプロキシ経由にするのではなく、サーバーのWireGuard IPを直接指すように明示的に設定することでした。

  • ドメイン: blog.burningboard.org
  • Aレコード (プロキシ): 194.28.98.217
  • AAAAレコード (サーバー): 2a11:6c7:f05:a8::2 (WireGuard)

このようにAAAAレコードをWireGuard IPに直接向けることで、Let's Encryptは(AAAAレコードがデフォルトで優先されるため)引き続きIPv6経由でサーバーに直接アクセスし、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アドレスも秘匿されたままになりました! 🚀