ACL是Access Control List的缩写,即访问控制列表,就是一个被命名的地址匹配列表。使用访问控制列表可以使配置简单而清晰,一次定义之后可以在多处使用,不会使配置文件因为大量的 IP 地址而变得混乱。
定义 ACL
要定义访问控制列表,可以在 BIND 的主配置文件 /usr/local/named/etc/named.conf 中使用 acl 语句来实现。acl 语句的语法为:
acl  acl_name {
    address_match_list;
};
BIND 里默认预定义了 4 个名称的地址匹配列表,他们可以直接使用,分别为:
- any : 所有主机
- localhost : 本机
- localnets : 本地网络上的所有主机
- none : 不匹配任何主机
Tips:acl 是 named.conf 中的顶级语句,不能将其嵌入其他的语句。要使用用户自己定义的访问控制列表,必须在使用之前定义。因为可以在 options 语句里使用访问控制列表,所以定义访问控制列表的 acl 语句应该位于 options 语句之前。
为了便于维护管理员定义的访问控制列表,可以将所有定义 acl 的语句存放在单独的文件 /usr/local/named/etc/named.conf.acls 中,然后在主配置文件 /usr/local/named/etc/named.conf 中如下语句
include "/usr/local/named/etc/named.conf.acls";
使用 ACL
定义了 ACL 之后,可以在如下的子句中使用
| 子句 | 模块 | 说明 | 
| allow-query | options,zone | 指定哪主机或网络可以查询本服务器或区,默认的是允许所有主机进行查询。 | 
| allow-transfer | options,zone | 指定哪些主机允许和本地服务器进行域传输,默认值是允许和所有主机进行域传输。 | 
| allow-recursion | options | 指定哪些主机可以进行递归查询。如果没有设定,缺省是允许所有主机进行递归查询的。注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。 | 
| allow-update | zone | 指定哪些主机允许为主域名服务器提交动态 DNS 更新。默认为拒绝任何主机进行更新。 | 
| blackhole | options | 指定不接收来自哪些主机的查询请求和地址解析。默认值是 none 。 | 
Tips :上面列出的一些配置子句既可以出现在全局配置 options 语句里,又可以出现在 zone 声明语句里,当在两处同时出现时,zone 声明语句中的配置将会覆盖全局配置 options 语句中的配置。
ACL 使用举例
限制查询
假如要限制只有 202.0.0.0/8 和 221.0.0.0/8 查询本地服务器的所有区信息,可以在 options 语句里使用如下的 allow-query 子句
 options {
     ......
     allow-query { 202.0.0.0/8; 221.0.0.0/8; };
     ......
 };
上面的配置没有使用 ACL,若使用 acl,需要以下的配置步骤:
- 在 /usr/local/named/etc/named.conf.acls 中添加如下的 acl 语句,对允许查询的主机列表命名
 acl allow-query-list {
     202.0.0.0/8;
     221.0.0.0/8;
 };
- 在 /usr/local/named/etc/named.conf.options 中使用定义的 acl_name 限制允许查询的主机列表。(我们也会把options模块独立出一个文件)
 options {
     ......
     allow-query { allow-query-list; };
     ......
 };
限制区传输
假如要限制只有 221.3.131.5 和 221.3.131.6 可以从本地服务器传输 “example.com” 的区信息,可以在 zone 语句里使用如下的 allow-transfer 子句
zone "example.com" {
     type master;
     file "example.com.hosts";
     allow-transfer { 221.3.131.5; 221.3.131.6; };
};
上面的配置没有使用 ACL,若使用 acl,需要以下的配置步骤:
- 在 /usr/local/named/etc/named.conf.acls 中添加如下的 acl 语句,对允许查询的主机列表命名
acl allow-transfer-list {
     221.3.131.5;
     221.3.131.6;
 };
- 在 /usr/local/named/etc/named.conf 中使用定义的 acl_name 限制允许进行域传输的主机列表
zone "example.com" {
     type master;
     file "example.com.hosts";
    allow-transfer { allow-transfer-list; };
};
防止欺骗和拒绝服务攻击
为了防止欺骗和拒绝服务攻击,对于 Internet 上的每个 DNS 服务器至少应该有一个假地址的 ACL 和一个本地地址的 ACL。为此,需要执行如下的步骤
- 在 /etc/bind/named.conf.acls 中添加如下的 acl 语句,创建一个名称为 “bogusnets” 的 ACL 来阻止经常用于欺骗性攻击的(RFC1918)地址空间
acl bogus-nets {
     0.0.0.0/8;
     1.0.0.0/8;
     2.0.0.0/8;
     169.254.0.0/16;
     192.0.2.0/24;
     224.0.0.0/3;
     10.0.0.0/8;
     172.16.0.0/12;
     192.168.0.0/16;
 };
- 创建一个名称为 “our-nets” 的 ACL,并将其配置为实际本网的 IP 地址段。
 acl our-nets {    //用您的网络地址替换下面的地址列表
     x.x.x.x/24;
     x.x.x.x/21;
 };
- 在 /etc/bind/named.conf.options 中使用定义的 acl_name 限制查询和响应
options {
 ......
 allow-query { our-nets; };
 allow-recursion { our-nets; };
 blackhole { bogus-nets; };
 ......
 };

Pingback引用通告: Bind的安装与详细配置 | 精彩每一天
Pingback引用通告: Bind中的 options 语句定义和用法 | 精彩每一天