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