? ?BIND的view是基于人的脑裂(brain split)原理,灵活控制哪些客户机能看到哪个view视图的访问控制列表,view功能可以实现不同网段发出同样的请求却得到不同的DNS解析结果,可以有效的分流网络流量,提高访问控制能力。
? 通过view语句可以完成DNS的智能解析功能,其语法如下:
????view view_name[class]{
???????[match-clients {address_match_list};]
???????[match-destinations {address_match_list};]
???????[view_options;...]
???????[zone_statement;...]
};
Class:
?????指定视图的类,默认为IN,所有非-IN视图必须包含一个hint域,因为只有IN类具有compiled-in默认暗示域。
match-clients
?????指定允许解析的客户源地址,默认为any。
match-destinations
?????指定用于客户目的地址的匹配,默认为any。
view_options
?????对应全局选项options里的选项,此处设置的优先级将高于options。
??????recursion定义同options.
????zone_statement
??????域文件声明,此处以include语句引入。
#其实说白了,view视图是根据match_clients提供的查询报文的IP地址进行过滤,一般用于让一个站点的DNS数据分为内外不同的结果。
? ? 每个view语句定义了一个被一些客户子集所看到的DNS 名字空间的视图。一个客户匹配一个视图 是指它的源地址与视图的match-clients子句中的address match list匹配并且它的目的地址与视 图的match-destinations子句中的address match list匹配。如果未指定,match-clients和match- destinations缺省都是匹配所有地址。除了检查IP地址,match-clients和match-destinations也可以使 用keys,它给客户端提供了一个选择视图的机制。一个视图也可以指定成为match-recursive-only, 它表示仅仅来自匹配客户的递归请求才匹配此视图。
Tips 1:view语句的顺序非常重要,一个客户端请求将在它所匹配的第一个view的上下文中被解析。在一个view语句中定义的区只能被与这个view相匹配的客户端访问。通过在多个视图中定义同样名字的区,可以为不同的客户端提供不同的区数据,例如,在一个分割的DNS 上建立“internal”和 “external”客户端。
Tips 2:许多在options语句中给出的选项也可以用在view语句中,并且仅仅在解析这个视图之内的请求时生效。当没有给出按视图指定的值时,缺省试验options 语句中的值。同样,区选项也使用在view语句 中指定的值做缺省值;这些按视图指定的缺省值优先于其在options语句中的值。
Tips 3:视图是按类划分的。如果没有给出类,假设为IN类。注意所有的非IN视图必须包含一个暗示区,因为只有IN类有一个预编译的缺省暗示区。
Tips 4:如果配置文件中没有view语句,就自动在IN类中建立一个匹配所有客户端的缺省视图(View: default)。然后在配置文件的顶层所指定的zone语句都是这个缺省视图的一部份,options语句将会应用到这个缺省视图。 如果提供任何显式的view语句,所有zone语句都必须出现在view语句之内。
options {
directory "/var/named";
};acl internal { //定义acl列表,来自192.168.80.0/24网段的客户端均为内网用户
192.168.80.0/24;
};acl external { //定义acl列表,来自192.168.1.0/24网段的客户端均为外网用户
192.168.1.0/24;
};view "internal" { //内网视图,定义了内网主机查询所使用的区域解析库文件
match-clients { internal; };
recursion yes;
zone "test.com" IN {
type master;
file "internal.test.com.zone";
};
};view "external" { //外网视图,定义了外网主机查询所使用的区域解析库文件
match-clients { external; };
recursion yes;
zone "test.com" IN {
type master;
file "external.test.com.zone";
};
};
? 各个View指令的应用是按先后顺序执行的,即是按首先符合的条件返回结果,例如本地请求首先符合第一View指令,则返回结果,不再检查其他的View;来自192.168.0.7的请求符合第二个View指令,则返回结果,不再检查后面的View;所以,如果要在该View的match-clients中设置任何条件(即any)的话,就必须将这个View摆在最后面,而绝不能放在其他View的前面。