คำตอบสั้น ๆ: ตั้งระเบียนที่รับทุกซับโดเมนในครั้งเดียว เหมาะกับระบบที่สร้างซับโดเมนอัตโนมัติ พร้อมข้อควรระวังที่ทำให้หลายระบบมีปัญหา
คู่มือนี้อธิบาย Wildcard DNS Record ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Wildcard DNS Record คือระเบียนที่ตอบคำถามสำหรับซับโดเมนใดก็ได้ที่ยังไม่มีระเบียนเฉพาะของตัวเอง เขียนด้วยเครื่องหมายดอกจัน
เหมาะกับระบบที่สร้างซับโดเมนให้ลูกค้าอัตโนมัติ เช่น ระบบ SaaS ที่ให้ลูกค้าแต่ละรายมี ชื่อลูกค้า.example.com ของตัวเอง โดยไม่ต้องเพิ่มระเบียน DNS ทุกครั้ง
สิ่งที่ต้องเตรียม (Wildcard DNS Record)
- สิทธิ์แก้ไข DNS ของโดเมน
- เว็บเซิร์ฟเวอร์ที่ตั้งค่ารับทุกซับโดเมนแล้ว
- ใบรับรอง SSL แบบ Wildcard หากให้บริการผ่าน HTTPS
ขั้นตอนที่ 1: ตั้งระเบียน (Wildcard DNS Record)
*.example.com. 3600 IN A 203.0.113.10
# หรือชี้ไปยังชื่ออื่น
*.example.com. 3600 IN CNAME app.example.com.
dig +short anything.example.com
dig +short random-name-12345.example.com
ทั้งสองควรได้ IP เดียวกัน
ขั้นตอนที่ 2: เข้าใจกฎการมีผลที่คนมักเข้าใจผิด
นี่คือส่วนที่สร้างความสับสนมากที่สุด กฎมีสามข้อ
ข้อ 1 ระเบียนเฉพาะชนะ Wildcard เสมอ
*.example.com. IN A 203.0.113.10
api.example.com. IN A 203.0.113.20
api.example.com จะได้ 203.0.113.20 ส่วนชื่ออื่นได้ 203.0.113.10
ข้อ 2 Wildcard ครอบคลุมแค่ระดับเดียว
*.example.com ครอบคลุม api.example.com แต่ไม่ครอบคลุม v1.api.example.com
หากต้องการครอบคลุมสองระดับ ต้องเพิ่มอีกระเบียน
*.example.com. IN A 203.0.113.10
*.api.example.com. IN A 203.0.113.10
ข้อ 3 ชนิดของระเบียนต้องตรงกัน
หากมี *.example.com A และมี mail.example.com MX อยู่ด้วย การถาม mail.example.com ชนิด A จะไม่ได้คำตอบจาก Wildcard เพราะเมื่อมีระเบียนใด ๆ ของชื่อนั้นอยู่แล้ว Wildcard จะไม่ถูกใช้กับชื่อนั้นอีกเลยไม่ว่าชนิดใด
ข้อนี้เป็นสาเหตุที่ระบบพังแบบหาสาเหตุยาก ต้องเพิ่มระเบียน A ให้ชื่อนั้นโดยตรง
mail.example.com. IN MX 10 mx.example.com.
mail.example.com. IN A 203.0.113.10
ขั้นตอนที่ 3: ตั้งเว็บเซิร์ฟเวอร์ให้รับทุกซับโดเมน
server {
listen 443 ssl;
http2 on;
server_name ~^(?<sub>.+)\.example\.com$;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# ส่งชื่อซับโดเมนให้แอปใช้ระบุลูกค้า
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Tenant $sub;
proxy_set_header X-Real-IP $remote_addr;
}
}
ตัวแปร $sub ที่จับจากชื่อโฮสต์ทำให้แอปรู้ว่าคำขอนี้เป็นของลูกค้ารายใด
ขั้นตอนที่ 4: ขอใบรับรอง Wildcard
ต้องยืนยันผ่าน DNS เท่านั้น การยืนยันผ่านไฟล์บนเว็บใช้กับ Wildcard ไม่ได้
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
-d 'example.com' -d '*.example.com' \
--agree-tos -m [email protected]
จำไว้ว่า *.example.com ครอบคลุมแค่ระดับเดียวเช่นเดียวกับ DNS หากต้องการสองระดับต้องขอ *.api.example.com เพิ่ม