[转]利用View特性来设置域名的多匹配查询

NS服务器最基本的任务就是响应域名的查询,返回该域名的地址数据.在DNS服务器中将一个
域名分成内部与外部做不同的View解析,可以提升安全性,以及分类应付不同区域的查询请求.

例如您的单位需要分成内部网和外部网,希望将同一个域名解析为不同的IP地址,以提高安全
防护的目的,或者应付不同业务的应用;又比如您需要将业务按地域来划分,打算在各个地区
分别设置各自的主机来处理访问请求(或者单机双线也适用),以图解决中国南北网(电信/网通)
互不相通所导致的速度差异之问题,希望将电信用户解释到由电信网络所提供的IP地址上,而
网通用户则解释到由网通网络所提供的IP地址上;

要实现将来自不同地域(用IP段来标识)的请求,自动引导到不同区域的主机,可以采用域名的
多解释方法来简单实现.在BIND9中有个新的view指令可以完成达到这个目的,方法就是设置
多个view段落来响应同一个域名的查询请求.只需要在每个view段落的match-clients项目中,
设置所需匹配的客户端IP段落,并且在每个段落中都设置该域名的区域数据,但不同的view则
指向不同的区域文件,然后在各自的区域文件中分别设置相应的区域内容,这样就可以达到按
请求者的IP段落来分别响应得出不同的查询结果了.

针对访问者不同的IP段,来解释主机域名的相应的IP地址,也可以轻易实现负载均衡或者化解
地区局限.举个例子来说,目前国内的网络因为种种原因,同外部网络的联机经常出现不稳定
的状况,造成从大陆内部无法访问外部,而外部也无法访问内部,尤其是导致电邮收发异常缓慢
甚至丢失反弹,非常令人头疼.而且很多时候造成这种不稳定的因素,还常常是源自于国家级
主干网络的非技术性故障,这就很难从主机供应商方面寻求解决问题的方案.如果要彻底解决
这个问题的话,那幺一个可能的方案就是按地域来划分业务.例如,分别在不同地区设置一台
主机(假设在北京设置一台主机,在广州设置一台主机,在香港设置另一台主机),然后就可设法
将大陆内部北方的客户引导到北京(网通)的主机,将南方的客户引导到广州(电信)的主机,而
将海外的客户则引导到香港的主机.

BIND 9 DNS Views的配置示例

操作系统:Debian 4.1;
BIND版本:BIND 9.3.4;
DNS服务器:192.168.0.8;
内部IP段:192.168.0.0/24;
外部IP段:除192.168.0.0/24之外的所有IP;
解释域名:mytest.com;
希望内部IP和本机IP(192.168.0.8)所解析到www.mytest.com的IP地址为1.1.1.1;
希望外部IP段(192.168.0.7和192.168.0.17)则解析到2.2.2.2;
希望其他IP段(我的测试IP是192.168.0.2)则解释到3.3.3.3;

vi /etc/bind/named.conf;

 include“/etc/bind/named.conf.options”;
 view“internal”{
     match-clients { localhost;192.168.0.8;};
     match-destinations { any;};
     recursion yes;
     allow-query { localhost;192.168.0.0/24;};
     allow-transfer { 192.168.0.7;};
     include“/etc/bind/named.internal.zones”;
     include“/etc/bind/named.conf.local”;
 };
 
 view“external”{
     match-clients { 192.168.0.7;192.168.0.17;};
     match-destinations { any;};
     recursion yes;
     allow-query { any;};
     allow-transfer { 192.168.0.7;};
     include“/etc/bind/named.external.zones”;
     include“/etc/bind/named.conf.local”;
 };
 
 view“others”{
     match-clients { any;};
     match-destinations { any;};
     recursion yes;
     allow-query { any;};
     allow-transfer { 192.168.0.7;};
     include“/etc/bind/named.others.zones”;
     include“/etc/bind/named.conf.local”;
 };

Tips 1:各个View指令的应用是按先后顺序执行的,即是按首先符合的条件返回结果,例如本地
请求首先符合第一View指令,则返回结果,不再检查其他的View;来自192.168.0.7的请求符合
第二个View指令,则返回结果,不再检查后面的View;所以,如果要在该View的match-clients
中设置任何条件(即any)的话,就必须将这个View摆在最后面,而绝不能放在其他View的前面.

vi /etc/bind/named.internal.zones;

zone“.”{
   type hint;
   file“/etc/bind/db.root”;
};

zone“localhost”{
    type master;
    file“/etc/bind/db.local”;
};

zone“127.in-addr.arpa”{
   type master;
   file“/etc/bind/db.127”;
};

zone“0.in-addr.arpa”{
    type master;
    file“/etc/bind/db.0”;
};

zone“255.in-addr.arpa”{
    type master;
    file“/etc/bind/db.255”;
};

zone“mytest.com”IN {
    type master;
    file“/etc/bind/mytest.com.internal”;
};

vi /etc/bind/named.external.zones;

zone“.”{
    type hint;
    file“/etc/bind/db.root”;
};

zone“localhost”{
    type master;
    file“/etc/bind/db.local”;
};

zone“127.in-addr.arpa”{
    type master;
    file“/etc/bind/db.127”;
};

zone“0.in-addr.arpa”{
    type master;
    file“/etc/bind/db.0”;
};

zone“255.in-addr.arpa”{
    type master;
    file“/etc/bind/db.255”;
};

zone“mytest.com”IN {
    type master;
    file“/etc/bind/mytest.com.external”;
};

vi /etc/bind/named.others.zones;

zone“.”{
    type hint;
    file“/etc/bind/db.root”;
};

zone“localhost”{
    type master;
    file“/etc/bind/db.local”;
};

zone“127.in-addr.arpa”{
    type master;
    file“/etc/bind/db.127”;
};

zone“0.in-addr.arpa”{
    type master;
    file“/etc/bind/db.0”;
};

zone“255.in-addr.arpa”{
    type master;
    file“/etc/bind/db.255”;
};

zone“mytest.com”IN {
    type master;
    file“/etc/bind/mytest.com.others”;
};

vi /etc/bind/mytest.com.internal;

 $TTL 4320;1 hour 12 minutes
 @ IN SOA ns.mytest.com.root.ns.mytest.com.(
 2007101701;
 3600;
 1800;
 36000;
 3600);
 IN NS ns.mytest.com.
 ns IN A 192.168.0.8
 www IN A 1.1.1.1

vi /etc/bind/mytest.com.external;

 $TTL 4320;1 hour 12 minutes
 @ IN SOA ns.mytest.com.root.ns.mytest.com.(
 2007101701;
 3600;
 1800;
 36000;
 3600);
 IN NS ns.mytest.com.
 ns IN A 192.168.0.8
 www IN A 2.2.2.2

vi /etc/bind/mytest.com.others;

 $TTL 4320;1 hour 12 minutes
 @ IN SOA ns.mytest.com.root.ns.mytest.com.(
 2007101701;
 3600;
 1800;
 36000;
 3600);
 IN NS ns.mytest.com.
 ns IN A 192.168.0.8
 www IN A 3.3.3.3

设置好后重启BIND服务:/etc/init.d/bind9 restart;

如果一切设置正常的话,现在DNS服务器应该能分别针对不同IP地址的请求,来返回不同的主机
解释了,这里测试从192.168.0.2,192.168.0.7和192.168.0.8(本机)查询结果是:

从192.168.0.2查询(dig @191.168.0.2 www.mytest.com;)则返回3.3.3.3;
从192.168.0.7查询(dig @191.168.0.7 www.mytest.com;)则返回2.2.2.2;
从192.168.0.8查询(dig @191.168.0.8 www.mytest.com;)则返回1.1.1.1;

请注意:view指令是BIND 9的新功能,BIND 8以前的版本无此功能;

假设我的域名现在需要针对来自四个不同区域的DNS查询,分别返回不同的主机IP地址,我计划
把DNS的配置文件分为如下四个View段落:

  1. 本机内网internal
  2. 中国网通chinanetcom
  3. 中国电信chinatelecom
  4. 其他网络others

因为我没有可用的注册域名,所以首先要在免费的DNS注册机构申请一个子域名.很快就找到了
一个可以提供免费DNS注册的机构:freedns.afraid.org,这个网站所提供的注册服务比较多,
包括了免费的NS记录(其他大部分免费注册机构都不提供NS记录的注册).
因为我的测试主机是用拨号上网的,IP是动态地址,所以下面的注册数据只是临时测试使用的.
在本次测试中,我先注册了一个A记录(ns-hung.mooo.com),并将这个A记录指向我的拨号上网的
主机IP(210.209.111.254);然后再注册一个用来委派子域的NS记录,我将这个测试用的子域
命名为hung.mooo.com,顾名思义,注册子域名的NS记录,当然需要指定一个NS(名称服务器)地址,
而且NS地址不能用动态IP地址,所以就用前面刚刚注册的A记录作为本子域的NS服务器地址.
注册数据是立即生效的(效率不错),看看注册结果:

dig ns-hung.mooo.com @ns1.afraid.org;#这是A记录(省略部分内容);

 ;;QUESTION SECTION:
 ;ns-hung.mooo.com.IN A
 ;;ANSWER SECTION:
 ns-hung.mooo.com.3600 IN A 210.209.111.254

dig hung.mooo.com NS @ns1.afraid.org;#这是NS记录(省略部分内容);

;;QUESTION SECTION:
 ;hung.mooo.com.IN NS
 ;;AUTHORITY SECTION:
 hung.mooo.com.3600 IN NS ns-hung.mooo.com.
 ;;ADDITIONAL SECTION:
 ns-hung.mooo.com.3600 IN A 210.209.111.254

【寻找测试IP】

注册好子域的NS记录之后,这个子域就被委派到我的拨号上网主机(即ns-hung.mooo.com),我用
免费的Vmware Server开设了一台Linux机器,安装的是Debian4.1版本,并且使用了预设的BIND9
来设置DNS服务器.
但是,在主机上开始设置新子域(hung.mooo.com)之前,还需要预先准备一些必不可少的数据,
也就是需要先寻找一些可用的IP段落,用于在DNS的View中设置查询的匹配条件.而且当配置
完成之后还需要进行分布式的实验测试,但是因为环境条件所限制,我不可能操纵每个地区的
主机来真实地查询测试一遍,因此还必须利用DNS服务器的分布式特点来完成测试任务.
众所周知,DNS服务器能够完成递归查询任务,也就是替代客户完成查询结果.事实上,目前
绝大部分的ISP机构所提供的公用DNS服务器,都是缓存服务器,也就是它们自己本身没有区域
数据,只在客户提出某个域名的查询要求的时候,才会即时从该域名的逐级注册数据中,获得
最终拥有这个域名记录的Master或Slave的主机地址,然后再将获得的记录缓存起来以供客户
下次查询.
当使用命令dig和nslookup来查询域名的时候,都可以手工指定某个DNS服务器作为查询对象.
因此,只要针对IP段落来寻找该段落中公用的DNS服务器,然后再指定用此服务器来进行查询,
那幺就可以得出测试结果了.
如前所述,这台DNS服务器需要分为四个View段落,每个段落分别处理不同的IP段落范围的查询
要求.为了方便后面进行测试,这里先选择几个公用的DNS服务器,然后再通过在线工具查找出
这几个DNS服务器的IP所属的段落.我在网络上搜寻,分别挑选了几个DNS服务器,ping出它们
的IP地址,然后再分别用在线的IP查询工具找出它们所属的网段区域和网络公司.这些IP及其
所查找到的位置数据如下:

  • 这是属于网通网络的DNS服务器,将会用于DNS的View中的chinanetcom匹配条件:
    ns.163.net 202.108.255.201 202.108.0.0/16网通北京
    ns1.ehttp.com.cn 218.57.8.171 218.56.0.0/14网通山东
    fjxm.cncnet.net 218.104.128.70 218.104.128.0/20网通福建
  • 这是属于电信网络的DNS服务器,将会用于DNS的View中的chinatelecom匹配条件:
    dns2.cs.hn.cn 202.103.96.112 202.103.96.0/23电信长沙
    ns.chinanet.cn.net 202.97.7.6 202.97.0.0/19电信四川
    dns3.xj163.cn 61.128.99.133 61.128.96.0/19电信新疆
  • 海外网络的DNS服务器,因为DNS的View中的others匹配any条件,所以这些DNS只需测试时使用:
    ns3.netvigator.com 218.102.23.228 218.102.0.0/15 NETVIGATOR香港

为了更准确定位,还可以使用了一些网上所提供的在线IP定位工具,来查找上述IP的地区分布
信息.但是,考虑到在线工具的数据库未必完全准确,这里所提供的IP地址数据仅能供临时的
测试用途,读者如果需要在实际应用中使用,建议参考更权威更可靠的数据源.如下是我用
来在线查找和定位IP地址的工具:

http://www.ip2location.com/free.asp

http://www.linkwan.com/gb/broadmeter/VisitorInfo/QureyIP.asp

根据上述查找出来的结果,现在可以定出DNS的各个View段落中所对应的IP范围了.另外还要
请留意的是,这里只为测试目的而列举部分IP段落,当然在现实环境中实际应用的IP段落远远
不止这几个段落.这里的测试段落定义如下所示:

  • 本机内网(internal){ localhost;192.168.0.0/24;};
  • 中国网通(chinanetcom){ 202.108.0.0/16;218.56.0.0/14;218.104.128.0/20;};
  • 中国电信(chinatelecom){ 202.103.96.0/23;202.97.0.0/19;61.128.96.0/19;};
  • 其他网络(others){ any;};

定义好IP段落参数后,就可以开始设置BIND的配置文件了,为了简化配置文档,我将原文档中的
默认的根域设置,全部放置在前面的公共部分,这样就无需象以前的例子中那样,要在每一个,
View段落中放置根域的定义了,因此这里只要定义一次根域就可以了.同样道理,关于BIND的
所有的options段落也放置在公共部分,例如相关的allow-query和allow-transfer的设置,请
参考之前的范例,这里不再赘述.
如下是我的named.conf配置文档的View段落的内容,请参考:

cat /etc/bind/named.conf;#这是BIND的配置文件(省略了部分内容);

…
 view“internal”{
     match-clients { localhost;192.168.0.0/24;};
     zone“hung.mooo.com”IN {
         type master;
         file“/etc/bind/db.hung.mooo.com.internal”;
     };
 };
 
 view“chinanetcom”{
     match-clients { 202.108.0.0/16;218.56.0.0/14;218.104.128.0/20;};
     zone“hung.mooo.com”IN {
         type master;
         file“/etc/bind/db.hung.mooo.com.chinanetcom”;
     };
 };
 
 view“chinatelecom”{
     match-clients { 202.103.96.0/23;202.97.0.0/19;61.128.96.0/19;};
     zone“hung.mooo.com”IN {
         type master;
         file“/etc/bind/db.hung.mooo.com.chinatelecom”;
     };
 };
 
 view“others”{
     match-clients { any;};
     zone“hung.mooo.com”IN {
         type master;
         file“/etc/bind/db.hung.mooo.com.others”;
     };
 };

设置好DNS的配置文件后,接着就要建立子域的区域文件了.从配置文件中可以看出,这个子域
需要分别建立四个区域文件,以提供四种匹配情况.这里因为测试目的,只在该子域下面添加了
一项A记录,域名为www.hung.mooo.com.为了方便观察测试结果,我假设它匹配的四个View段落
的IP分别如下:

从本机内网(internal)查询返回IP : 1.1.1.1
从中国网通(chinanetcom)查询返回IP: 2.2.2.2
从中国电信(chinatelecom)查询返回IP: 3.3.3.3
从其他网络(others)查询返回IP: 4.4.4.4

各个区域文件的内容请分别参考如下:

cat /etc/bind/db.hung.mooo.com.internal;#这是用于内网的区域文档;

 $TTL 4320;1 hour 12 minutes
 @ IN SOA ns-hung.mooo.com.root.ns-hung.mooo.com.(
 2007102001;
 3600;
 1800;
 36000;
 600);
 IN NS ns-hung.mooo.com.
 www.hung.mooo.com.IN A 1.1.1.1

cat /etc/bind/db.hung.mooo.com.chinanetcom;#这是用于网通的区域文档;

 $TTL 4320;1 hour 12 minutes
 @ IN SOA ns-hung.mooo.com.root.ns-hung.mooo.com.(
 2007102001;
 3600;
 1800;
 36000;
 600);
 IN NS ns-hung.mooo.com.
 www.hung.mooo.com.IN A 2.2.2.2

cat /etc/bind/db.hung.mooo.com.chinatelecom;#这是用于电信的区域文档;

$TTL 4320;1 hour 12 minutes
 @ IN SOA ns-hung.mooo.com.root.ns-hung.mooo.com.(
 2007102001;
 3600;
 1800;
 36000;
 600);
 IN NS ns-hung.mooo.com.
 www.hung.mooo.com.IN A 3.3.3.3

cat /etc/bind/db.hung.mooo.com.others;#这是用于海外的区域文档;

 $TTL 4320;1 hour 12 minutes
 @ IN SOA ns-hung.mooo.com.root.ns-hung.mooo.com.(
 2007102001;
 3600;
 1800;
 36000;
 600);
 IN NS ns-hung.mooo.com.
 www.hung.mooo.com.IN A 4.4.4.4

测试结果
设置好后,请重新启动BIND9: /etc/init.d/bind9 restart;
然后用dig命令测试结果,这里的dig命令要带上@dns-server参数,用于指定从某台DNS服务器
查询,也就是是分别用前面所查找到的DNS服务器来做测试.下面列出的是我进行测试的部分
结果,为了简化版面,有些测试结果省略了返回信息中的部分内容.测试结果请参考如下:

dig www.hung.mooo.com @ns-hung.mooo.com;#这是从本地查询的结果;

;<<>> DiG 9.3.4 <<>> www.hung.mooo.com @ns-hung.mooo.com
 ;(1 server found)
 ;;global options: printcmd
 ;;Got answer:
 ;;->>HEADER<<- opcode: QUERY,status: NOERROR,id: 22887
 ;;flags: qr aa rd ra;QUERY: 1,ANSWER: 1,AUTHORITY: 1,ADDITIONAL: 0
 ;;QUESTION SECTION:
 ;www.hung.mooo.com.IN A
 ;;ANSWER SECTION:
 www.hung.mooo.com.4320 IN A 1.1.1.1
 ;;AUTHORITY SECTION:
 hung.mooo.com.4320 IN NS ns-hung.mooo.com.
 ;;Query time: 6 msec
 ;;SERVER: 59.188.240.117#53(59.188.240.117)
 ;;WHEN: Mon Oct 22 18:33:00 2007
 ;;MSG SIZE rcvd: 73

dig www.hung.mooo.com @202.108.255.201;#这是从网通来查询的结果(省略部分内容);

…
 ;;ANSWER SECTION:
 www.hung.mooo.com.4203 IN A 2.2.2.2
 ;;AUTHORITY SECTION:
 hung.mooo.com.4203 IN NS ns-hung.mooo.com.
 …

dig www.hung.mooo.com @202.97.7.6;#这是从电信网络来查询的结果(省略部分内容);

…
 ;;ANSWER SECTION:
 www.hung.mooo.com.4090 IN A 3.3.3.3
 ;;AUTHORITY SECTION:
 hung.mooo.com.4090 IN NS ns-hung.mooo.com.
 …

dig www.hung.mooo.com @ns3.netvigator.com;#这是从香港的netvigator的查询结果;

…
 ;;ANSWER SECTION:
 www.hung.mooo.com.481 IN A 4.4.4.4
 ;;AUTHORITY SECTION:
 hung.mooo.com.546 IN NS ns-hung.mooo.com.
 …

[转]利用View特性来设置域名的多匹配查询》上有2条评论

  1. Pingback引用通告: Bind中的view语句定义和用法 | 精彩每一天

  2. Pingback引用通告: Bind中的zone语句的定义和用法 | 精彩每一天

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>