假设我example.com
在route53中有一个区域包含以下记录:
foo.sub.example.com A 1.2.3.4
在同一个example.com
区域中,我也有一个代表团,因此也有该子sub.example.com
区域的 NS 记录。该sub.example.com
区域不包含foo.sub.example.com
A 记录;父母这样做。
现在,我注意到,通过此设置,请求会foo.sub.example.com A
失败,因为(通过 看到dig +trace
)解析过程最终会搜索子区域,而不是在记录确实存在的父区域处停止。
根据我的研究,我找不到强制执行此行为的参考、RFC 或标准,但它似乎就是这样工作的。
所以问题是:上述行为是预期/标准的还是只是 Route53 的事情,如果是前者,它记录在哪里?
是的,这是标准行为。通过将区域委托
sub.example.com
给指定的名称服务器,您可以将名称及其之下的所有名称的全部权限移至sub.example.com
上述名称服务器。该规则的唯一例外是所谓的
glue
记录,它们为位于委托区域中的名称服务器提供地址提示。请注意,这些只是提示,一旦解析到达权威名称服务器,它应该用区域中的数据替换它们(强烈建议使提示与权威区域内数据保持同步)。这是标准未指定的行为。
foo.sub.example.com
属于更广泛的粘合数据定义(请参阅RFC 8499和RFC 2181),但仅针对仅包含相关记录的狭义定义定义了特定行为NS
。对于其他记录,既不要求也不禁止服务器在应答中发送此类记录。许多流行的服务器不发送,但有些服务器会发送。我检查了 Bind、PowerDNS 和 Route53 - 它们不发送。我还检查了一个区域托管提供商 DNS 解决方案(可能基于 TinyDNS),他们确实发送了此类记录。这个问题里还有一个例子。如果服务器发送粘合记录,那么解析器会愉快地接受它,并且不会到达权威服务器(如RFC 2181中指定),因为这样的记录不存在,并且可能会导致一些意外。我用标准测试过
systemd-resolved
。结论 - 避免此类记录并且不要依赖现有行为。