คำตอบสั้น ๆ: แก้ปัญหา SPF Lookup เกิน 10 ครั้งจนได้ PermError (too many DNS lookups) นับ include ด้วย dig ตัดของที่ไม่ใช้ แยกผู้ส่งไปซับโดเมน และไม่พึ่ง flattening
คู่มือนี้อธิบาย SPF Lookup ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
SPF Lookup คือการค้น DNS ที่เกิดขึ้นระหว่างที่เซิร์ฟเวอร์ปลายทางตรวจระเบียน SPF ของโดเมนคุณ มาตรฐาน RFC 7208 จำกัดให้กลไกที่ต้องค้น DNS รวมกันได้ไม่เกิน 10 ครั้งต่อการตรวจหนึ่งครั้ง ถ้าเกิน ผลคือ permerror หรือข้อความ too many DNS lookups ซึ่งไม่นับเป็น SPF ผ่าน และ DMARC จะเหลือ DKIM เป็นทางรอดทางเดียว
ปัญหานี้มักเกิดกับองค์กรที่เพิ่มบริการส่งอีเมลไปเรื่อย ๆ เช่น ระบบอีเมลหลัก ระบบจดหมายข่าว CRM Helpdesk และระบบออกใบแจ้งหนี้ แต่ละบริการให้ใส่ include: และ include หนึ่งตัวอาจซ้อน include ต่ออีกหลายชั้น เมื่ออ่านคู่มือนี้จบ คุณจะนับจำนวน SPF Lookup ได้เอง รู้ว่าตัดอะไรได้ และมีระเบียน SPF ใหม่ที่ต่ำกว่า 10 พร้อมเผื่อที่ว่างไว้
สิ่งที่ต้องเตรียม
- สิทธิ์แก้ DNS ของโดเมน และเครื่องที่มีคำสั่ง
dig(ดูตรวจสอบ DNS ด้วย nslookup และ dig) - รายการบริการทุกตัวที่ส่งอีเมลในนามโดเมนของคุณ พร้อมผู้รับผิดชอบ
- รายงาน DMARC ย้อนหลังเพื่อดูผู้ส่งจริง (ดูอ่านรายงาน DMARC)
- ความเข้าใจพื้นฐานจากคู่มือตั้งค่า SPF, DKIM และ DMARC
ขั้นตอนที่ 1: รู้ว่าอะไรนับเป็น SPF Lookup
ตาม RFC 7208 ส่วน 4.6.4 กลไก include, a, mx, ptr, exists และตัวปรับ redirect นับครั้งละ 1 lookup รวมถึงที่ซ้อนอยู่ใน include ทุกชั้นด้วย ส่วน ip4, ip6 และ all ไม่นับเพราะไม่ต้องค้น DNS
มีอีกสองกติกาที่คนมักลืม หนึ่ง การค้นที่ได้ผลว่างหรือไม่พบโดเมน (void lookup) ไม่ควรเกิน 2 ครั้ง มิฉะนั้นอาจได้ permerror เช่นกัน มักเกิดจาก include ของบริการที่เลิกใช้แล้ว สอง กลไก mx นับ 1 lookup แต่ระเบียน MX ที่ได้ต้องไม่เกิน 10 ชื่อ
ขั้นตอนที่ 2: ดึงระเบียน SPF ปัจจุบันและตรวจว่ามีระเบียนเดียว
dig +short TXT example.com | grep -i "v=spf1"
ต้องได้ผลเพียงบรรทัดเดียว ถ้ามีสองระเบียนที่ขึ้นต้นด้วย v=spf1 เช่น ระเบียนหนึ่งของระบบอีเมลหลักและอีกระเบียนของระบบจดหมายข่าว ผลคือ permerror ทันทีไม่ว่าจะนับ lookup ได้เท่าไร ให้รวมเป็นระเบียนเดียว ถ้าระเบียนยาวเกิน 255 ตัวอักษร DNS จะแบ่งเป็นหลายสตริงในระเบียนเดียวกัน ซึ่งถูกต้อง ไม่ใช่สองระเบียน
ขั้นตอนที่ 3: ไล่นับ SPF Lookup ทีละชั้นด้วย dig
คัดลอกชื่อหลัง include: ทุกตัวมาค้นต่อ แล้วค้นชื่อที่ซ้อนอยู่ข้างในอีกจนหมด จดตัวเลขลงตาราง กลไก a, mx, ptr ในระเบียนหลักนับตัวละ 1 และ include ทุกตัวในทุกชั้นนับตัวละ 1
dig +short TXT _spf.mailhost.example
dig +short TXT spf.newsletter.example
เครื่องมือตรวจ SPF ออนไลน์ช่วยนับได้เร็ว แต่ควรนับเองอย่างน้อยหนึ่งครั้งเพื่อรู้ว่าบริการใดกินโควตาเท่าไร เพราะผู้ให้บริการแก้ระเบียนของตนได้ตลอดเวลา ตัวเลขที่เคยพอดีอาจเกินในเดือนถัดไป
ขั้นตอนที่ 4: ตัดกลไกที่ไม่จำเป็นเพื่อลด SPF Lookup
- บริการที่เลิกใช้แล้ว: ถ้ารายงาน DMARC ไม่พบอีเมลจากบริการนั้นหลายเดือน ให้ลบ include ทิ้ง
ptr: RFC 7208 ระบุว่าไม่ควรใช้ เพราะช้าและไม่น่าเชื่อถือ ลบออกได้เลยa: ถ้าเว็บเซิร์ฟเวอร์ไม่ได้ส่งอีเมลเอง ไม่จำเป็นต้องมีmx: ถ้าเซิร์ฟเวอร์ที่ส่งอีเมลมี IP คงที่ เช่น203.0.113.10ให้ใช้ip4:203.0.113.10แทน ซึ่งไม่นับ lookup
สามข้อหลังเป็นการแทน lookup ด้วย IP ของตัวคุณเอง ซึ่งคุณรู้เมื่อ IP เปลี่ยน ต่างจากการแทน IP ของผู้ให้บริการรายอื่นในขั้นตอนที่ 6