我遇到了一个有趣的问题。我开始注意到,当我对我们拥有权威的某个域执行 dig +trace 时,我们会从名称服务器收到“错误引用”的错误,您可以看到它将请求转发回命名空间树而不是给出答案。不幸的是,我目前无法重现此问题。但是我可以重现错误(水平)引用。基本上,一旦查询被引用到我们的名称服务器,我就会看到以下内容:
;; BAD (HORIZONTAL) REFERRAL
;; Received 187 bytes from x.x.x.x#53(ns.example.com in 2 ms
有时,这种情况会循环,直到我遇到“查找次数过多”错误,然后它就放弃了,或者它会停止并尝试我们的其他服务器,然后得到答案。这是有趣的部分。如果我对不断失败跟踪的服务器执行简单的 dig A 查找,我会得到答案。如果我然后转身并再次对同一查询执行 dig +trace,它就不会再失败了。这几乎就像记录被缓存在某个地方,在它过期后,您将再次看到该消息。有人能帮我弄清楚这里发生了什么吗?这是关于我们环境的信息。
1)运行 BIND 9.8.2 的 RHEL 6
2)面向公众的权威主服务器和从服务器。”
3)服务器以“视图”配置设置。(双视图 - 一个用于“内部”,一个用于外部)
4)似乎我们在实现视图之后才开始看到这些奇怪的现象。
5)命中内部视图的查询将转发到外部视图,以查找内部视图中未包含的区域。我们使用环回 IP 来实现这一点。
6)这些权威服务器还设置为通过使用递归语句和根“提示”区域来以递归方式回答非权威查询。
这是我们简化的设置。
主服务器:
acl ext_trusted {
x.x.x.x; // trusted net external
}; // end of "ext_trusted" ACL definition.
acl int_trusted {
x.x.x.x; // trusted internal
}; // end of ACL for "int_trusted"
options {
directory "/var/named";
recursive-clients 30000;
tcp-clients 2000;
check-names master ignore;
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named.stats.txt";
memstatistics-file "/var/named/data/named_mem/stats.txt";
zone-statistics yes;
cleaning-interval 30;
// Listen on ipv4: // Adding localhost for view forwarding
listen-on port 53 { x.x.x.x; 127.0.0.1; };
// And, also listen on ipv6:
// loopback is required for view forwarding do not remove
listen-on-v6 { ::1; x.x.x.x; };
// Enforce the Customer DNS Query ACL Defined Above:
allow-query { ext_trusted; int_trusted; };
};
key "internal" {
algorithm HMAC-SHA512;
secret "xxxxxxxxx";
};
key "external" {
algorithm HMAC-SHA512;
secret "xxxxxxxx";
};
view "internal" {
match-clients { !key external; int_trusted; key internal; };
//IP of slave server IPv4
server x.x.x.x {
keys { internal; };
};
//IP of slave server IPv6
server x.x.x.x {
keys { internal; };
};
also-notify { //slave servers go here
x.x.x.x; x.x.x.x;
};
allow-transfer { key internal; local_ns; int_ns; };
empty-zones-enable no;
server fe80::/16 { bogus yes; };
server 0.0.0.0/8 {bogus yes; };
zone "example.org" {
type master;
file "db.eamplein.org";
allow-query { int_trusted; };
};
forwarders {
// forward to external view //
127.0.0.1; ::1;
};
forward only;
};
view "external" {
match-clients { any; };
//IP of slave server IPv4
server x.x.x.x {
keys { external; };
};
//IP of slave IPv6
server x.x.x.x {
keys { external; };
};
also-notify { //IP address of slave server
x.x.x.x; x.x.x.x;
};
allow-transfer { key external; ext_ns; local_ns; };
server fe80::/16 { bogus yes; };
server 0.0.0.0/8 {bogus yes; };
empty-zones-enable yes;
recursion yes;
allow-recursion { any; };
zone "." {
type hint;
file "/var/named/named.ca";
};
zone "example.org" {
type master;
file "db.eampleout.org";
allow-query { any; };
};
zone "example.com" {
type master;
file "db.eample.com";
allow-query { any; };
};
};
从属服务器配置:
acl ext_trusted {
x.x.x.x; // trusted net external
}; // end of "ext_trusted" ACL definition.
acl int_trusted {
x.x.x.x; // trusted internal
}; // end of ACL for "int_trusted"
options {
directory "/var/named/slaves";
recursive-clients 30000;
tcp-clients 2000;
check-names master ignore;
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
cleaning-interval 30;
// Listen on ipv4:
// Change this to the proper IP address if you ever switch back!
// loopback is required for view forwarding do not remove
listen-on port 53 { 127.0.0.1; x.,x.x.x;; };
// And, also listen on ipv6:
// Configure ipv6 before uncommenting this:
// loopback is required for view forwarding do not remove
listen-on-v6 port 53 { ::1; x,x.x.x; ;
// Enforce the "trusted" ACL defined at the begining of this config file:
allow-query { ext_trusted; int_trusted; };
};
key "internal" {
algorithm HMAC-SHA512;
secret "xxxxxxxxx";
};
key "external" {
algorithm HMAC-SHA512;
secret "xxxxxxxx";
};
view "internal" {
match-clients { !key external; int_trusted; key internal; };
//IPv4 of master server
server x.x.x.x {
keys { internal; };
};
// IPv6
server x.x.x.x. {
keys { internal; };
};
allow-transfer { key internal; local_ns; int_ns; };
transfer-source x.x.x.x.;
empty-zones-enable no;
server fe80::/16 { bogus yes; };
server 0.0.0.0/8 {bogus yes; };
zone "example.org" {
type slave;
file "db.example.org";
masters { x.x.x.x; x.x.x.x; };
allow-query { int_trusted; };
};
forwarders {
// forward to external view //
127.0.0.1; ::1;
};
forward only;
};
view "external" {
match-clients { any; };
//IP of master server
server x.x.x.x {
keys { external; };
};
//IPv6
server x.x.x.x. {
keys { external; };
};
allow-transfer { key external; ext_ns; local_ns; };
transfer-source x.x.x.x;
server fe80::/16 { bogus yes; };
server 0.0.0.0/8 {bogus yes; };
empty-zones-enable yes;
recursion yes;
allow-recursion { any; };
zone "." {
type hint;
file "/var/named/named.ca";
};
zone "example.org" {
type slave;
file "db.exampleout.org";
masters { x.x.x.x; x.x.x.x; };
allow-query { any; };
};
zone "example.com" {
type master;
file "db.example.com";
allow-query { any; };
};
};
更新:简要说明一下,我注意到,从内部视图的 acl 中的 IP 进行 dig +trace 永远不会失败,而从内部视图中的区域进行 dig +trace 则永远不会失败。这似乎只有在从指向内部视图的 IP 在外部视图中 dig +trace 区域时才会失败。
答案1
根据@andrew-b 的评论,这通常是由于委派不匹配造成的。
当开发人员尝试对 host.subdomain.example.org 之类的记录进行 +trace 查找时,我也遇到了同样的错误。具体原因可能有所不同 - 但可能属于类似主题。
在我们的案例中,原因是我们有一条防火墙规则,可以捕获并重定向*发送到“未经授权”服务器的 DNS 查询。请求将到达我们自己的 DNS 服务器,然后执行递归查询。客户端会认为它将每个连续的查询发送到互联网,但这些请求实际上将由我们的内部服务器响应。
修复方法是提醒开发人员 DNS 请求将被拦截 - 并且他们可以从白名单服务器进行测试以绕过 DNS 重定向规则。
请参阅开发人员收到的已编辑错误,如下所示:
tricky-desktop:~ tricky$ dig +trace host.subdomain.example.org
; <<>> DiG 9.8.3-P1 <<>> +trace host.subdomain.example.org
;; global options: +cmd
. 3600 IN NS g.root-servers.net.
. 3600 IN NS l.root-servers.net.
. 3600 IN NS j.root-servers.net.
. 3600 IN NS k.root-servers.net.
. 3600 IN NS b.root-servers.net.
. 3600 IN NS m.root-servers.net.
. 3600 IN NS d.root-servers.net.
. 3600 IN NS i.root-servers.net.
. 3600 IN NS e.root-servers.net.
. 3600 IN NS c.root-servers.net.
. 3600 IN NS h.root-servers.net.
. 3600 IN NS a.root-servers.net.
. 3600 IN NS f.root-servers.net.
;; Received 477 bytes from 192.168.1.2#53(192.168.1.2) in 87 ms
subdomain.example.org. 0 IN NS ns-outside-1.example.org.
subdomain.example.org. 0 IN NS ns-outside-2.example.org.
subdomain.example.org. 0 IN NS ns-outside-3.example.org.
subdomain.example.org. 0 IN NS ns-outside-4.example.org.
;; Received 295 bytes from 199.43.133.53#53(199.43.133.53) in 14 ms
subdomain.example.org. 0 IN NS ns-outside-2.example.org.
subdomain.example.org. 0 IN NS ns-outside-3.example.org.
subdomain.example.org. 0 IN NS ns-outside-4.example.org.
subdomain.example.org. 0 IN NS ns-outside-1.example.org.
;; BAD (HORIZONTAL) REFERRAL
;; Received 295 bytes from 199.43.135.53#53(199.43.135.53) in 5 ms
... 29 REPEATS REDACTED ...
subdomain.example.org. 0 IN NS ns-outside-4.example.org.
subdomain.example.org. 0 IN NS ns-outside-1.example.org.
subdomain.example.org. 0 IN NS ns-outside-2.example.org.
subdomain.example.org. 0 IN NS ns-outside-3.example.org.
;; BAD (HORIZONTAL) REFERRAL
dig: too many lookups
tricky-desktop:~ tricky$
防火墙规则最初是由于 BYOD 员工无法查找私人内部服务(因为“智能 DNS”服务改变了他们的 DNS 配置)而必须制定的。