如何配置绑定以不进行内部递归?

如何配置绑定以不进行内部递归?

当我向权威名称服务器(在虚拟机中本地使用 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。

相关内容