我在使用 bind9 配置以下 dns 设置时遇到了问题:
我想将区域委托给远程 DNS 服务器。但我想将该区域的子区域委托给不同的 DNS 服务器。
例子:
project.example.com
-> 至 DNS 服务器dns1
prd.project.example.com
-> 至 DNS 服务器dns2
出于显而易见的原因,我不想将所有事情委托给dns1
然后再委托prd.project.example.com
给dns2
。我可以更深入地了解细节(需要动态子域,dns1
例如等),但我认为它们现在不会有帮助。dev
hotfix1
我能够使用 cloudflare 和 aws route53 成功设置此解决方案。但 bind 无法按预期工作。它一直将所有内容(例如test.prd.project.example.com
)委托给dns1
。
我错过了什么?
以下是简化的区域文件:
$ORIGIN example.com.
$TTL 300
@ IN SOA dns.example.com. ( 2021020506 3600 720 1209600 3600 )
IN NS dns.example.com.
dns IN A 1.2.3.4
$ORIGIN project.example.com.
$TTL 60
@ IN NS ns-1.awsdns-1.net.
IN NS ns-1.awsdns-1.co.uk.
$ORIGIN prd.project.example.com.
$TTL 60
@ IN NS ns-2.awsdns-2.net.
IN NS ns-2.awsdns-2.co.uk.
答案1
DNS 委派基础知识
问题中的委派组合在 DNS 中是无法实现的。
您的区域恰好在委派点处结束,您无法委派不属于您自己区域的内容。
在您的示例中,委托prd.project.example.com
必须在project.example.com
区域中进行,但无法在example.com
区域中完成。
AWS Route53 行为
在对 AWS Route53 进行一些实验之后,我现在更好地理解了这个问题的基础:
看来 AWS Route53 在添加区域外记录方面完全缺乏一致性检查。
对于大多数记录类型,Route53 似乎在查询时会忽略这些区域外记录的存在(这使得它们基本上无害),但NS
它实际上为它们提供服务,尽管这会导致向世界公开不可能的委派组合。
这显然是一个错误,它暴露了一个不可能的委托组合,我预计这会导致客户端的行为不一致(本质上取决于解析器首先看到的委托),这不是我们所希望的。
我不希望 BIND 或其他任何东西复制这种特定行为,因为它与 DNS 作为树结构的基本性质相矛盾。(我也不指望它在实践中真的能起作用,所以没有理由实现它。)