通过编辑,@ Sven的答案已经是正确的,但仅是直接表达短语。
TL; DR是下划线在CNAME
双方记录中均有效,请阅读以下内容以了解原因。
RFC 1034等基于“域名”定义记录,“域名”是具有任何字符的标签,因此包括_
。
但是某些记录对所有者名称和/或资源数据(RDATA)具有更严格的规则。只有一个主机名将被接受,并且确实是规则(现在放宽了,因为以前主机名不能以数字开头),您可以使用任何ASCII字母(不区分大小写),任何ASCII数字和连字符,再加上一些额外的位置规则:在开始或结束处没有连字符,在位置3和4处没有双连字符(因为“保留”形式的IDN 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
名称服务器软件,但可以单独使用和安装,其他名称服务器可能具有类似的检查工具,并且总有可能存在在线接口),只需将记录放入文件中并运行它在:
$ 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节中的相关引号:
“所有者:这是找到路由反射器的域名。” 默认情况下,这意味着任何名称,而不仅仅是主机名(作为CNAME记录的来源)
“ RDATA:是描述资源的类型,有时是类相关的数据:”
“ CNAME一个域名。”
因此,a的所有者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
记录像一个真正的区域将有)