![绑定:当不允许递归时转发区域不起作用](https://linux22.com/image/187832/%E7%BB%91%E5%AE%9A%EF%BC%9A%E5%BD%93%E4%B8%8D%E5%85%81%E8%AE%B8%E9%80%92%E5%BD%92%E6%97%B6%E8%BD%AC%E5%8F%91%E5%8C%BA%E5%9F%9F%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我有以下设置:
- 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具有内置的根区域。