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 语句定义和用法 | 精彩每一天