Спочатку налаштування мого блогу планувалося як суто IPv6-проєкт через WireGuard, оскільки все це працює на домашньому сервері (до речі, безкоштовні 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 продовжує звертатися до мого сервера безпосередньо через 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-адреса все одно залишається приватною! 🚀