เดิมทีการตั้งค่าบล็อกของผมถูกวางแผนให้เป็น โปรเจกต์ IPv6 ล้วนผ่าน WireGuard เนื่องจากรันอยู่บนโฮมเซิร์ฟเวอร์ (คุณสามารถขอที่อยู่ IPv6 ได้ฟรีที่ route64.org) เพื่อเพิ่มความสามารถในการเข้าถึง ตอนนี้ผมได้เพิ่ม IPv4 Proxy ภายนอกเข้ามาแล้ว (ขอบคุณ @Larvitz)
อย่างไรก็ตาม มีปัญหาเรื่อง SSL เกิดขึ้นทันที: เนื่องจากในตอนแรกทั้งเรคคอร์ด A และ AAAA วิ่งผ่าน Proxy ทำให้การตรวจสอบความถูกต้อง (Validation) ของ Let's Encrypt บนเซิร์ฟเวอร์ของผมล้มเหลว
วิธีแก้ปัญหา: "IPv6-Hack"
วิธีแก้คือการกำหนดให้ AAAA-Record ชี้ไปยัง IP ของ WireGuard บนเซิร์ฟเวอร์ของผมโดยตรง แทนที่จะส่งผ่าน Proxy เหมือนเดิม
- โดเมน:
blog.burningboard.org - A-Record (Proxy):
194.28.98.217 - AAAA-Record (Server):
2a11:6c7:f05:a8::2(WireGuard)
ด้วยการชี้ AAAA-Record ไปยัง IP ของ WireGuard โดยตรง Let’s Encrypt จะยังคงเข้าถึงเซิร์ฟเวอร์ของผมได้โดยตรงผ่าน IPv6 (เนื่องจากปกติแล้ว AAAA-Record จะได้รับความสำคัญก่อน) และออกใบรับรอง SSL ให้ ส่วนทราฟฟิก IPv4 จะถูกส่งต่อจาก Proxy มายังผมในรูปแบบที่เข้ารหัสไว้
การกำหนดค่าขั้นสุดท้าย
เพื่อให้การสื่อสารทำงานได้อย่างราบรื่น เราจำเป็นต้องปรับแต่งเซิร์ฟเวอร์ Caddy:
1. บนเซิร์ฟเวอร์ของผม (NixOS, blog.nix)
เพื่อให้ IP จริงของผู้เข้าชมส่งมาถึงอย่างถูกต้องและไม่ถูกเขียนทับด้วย IP ของ Proxy เราต้องกำหนดให้ Proxy นั้นเป็นที่น่าเชื่อถือ (trusted):
services.caddy.globalConfig = ''
servers {
trusted_proxies static 2a06:9801:1c:1000::10
}
'';
2. บน Proxy ภายนอก (Caddy)
เพื่อให้ Proxy ติดต่อกับเซิร์ฟเวอร์ของผมผ่าน 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 ที่บ้านของผมก็ยังคงเป็นส่วนตัวอยู่! 🚀