@ คำตอบของ Sven ที่มีการแก้ไขนั้นถูกต้องแล้ว แต่เพื่อพูดวลีโดยตรง
TL; DRใช่ขีดเส้นใต้นั้นใช้ได้ในCNAME
เร็กคอร์ดทั้งสองด้านอ่านเหตุผลด้านล่าง
RFC 1034และอื่น ๆ กำหนดบันทึกบนพื้นฐานของ "ชื่อโดเมน" ซึ่งเป็นฉลากที่มีตัวอักษรใด ๆ _
เพื่อให้รวมถึง
แต่บางระเบียนมีกฎที่เข้มงวดสำหรับทั้งชื่อเจ้าของและ / หรือข้อมูลทรัพยากร (RDATA) มีเพียงชื่อโฮสต์เท่านั้นที่จะได้รับการยอมรับและแน่นอนว่ากฎอยู่ในขณะนี้ (พวกเขาผ่อนคลายในอดีตที่ชื่อโฮสต์ไม่สามารถเริ่มต้นด้วยตัวเลข) ที่คุณสามารถใช้ตัวอักษร ASCII ใด ๆ (ไม่คำนึงถึงตัวพิมพ์ใหญ่), ASCII ใด ๆ และยัติภังค์ และเพิ่มกฎตำแหน่งพิเศษบางประการ: ไม่มียัติภังค์ที่จุดเริ่มต้นหรือจุดสิ้นสุดและไม่มียัติภังค์สองตำแหน่งที่ตำแหน่ง 3 และ 4 (เพราะ "การจอง" สำหรับ IDNs ที่อยู่ในรูปแบบxn--
ที่อนุญาตให้ใช้กับกรณีเท่านั้น)
ตัวอย่างเช่นชื่อเจ้าของA
หรือAAAA
ระเบียนเป็นชื่อโฮสต์ไม่ใช่ชื่อโดเมน ดังนั้น
test.example.com A 192.0.2.1
สิ่งเหล่านี้จึงไม่ถูกต้อง:
_test.example.com A 192.0.2.1
-test.example.com A 192.0.2.1
test-.example.com A 192.0.2.1
ง่ายต่อการทดสอบสิ่งต่าง ๆ ด้วยnamed-checkzone
โปรแกรม (ส่วนหนึ่งของbind
ซอฟต์แวร์ nameserver แต่อาจใช้และติดตั้งแยกต่างหากและเซิร์ฟเวอร์อื่น ๆ อาจมีเครื่องมือตรวจสอบที่คล้ายกันและอาจมีอินเทอร์เฟซออนไลน์สำหรับสิ่งนั้นด้วย) มันเกี่ยวกับ:
$ cat z1.txt
test.example.com. 1 IN A 192.0.2.1
_test.example.com. 1 IN A 192.0.2.1
-test.example.com. 1 IN A 192.0.2.1
test-.example.com. 1 IN A 192.0.2.1
$ /usr/local/sbin/named-checkzone example.com z1.txt
z1.txt:2: _test.example.com: bad owner name (check-names)
z1.txt:3: -test.example.com: bad owner name (check-names)
z1.txt:4: test-.example.com: bad owner name (check-names)
(จำนวนก่อนหน้าIN
นี้คือ TTL นี่ไม่เกี่ยวข้องกับปัญหาของเราที่นี่ แต่จำเป็นต้องผ่านการตรวจสอบความถูกต้องทางไวยากรณ์ของเรกคอร์ด)
สำหรับเร็กคอร์ดอื่นมันเป็นสิ่งตรงกันข้าม: NS
เนื่องจากไม่มีข้อ จำกัด สำหรับเจ้าของ แต่มีข้อ จำกัด ใน "เป้าหมาย" ที่เป็นข้อมูล ข้อมูลสามารถเป็นชื่อโฮสต์เท่านั้นไม่ใช่ชื่อโดเมนเนื่องจากคุณต้องชี้ไปที่เซิร์ฟเวอร์ชื่อที่เชื่อถือได้ซึ่งเป็นโฮสต์ทางกายภาพที่ตอบสนองต่อแบบสอบถาม DNS
ต่อไปนี้CNAME
เป็นคำพูดที่เกี่ยวข้องจาก RFC 1034 ในหัวข้อ 3.6:
"เจ้าของ: ซึ่งเป็นชื่อโดเมนที่พบ RR" ซึ่งหมายความว่าโดยค่าเริ่มต้นชื่อใด ๆ ไม่ใช่แค่ชื่อโฮสต์ (เป็นแหล่งที่มาของระเบียน CNAME)
"RDATA: ซึ่งเป็นประเภทและบางครั้งข้อมูลที่พึ่งพาระดับซึ่งอธิบายถึงทรัพยากร:"
"CNAME ชื่อโดเมน"
ดังนั้นทั้งเจ้าของCNAME
(สิ่งที่อยู่ทางซ้ายของมัน) และข้อมูลทรัพยากรที่แนบไปกับมันปลายทาง / เป้าหมาย (สิ่งที่อยู่ทางขวาของมัน) คือชื่อโดเมนไม่ใช่ชื่อโฮสต์เท่านั้น โดยทั่วไปตัวละครใด ๆ ดังนั้นรวมทั้ง_
ได้รับอนุญาตทั้งสองด้าน
ง่ายต่อการทดสอบอีกครั้งด้วยnamed-checkzone
:
$ cat z2.txt
_foo 1 CNAME _bar
$ /usr/local/sbin/named-checkzone example.com z2.txt
zone example.com/IN: has 0 SOA records
zone example.com/IN: has no NS records
zone example.com/IN: not loaded due to errors.
ไม่มีข้อผิดพลาดใด ๆ เกี่ยวกับCNAME
(คาดว่าจะเกิดข้อผิดพลาดอื่น ๆ ตั้งแต่ในโซนปลอมของฉันฉันไม่ได้ใส่SOA
หรือNS
บันทึกเช่นโซนจริงจะมี)