我只是想知道 Bind 9 的 allow-query-on 和 listen-on 语句之间的行为差异。它们似乎执行类似的功能。根据 ARM 第 6 章(“Bind 9 配置”):
可以使用 listen-on 选项指定服务器将回答查询的接口和端口。
给出的语法是:
监听 [ 端口 ip_port ] [ dscp ip_dscp ] { 地址匹配列表 } ;
同一章中还有:
allow-query-on:指定哪些本地地址可以接受普通的 DNS 问题。
给出的语法是:
允许查询 { 地址匹配列表 };
从语法上看,allow-query-on 似乎不允许指定端口号。还有其他区别吗?
答案1
它们并不是真正相似的函数。该listen-on
语句是named
绑定到特定 IP 地址和端口所必需的。如果不设置它,默认是在服务器上所有接口的端口 53 上侦听 DNS 查询。如果您的服务器有多个接口,并且您只想在其中一个接口上提供 DNS 服务,请使用listen-on
仅侦听一个接口。尝试以另一种方式使用allow-query-on
only 将使 BIND 仍然侦听所有接口。最好的方法是同时使用两者,即仅绑定到您需要的接口,然后进一步限制您允许的查询类型。
答案2
聆听
listen-on
用于指定进程named
应该使用哪些地址/端口组合bind(3)
。
即,地址/端口组合告诉named
操作系统它是一个“监听”的过程,因此想要接收发送到那里的任何内容。
由于套接字 API 级别不了解 DNS,因此无法在此处进行任何细粒度的控制。您要么监听,要么不监听,如果您监听,则其他任何程序都无法监听同一地址/端口(这会影响在同一主机上可以并行运行的其他程序)。
允许-*-on
allow-*-on
(并且,从相反的角度来看,常规allow-*
DNS 指令是 BIND 内部针对收到的不同类型 DNS 消息(不同类别的查询、更新、区域传输等)的访问控制措施。
由于这是 BIND 内部的功能,它解释了收到的 DNS 数据并允许更细粒度的访问控制(但它必须首先在某处监听以接收消息)。
答案3
我目前正在研究 BIND,也想知道同样的问题。我认为答案在于您未提及的语句,即还有 existallow-query-cache-on
和allow-recursion-on
语句。它们结合起来可以比listen-on
语句更精细地配置 BIND。
此外,关于allow-query-on
,文档继续说道:
例如,这使得可以在面向内部的接口上进行查询(...),而不必知道内部网络的地址。
我相信这就是这些陈述存在的答案。
举个例子,
options {
allow-query-on { 203.0.113.17; };
allow-recursion-on { 10.0.0.17; };
allow-query-cache-on { 10.0.0.17; };
};
类似于
acl corpnets {
10.0.0.0/16;
172.16.0.0/12;
};
options {
allow-query { any; };
allow-recursion { corpnets; };
allow-query-cache { corpnets; };
};
但在第二个示例中,您需要保持 ACL 保持最新。
最后要说的是,我相信这些只在某些特殊情况下才需要,就像许多 BIND 选项一样。