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

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

我有以下设置:

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

我试图实现的目标:

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

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

我的配置如下所示:(我只将[我认为]重要的部分复制到这里)

在第一个 DNS 服务器上

options {
    allow-recursion {
        localnets;
        localhost;
        internal;
        my-datacenter;
        mc-office;
    };
};

zone "test.lab.foo.com" {
        forward only;
        forwarders {
            <private IP of second DNS server>;
        };
        type forward;
    };

   zone "foo.com" {
        file "/etc/bind/zones/foo.com.zone";
        type master;
    };

我的问题:

当我在本地网络中时,该网络已在allow-recursion块中列入白名单,那么它就会按预期工作。当我尝试从互联网进行 DNS 查找时,我得到一个 NOERROR 和一个空响应。

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

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

答案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";                                                                        
};                                                                                                                                                                                              

其作用如下:

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

请注意,使用类似的东西

zone "." {                                                                                       
        type forward;                                                                            
        forward only;                                                                            
        forwarders { };                                                                          
};            

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

相关内容