当我向权威名称服务器(在虚拟机中本地使用 bind 实现)查询“host1.cool.com”的“A”记录时,它会在内部使用递归(可能)解析查询并返回实际的“A”记录。我需要名称服务器在每次查询时回复一个 CNAME 记录,递归解析器可以发出多个 DNS 查询来解析名称。但是,我无法通过将“recursion no;”设置为“named.conf.options”来做到这一点。
我的查询(来自另一台机器):
dig A @192.168.0.115 host1.cool.com
响应是整个 CNAME 链,以及最终答案:
;; ANSWER SECTION:
host1.cool.com. 5 IN CNAME host2.cool.com.
host2.cool.com. 5 IN CNAME host3.cool.com.
host3.cool.com. 5 IN CNAME host4.cool.com.
host4.cool.com. 5 IN CNAME host5.cool.com.
host5.cool.com. 5 IN CNAME host6.cool.com.
host6.cool.com. 5 IN CNAME host7.cool.com.
host7.cool.com. 5 IN A 22.33.44.55
我希望名称服务器只响应一条 CNAME 记录,即使对于“A”查询也是如此。可能是这样的:
host1.cool.com CNAME host2.cool.com
我的 named.conf.local 文件
zone "cool.com" IN {
type master;
file "/etc/bind/db.cool.com";
allow-transfer { none; };
};
以及named.conf.options文件
options {
directory "/var/cache/bind";
auth-nxdomain no;
allow-query { any; };
allow-transfer { none; };
recursion no;
};
db.cool.com 文件
@TTL 5S
@ IN SOA @ hostmaster.cool.com. (
0, 3H, 1H, 1W, 3H )
@ IN NS ns1.cool.com.
@ IN NS ns2.cool.com.
@ IN A 98.87.76.65
ns1 IN A 10.20.30.40
ns2 IN A 10.20.30.41
host1.cool.com. IN CNAME host2.cool.com.
host2.cool.com. IN CNAME host3.cool.com.
host3.cool.com. IN CNAME host4.cool.com.
host4.cool.com. IN A 22.33.44.55
如何配置 bind 不在内部使用递归来解析查询?
答案1
这种行为会破坏 CNAME。如果您不想获取 IP 地址,则不应查询A/AAAA
资源记录 (RR),而应明确向服务器请求CNAME
。
引用 RFC 1034:
CNAME RR 会导致 DNS 软件采取特殊措施。当名称服务器无法在与域名关联的资源集中找到所需的 RR 时,它会检查资源集是否包含具有匹配类的 CNAME 记录。如果是,名称服务器会在响应中包含 CNAME 记录,并在 CNAME 记录的数据字段中指定的域名处重新启动查询。此规则的一个例外是,与 CNAME 类型匹配的查询不会重新启动。
例如,假设名称服务器正在处理针对 USC-ISIC.ARPA 的查询,请求 A 类信息,并且具有以下资源记录:
USC-ISIC.ARPA IN CNAME C.ISI.EDU C.ISI.EDU IN A 10.0.0.52
这两种 RR 都将在对 A 类型查询的响应中返回,而 CNAME 或 * 类型查询应该只返回 CNAME。
用 DNS 术语来说,递归是指您的 DNS 服务器从根区域开始解析名称,然后递归地下降区域,直到到达终端标签并查询所需的 RR。