绑定:当不允许递归时,转发区域不起作用

Rac*_*cer 7 dns bind bind9

我有以下设置:

\n
    \n
  • DNS 服务器可通过互联网访问,对区域具有权威性foo.com
  • \n
  • DNS 服务器只能在本地访问,对于区域应该具有权威性test.lab.foo.com
  • \n
\n

我试图实现的目标:

\n

当来自外界的 DNS 查询到达第一个 DNS 服务器以获取属于该区域的记录时test.lab.foo.com,我希望它向第二个 DNS 服务器发出递归请求,然后转发记录。

\n

我明确不想进行区域传输或使第二个 DNS 服务器可从 Internet 访问。

\n

我的配置如下:(我只将[我的想法]\xc2\xa0重要部分复制到这里)

\n

在第一个 DNS 服务器上

\n
options {\n    allow-recursion {\n        localnets;\n        localhost;\n        internal;\n        my-datacenter;\n        mc-office;\n    };\n};\n\nzone "test.lab.foo.com" {\n        forward only;\n        forwarders {\n            <private IP of second DNS server>;\n        };\n        type forward;\n    };\n\n   zone "foo.com" {\n        file "/etc/bind/zones/foo.com.zone";\n        type master;\n    };\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题:

\n

当我在本地网络中时,它被列入块中的白名单allow-recursion,然后它会按预期工作。 \n当我尝试从互联网进行 DNS 查找时,我会得到一个 NOERROR 并返回空响应。

\n

在调试过程中,我调整了allow-recursion列表并添加any到其中。然后它就可以工作了。\n但我不希望我的 DNS 服务器允许任何类型的递归。实际上,我只希望对这一特定区域进行“外部”查找是递归的。

\n

如何allow-recursion只设置一个区域?

\n

小智 1

可以使用以下配置来解决此问题,使用 c1.k8s.ooo 作为托管在 2a0a:e5c0:2:f::a 上的示例域:

options {
    ...
    allow-recursion { ::/0; 0.0.0.0/0; };                                                        
};

zone "c1.k8s.ooo"  {                                                                             
   type forward;                                                                                 
   forward only;                                                                                 
   forwarders { 2a0a:e5c0:2:f::a; };                                                             
};       

zone "." {                                                                                       
        type hint;                                                                               
        file "/dev/null";                                                                        
};                                                                                                                                                                                              
Run Code Online (Sandbox Code Playgroud)

其作用如下:

  • 它首先将绑定变成开放解析器(这是一件坏事)
  • 我们用目的地定义区域
  • 使用zone "."我们删除内置的根提示支持,从而使绑定无法解析任何内容,但需要解析所需的域。

请注意,使用类似的东西

zone "." {                                                                                       
        type forward;                                                                            
        forward only;                                                                            
        forwarders { };                                                                          
};            
Run Code Online (Sandbox Code Playgroud)

不会停止来自外部的递归,因为bind具有内置的根区域。