如果我有主机example.com
和leaf.intermediate.example.com
DNS 记录example.com
,但本身没有任何记录intermediate.example.com
,这是否会在某些情况下导致问题,或者由于某种原因是不好的风格或礼仪?我有这样设置的网络服务器,一切似乎都运行良好,但只是想检查是否有我遗漏的东西。
如果我有主机example.com
和leaf.intermediate.example.com
DNS 记录example.com
,但本身没有任何记录intermediate.example.com
,这是否会在某些情况下导致问题,或者由于某种原因是不好的风格或礼仪?我有这样设置的网络服务器,一切似乎都运行良好,但只是想检查是否有我遗漏的东西。
TL;DR:是的,根据 DNS 的定义,至少在查询时需要存在中间子域;但是它们可能不存在于区域文件中。
首先消除可能的混淆;“空非终端”的定义
您可能会混淆两件事,因为其他答案似乎也是如此。即,查询名称时会发生什么与您如何配置名称服务器和区域文件的内容。
DNS 是分层的。对于要存在的任何叶节点,通向它的所有组件都必须存在,因为如果查询它们,负责的权威名称服务器应该无错误地回复它们。
正如RFC 8020中所解释的(这只是重复了一直以来的规则,但只是一些 DNS 提供商需要提醒),如果对于任何查询,权威名称服务器回复 NXDOMAIN(即:此资源记录不存在),那么这意味着该资源“下方”的任何标签也不存在。
在您的示例中,如果查询
intermediate.example.com
返回NXDOMAIN
,则任何适当的递归名称服务器将立即回复NXDOMAIN
,leaf.intermediate.example.com
因为如果其中的所有标签都不作为记录存在,则该记录将不存在。过去在RFC 4592中已经说明了通配符(此处不相关):
.US 域名的实际示例
让我们从历史上具有很多标签的 TLD 中举一个工作示例,即
.US
. 在网上挑选任何示例,让我们使用www.teh.k12.ca.us
.当然如果你查询这个名字,甚至
teh.k12.ca.us
可以取回A
记录。对于我们的目的,这里没有任何结论(中间甚至还有一个 CNAME,但我们不在乎):现在让我们查询
k12.ca.us
(我不是在查询它的权威名称服务器,但实际上并不会改变结果):我们从这个答案中学到了什么?
首先,它是成功的,因为状态是
NOERROR
。如果它是其他任何东西,特别是NXDOMAIN
thenteh.k12.ca.us
,也www.teh.k12.ca.us
不可能存在。其次,ANSWER 部分是空的。没有
A
记录k12.ca.us
。这不是错误,A
此记录不存在此类型(正如我们已经知道的那样,它“低于”它(参见RFC 7719中的定义)(但通常分辨率是自上而下的,因此我们将在进入下一层之前到达这一步,而不是像我们在这里演示的那样相反目的)。这就是为什么事实上,作为一种快捷方式,我们说状态码是
NODATA
:这不是一个真正的状态码,它只是意味着NOERROR
+ 空的 ANSWER 部分,这意味着没有该特定记录类型的数据,但可能有其他记录类型的数据。如果您使用下一个“向上”标签(即名称)进行查询,则可以针对相同的结果重复相同的实验
ca.us
。查询结果与 zonefile 内容
现在混乱从何而来?我相信这可能来自一些错误的想法,即 DNS 名称中的任何点都意味着有一个委托。这是错误的。换句话说,您的
example.com
zonefile 可以是这样的,它是完全有效且有效的:使用这样的区域文件,查询此名称服务器您将得到与上面观察到的完全相同的行为:查询
intermediate.example.com
将返回NOERROR
一个空答案。您不需要在 zonefile 中专门创建它(如果您因为其他原因不需要它),权威名称服务器将负责合成“中间”回复,因为它认为它需要这个空的非终端(以及任何其他“中间”如果有其他标签),因为它看到叶子名称leaf.intermediate.example.com
。请注意,这实际上在某些领域很普遍,但您可能看不到它,因为它针对的是人们未接触到的更多“基础设施”记录:
in-addr.arp
在类似or的反向区域ip6.arpa
中,特别是最后一个区域。您将拥有类似的记录1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.a.1.d.e.1.6.8.0.0.0.0.0.0.2.6.2.ip6.arpa. 1h IN PTR text-lb.eqiad.wikimedia.org.
,显然每个点都没有委托,每个标签上也没有附加资源记录SRV
记录中,例如_nicname._tcp.fr. 12h IN SRV 0 0 43 whois.nic.fr.
,一个域可以有许多_proto._tcp.example.com
和_proto._udp.example.com
SRV
记录,因为根据设计它们必须具有这种形式,但同时_tcp.example.com
并且_udp.example.com
将保持为空非终端,因为从未用作记录whatever._domainkey.example.com
,但显然_domainkey.example.com
它本身永远不会被使用,因此它将保持为空的非终端。这对于TLSA
DANE 中的记录(例如:)_25._tcp.somehost.example.com. TLSA 3 1 1 BASE64==
或URI
记录(例如_ftp._tcp IN URI 10 1 "ftp://ftp1.example.com/public"
:)中的记录相同名称服务器行为和中间回复的生成
为什么名称服务器会自动合成这样的中间答案?DNS 的核心解析算法,详见RFC 1034 第 4.3.2 节是其原因,让我们在查询上述权威名称服务器的名称时总结一下
intermediate.example.com
(这是QNAME
下面的协议):名称服务器发现 zone
example.com
是 QNAME 的最近祖先,所以我们可以转到第 3 步。我们现在有这个:
我们可以消除 case b 和 c,因为我们的 zonefile 没有委托(因此永远不会引用其他名称服务器,没有 case b),也没有通配符(所以没有 case c)。
我们只需要在这里处理案例 a。
我们开始在区域中逐个标签向下匹配。因此,即使我们有一个长
sub.sub.sub.sub.sub.sub.sub.sub.example.com
名称,在某些时候,我们也会遇到案例 a:我们没有找到推荐人,也没有找到通配符,但我们最终得到了我们想要结果的最终名称。然后我们应用案例a的其余内容:
不是我们的情况,我们跳过它。
无论我们选择什么 QTYPE(
A
、AAAA
、NS
等),我们都没有 RR,intermediate.example.com
因为它不会出现在 zonefile 中。所以这里的副本是空的。现在我们完成第 6 步:在这里与我们无关,因此我们以成功结束。
这正好解释了观察到的行为:这样的查询将返回
NOERROR
但也没有数据。现在,您可能会问自己:“但是如果我使用任何名称,例如
another.example.com
通过上述算法,我应该得到相同的回复(没有错误)”,但在这种情况下,观察会报告NXDOMAIN
。为什么?
因为解释的整个算法都是从这个开始的:
这意味着上面的 zonefile 被转换成这棵树:
所以按照算法,从上往下,确实可以找到路径:(
com > example > intermediate
因为路径com > example > intermediate > leaf
存在)但是对于another.example.com
,在 树中com > example
没有找到another
标签后,作为 的子节点example
。因此,我们从上面属于选择 c 的一部分:标签
*
不存在,我们没有遵循 aCNAME
,因此我们是 case:set an authoritative name error in the response and exit
,又名NXDOMAIN
。请注意,以上所有内容在过去确实造成了混乱。这收集在一些 RFC 中。例如,参见定义通配符的这个意想不到的地方(DNS 规范的乐趣如此难以理解):RFC 4592“通配符在域名系统中的作用”,特别是其第 2.2 节“存在规则”,在开头部分也引用了我的回答,但这里更完整:
然后下一节的定义就是我开头引用的那段。
请注意,RFC 8020(
NXDOMAIN
真正的含义NXDOMAIN
,即如果您回复NXDOMAIN
,intermediate.example.com
则leaf.intermediate.example.com
不能存在)是强制性的,部分原因是各种 DNS 提供商没有遵循这种解释并且造成了严重破坏,或者它们只是错误,例如看这个2013 年在一个开源权威名称服务器代码中修复:https ://github.com/PowerDNS/pdns/issues/127然后人们需要为他们采取特定的对策:这不是积极缓存
NXDOMAIN
,因为对于那些提供者来说,如果你到达NXDOMAIN
某个节点,它可能仍然意味着你得到的东西不是NXDOMAIN
在它下面的另一个节点。这使得 QNAME 最小化 (RFC 7816) 无法获得(有关详细信息,请参阅https://indico.dns-oarc.net/event/21/contributions/298/attachments/267/487/qname-min.pdf) ,虽然它是想增加隐私。在 DNSSEC 的情况下,空的非终端的存在在过去也造成了问题,围绕不存在的处理(参见https://indico.dns-oarc.net/event/25/contributions/403/attachments/378/647 /AFNIC_OARC_Dallas.pdf如果有兴趣,但您确实需要对 DNSSEC 有一个很好的了解)。
以下两条消息给出了一个提供商必须能够在空非终端上正确执行此规则的问题示例,它给出了问题的一些观点以及我们为什么在那里:
我可能误解了 Khaled 的回答,但缺少中间记录绝不应该是子区域名称解析的问题。请注意,此 dig 输出不是来自,也不是指向权威 DNS 服务器
teaparty.net
或其任何子区域:确实,您应该能够自己做到这
dig
一点,并得到答案 -teaparty.net
是一个真实的域,在我的控制之下,并且确实包含该A
记录。您可以验证very
和之间的任何这些区域都没有记录teaparty.net
,并且它对上述主机名的解析没有影响。如果你直接查询权威的DNS服务器,你会得到没有问题的答案。
但是,如果您通过另一个没有有效缓存的 DNS 服务器进行查询,您将不会得到有效的答案。查询
intermediate.example.com
会NXDOMAIN
报错。要直接回答这个问题,您不需要为您实际未使用的中间名称添加记录,但这并不意味着这些名称不存在。
至于这些名称是否存在,这实际上是一个完全独立的问题,我希望提供一个简短而直观的答案。
这一切都归结为DNS是一个树结构,其中域名中的每个标签都是一个树节点。例如,
www.example.com.
有标签www
、和 ``(根节点),它们是形成一直到根的路径的树节点。example
com
可能使 DNS 的这种基本性质不明显的是,在管理 DNS 数据时几乎总是看不到树,而且我们通常不直接使用树节点本身,而是通常有一个扁平化的记录列表应该存在于不同域名的数据(有效的树路径,如上所述)。
foo.bar.example.com.
使用此扁平列表时会发生什么情况,DNS 服务器软件根据现有记录构建树,如果有记录的节点之间存在间隙(例如,有记录example.com.
但没有记录bar.example.com.
),这些只是被认为是空树节点。也就是说,这些是确实存在的域名/节点,树没有损坏,这些节点只是没有任何与之关联的数据。因此,如果您查询这些空节点之一,您将收到
NODATA
响应(在权限部分中的NOERROR
状态+SOA
),说明请求的记录类型在此节点不存在。如果您改为查询一些实际上不存在的名称,您将得到NXDOMAIN
响应,说请求的域名在树中不存在。现在,如果您想了解细节,请阅读 Patrick Mevzek 的非常详尽的回答。