在我的测试环境中,我有 4 个名称服务器。DNS1 名称服务器我希望对 domain.com 具有权威性,并将子域 sub.domain.com 委托给其他 3 个名称服务器。
客户端设备也直接连接到 DNS1。
这是我的区域和配置文件:
root@DNS1:/etc/bind# more db.domain.com
$TTL 604800
@ IN SOA domain.com. admin.domain.com. (
75 ; Serial
900 ; Refresh 15 mins
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.domain.com.
; name servers - A records
ns1.domain.com. IN A 192.168.242.200
www.domain.com. IN CNAME www.sub.domain.com.
;sub domain
sub.domain.com. IN NS ns1.sub.domain.com.
sub.domain.com. IN NS ns2.sub.domain.com.
sub.domain.com. IN NS ns3.sub.domain.com.
ns1.sub.domain.com. IN A 172.16.14.50
ns2.sub.domain.com. IN A 10.10.4.50
ns3.sub.domain.com. IN A 192.168.100.50
root@DNS1:/etc/bind# more named.conf.options
options {
directory "/var/cache/bind";
recursion yes; # enables recursive queries
listen-on { any; }; # ns1 private IP address - listen on private network only
allow-transfer { none; }; # disable zone transfers by default
allow-recursion { any; };
allow-query { any; };
allow-query-cache { any; };
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
listen-on-v6 { any; };
};
root@DNS1:/etc/bind# more named.conf.local
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
zone "domain.com" {
type primary;
file "/etc/bind/db.domain.com";
notify yes;
};
zone "sub.domain.com" {
type forward;
forwarders { 172.16.14.50; 10.10.4.50; 192.168.100.50; };
};
我有一台客户端电脑,它使用 DNS1 作为测试解析器。DNS1 也是 domain.com 的权威。启用递归后,客户端会询问 NS 记录,返回的内容如下:
root@gns3-webterm-1:~# nslookup
> set type=ns
> sub.domain.com
Server: 192.168.242.200
Address: 192.168.242.200#53
Non-authoritative answer:
sub.domain.com nameserver = ns3.sub.domain.com.
sub.domain.com nameserver = ns2.sub.domain.com.
sub.domain.com nameserver = ns1.sub.domain.com.
Authoritative answers can be found from:
在跟踪中,DNS1 服务器向其中一个名称服务器(在本例中为 192.168.100.50)询问 NS 记录查询并返回上述内容。
在 DNS1 上禁用递归时,我得到以下信息
> set type=ns
> sub.domain.com
Server: 192.168.242.200
Address: 192.168.242.200#53
Non-authoritative answer:
*** Can't find sub.domain.com: No answer
Authoritative answers can be found from:
sub.domain.com nameserver = ns3.sub.domain.com.
sub.domain.com nameserver = ns1.sub.domain.com.
sub.domain.com nameserver = ns2.sub.domain.com.
ns3.sub.domain.com internet address = 192.168.100.50
ns2.sub.domain.com internet address = 10.10.4.50
ns1.sub.domain.com internet address = 172.16.14.50
在 DNS1 上禁用递归后,客户端无法解析www.域名.com这表明www.sub.domain.com。
问题:
1 - 如果我希望 DNS1 禁用递归但仍解析 sub.domain.com,那么如何实现呢,定义单独的转发区域似乎不起作用?
2 - 对于子委派是否有最佳实践,或者父名称服务器上是否需要其他内容?
答案1
为了解释潜在的问题,以便人们能够正确理解情况:
关闭“DNS1”上的递归时遇到的基本问题有两个方面:
- “转发”被视为递归的一种变体。即,当禁用递归时,它也会被禁用,并且仅当查询已
RD
设置(需要递归)时才会执行。 - 您打破了任何已配置存根解析器的客户端计算机的期望(传统上是通过
resolv.conf
类 UNIX 系统、Windows 上每个接口的 IP 配置等...通常通过 DHCP 提供的配置)以使用“DNS1”作为其解析器服务器。
存根解析器完全依赖于其配置的解析器服务器提供的递归,因为存根本身不具备进行后续查询和组合其结果以跟踪委托、跟踪CNAME
记录等所需的能力。
因此,对这种情况最普遍的看法是,如果“DNS1”不再提供递归,则不应在客户端的存根解析器中配置它(并且不需要任何转发区域)。相反,应该配置一些解析器服务器,它应该为“DNS1”作为权威的查询找到“DNS1”,或者为其他名称找到任何其他权威服务器。
(通常,解析器服务器只需遵循全局 DNS 树中的委托即可找到权威,但如果这是某种形式的本地树外区域,解析器服务器本身可能需要一些“转发区域”样式的配置才能允许它找到这样的区域。)
即,一般情况下的方法更像是“如果 DNS1 不提供递归,那么应该在客户端上配置哪个解析器服务器来代替它?”
这可能意味着设置一个单独的解析器服务器并将此新配置提供给所有客户端。(这通常被认为是更好的方法,因为这种“组合角色”通常被视为有点混乱)。
现在,当然,对于给定的环境,它的特定要求可能允许一些中间立场(例如 Nikita 在他们的解决方案中所指出的“允许一些递归”),但我认为首先重要的是了解事物如何运作的总体思路,然后再针对该环境的具体情况进行更巧妙的调整。
答案2
您正确地完成了所有委托。由于 DNS1 对 不具有权威性sub.domain.com
,因此除非为特定客户端启用了递归,否则它永远不会回答有关它的查询。
但是,你可以将此区域添加为键入 forward区:
zone "sub.domain.com" {
type forward;
forward only;
forwarders { 192.168.100.50; 10.10.4.50; 172.16.14.50; };
};