CNAME 记录中的 _(下划线)是否非法?

CNAME 记录中的 _(下划线)是否非法?

我们在主机提供商的 Web 界面上为 DKIM 密钥创建长 TXT 记录时遇到了问题。

每行只能接受256个字符。

我们尝试了多行,然后按照某些人的建议,尝试("在第一行和")最后一行之后添加。但都没有用。

然后我们尝试在另一个主机上创建一个 cname 记录,在那里我们制作 DKIM TXT 记录。

但是现在网络界面抱怨CNAME记录中的非法名称。

mail._domainkey.example.com TXT可以
mail._domainkey.example.com CNAME不行 可以
mail.domainkey.example.com CNAME,但不是我们想要的。

难道网络界面就是要让我们抓狂,还是在 中使用下划线真的是“非法的” CNAME

答案1

主机名只能包含[0-9], [a-z], -,因此下划线在主机名中无效。请注意,TXT 记录不是主机名,此限制不适用于它。(-也不能用作第一个字符,因此mail.-domainkey.our.dom无效。)

https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames

当使用 CNAME 作为主机名时,上述限制适用。

但看起来 CNAME 在 DKIM 上下文中不被视为主机名,在这种情况下,_应为 CNAME 条目的有效部分。 看SES 要求 CNAME 中有下划线,但注册商不允许 [关闭]

答案2

@Sven 的回答经过编辑已经是正确的了,但只是直接表述而已。

总结CNAME是的,下划线在双方的记录中都有效,请阅读下文了解原因。

RFC 1034其他人则根据“域名”定义记录,域名是带有任何字符的标签,因此包括_

某些记录对所有者名称和/或资源数据 (RDATA) 有更严格的规则。只有主机名会被接受,而且现在的规则确实如此(过去这些规则很宽松,主机名不能以数字开头),您可以使用任何 ASCII 字母(不区分大小写)、任何 ASCII 数字和连字符,再加上一些额外的位置规则:开头或结尾不能有连字符,位置 3 和 4 不能有双连字符(因为“保留”了xn--只允许大小写的 IDN)。

例如,AAAAA记录的所有者名称是主机名,而不是域名。因此, 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 节中的相关引述:

“所有者:即 RR 所在的域名。” 这意味着默认情况下是任何名称,而不仅仅是主机名(作为 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(其他错误是预料之中的,因为在我的虚假区域中我没有放置任何错误SOANS像真实区域那样的记录)

答案3

DNS 中允许使用任何有效字符。请参阅https://www.rfc-editor.org/rfc/rfc2181#section-11

“DNS 本身对可用于识别资源记录的特定标签只有一个限制。该限制与标签的长度和全名有关。任何一个标签的长度限制在 1 到 63 个八位字节之间。”

客户端必须验证名称值,例如,MX 记录可能包含值“Alice”,但查找后应拒绝该值,因为“Alice”不是有效的电子邮件地址。

在这种情况下,您的托管商似乎正在“验证”您的输入,并且他们应该能够为您手动输入。

答案4

RFC 1034:标签必须遵循 ARPANET 主机名的规则。它们必须以字母开头,以字母或数字结尾,并且内部字符只能是字母、数字和连字符。长度也有一些限制。标签必须不超过 63 个字符。

相关内容