推荐给好友 上一篇 | 下一篇

多网络出口下基于策略解析的DNS服务器

本文介绍如何通过架设基于策略解析的DNS服务器来解决CERNET和CHINANET以及网通电信之间的带宽瓶颈等问题,使网站可以被所有用户以最快的速度访问。

需求分析

从1969年美国国防部创建基于分组交换的ARPANET到现在基于TCP/IP的Internet,不到四十年的时间,我们的生活已经越来越离不开网络了。我国在80年代后期才开始发展网络,目前已有四大骨干网络,基本满足了使用网络的需求,但由于网络建设的阶段性,没有一个完全统一的网络,跨网络访问的速度还有待提高,因此很多单位就租用不同的线路来满足高速访问不同网络的需要。
众所周知,原中国电信集团按南北地域分家,成立了新的中国电信和网通集团,互联网的骨干网也被一分为二了,北有网通、南有中国电信。此后,网络访问就出现了一些问题,有些经常访问的网站速度就一下子慢了下来,有时候还有访问不上去需要多次刷新的情况出现。如笔者所在的北方地区访问服务器在网通机房的网站很快,而访问在南方电信的网站就很慢。据分析,产生这种问题的原因是中国电信分家之后,骨干网连接存在一定的问题,虽然信息产业部已经在做互联互通的计划并在实施中,但估计在相当长的一段时间内,南北网速差异的问题还会存在。
笔者所在的学校网络有两个出口,教育科研网千兆线路和网通百兆线路。通过采用双出口,校园网访问公网速度慢的问题得到了解决,但反过来公网访问校园网慢的问题却更加突出。学校服务器大多使用的是教育网的域名和IP地址,所有对校园网服务器的访问都要走CERNET链路,因此,尽管校园网拥有高速的公网链路,但公网用户却只能通过教育网链路才能访问到校园网的资源,这无疑是对公网出口链路的浪费。因此学校申请了教育网和公网的域名,教育网、公网用户分布使用教育网域名、公网域名访问我们的网站,速度会很快,但这依然存在问题,用户如何知道要这样来访问会达到最好的效果?
大致的解决方法有如下几种:
一、把网站首页做成提示页面,让用户选择使用哪个镜像,但这就要求用户清楚自己的网络属于哪种网络,否则用户无法做出选择。
二、程序自动判断用户IP之后跳转到相应页面,对用户来说是“透明”的,但细心的用户会发现,自己输入的网址自动切换成了其他的地址,对于普通用户来说,这也有点莫名其妙。
三、本文将重点介绍一种对用户来说完全“透明”的方法:基于策略解析的DNS服务器,针对用户的IP分布解析为教育网和公网的IP,用户根本不知道他们访问的服务器是不一样的。

解决思路

先了解一下DNS的作用。DNS是域名系统(Domain Name System)的缩写,它负责将域名解析为IP地址。IP地址是因特网上每个主机的唯一身份标识,与它们通信必须通过IP地址,但当我们与某台主机通信,比如浏览一个网站,我们不可能更不愿意去记忆32位长的二进制主机地址,即使是用点分十进制IP地址也不容易记忆,相反大家都能接受以名字的形式来访问。
早在ARPANET时代,因为当时网络上的计算机很少,因此使用一个记录所有主机名字和IP对应的文件hosts就可以解决问题,但随着网络发展到了Internet,hosts文件根本不可能去记录整个因特网上的主机名字与IP的对应关系了,这就需要DNS来解决了。因特网的域名系统DNS被设计成为一个联机分布式数据库系统,采用客户服务器方式,做这个工作的程序放在专门的DNS服务器上。当一个应用进程需要将主机名解析为IP地址时,如访问一个网站的时候,该应用进程成DNS的一个客户,将域名放在DNS请求报文中,以UDP数据报方式发给本地DNS服务器,本地DNS服务器查询之后将结果放在回答报文中返回,若本地DNS服务器无法回答该请求,则它将暂时作为上一级DNS服务器的客户,向上级DNS服务器发送查询请求,这种操作直至找到能够解析该域名的服务器为止。
目前国内的DNS域名解析主要由各大ISP构建的公用DNS服务器来负责解析。这些公用DNS服务器大都只能负责把申请的域名解析成一个IP地址,要么是网通的IP地址,要么是电信的IP地址。如果你的IP地址是电信的IP地址,那么处在电信网络的用户访问您的主机速度就比较快,处在网通网络的用户访问就非常慢了。于是我们可以在主机上设置电信网通的IP各一个,或者两台服务器各用一个地址,这样可以使两个网络的用户都可以快速访问你的主机了,但这有个前提是这些用户通过IP地址来访问,如果用域名访问,因为域名被解析成了网通或电信的IP,还是不行的,如何解决哪?从DNS上下手,如果DNS能根据用户的IP地址来解析成对应的IP,那样访问就没问题了,下面我们就在FreeBSD上架设一个基于策略解析的DNS服务器。

实战演练

首先,安装FreeBSD系统,目前版本是6.1Release,安装的方法可参看FreeBSD的Handbook,http://www.freebsd.org.cn/snap/doc/zh_CN.GB2312/books/handbook/,FreeBSD下安装软件推荐使用ports安装,在安装软件之前最好cvsup一下,跟服务器上保持一致,保证安装的是最新的软件。方法如下:
ee /etc/make.conf
内容为:
MASTER_SITE_OVERRIDE?= \
http://ports.hshh.org/${DIST_SUBDIR}/\
ftp://ftp.freebsd.org.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/\
ftp://ftp2.cn.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/\
ftp://ftp2.tsinghua.edu.cn/mirror/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ibm.tju.edu.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
这只是告诉系统安装软件的时候首先从这几个地址寻找需要的文件,当然在这个文件里面可以加入其他的优化选项,本文不做详述。
然后开始安装cvsup这个软件,服务器端一般我们都不会安装桌面的,都是字符界面,因此安装cvsup-without-gui。
cd /usr/ports/net/cvsup-without-gui
make install clean;
安装了cvsup之后就可以更新ports了,在命令行下输入以下命令:
cvsup -g -L 2 /usr/share/examples/cvsup/ports-supfile
关于如何使用cvsup,可参看Handbook的相关章节。

下面我们开始安装BIND (Berkeley Internet Name Domain),这是目前最为流行的 DNS 协议实现,关于bind的详细资料,可到其官方网站http://www.isc.org/查询。
cd /usr/ports/dns/bind9
make install clean
系统会下载最新的源文件,然后编译、安装,最后屏幕上会出现下图:
 
图1安装完成提示


大意如下:如果你使用FREEBSD 4.X,请浏览http://people.freebsd.org/~dougb/randomness.html得到更多的信息,如果是FREEBSD 5.X则不需要执行这一步,如果你想要bind 9运行在chroot环境,必须把/dev/random设备chroot,还要运行“rndc-confgen –a”来生成一个正确的配置文件――随机密钥。
默认情况下系统是以/usr/local为根目录的,所以BIND9的命令文件都放到/usr/local/sbin目录里面和/usr/local/bin目录里面。系统在安装完成bind 9后,会自动建立uid为53的“bind”用户和gid为53的“bind”群组,以供bind服务用。
cd /etc/namedb
chmod +x make-localhost
./make-localhost
会在/etc/namedb/master目录生成一个localhost.rev和localhost-v6.rev。
我们现在开始配置bind 9,根据提示,我们首先要生成一个密钥,/usr/local/sbin/rndc-confgen >/usr/local/etc/rndc.conf,打开rndc.conf,把# Use with the following in named.conf, adjusting the allow list as needed:
......
# End of named.conf
之间的内容,去掉注释#,添加到named.conf中。

key "rndc-key" {
      algorithm hmac-md5;
      secret "BNBjuQWLaaU45oVZLvatTA==";
};
controls {
      inet 127.0.0.1 port 953
              allow { 127.0.0.1; } keys { "rndc-key"; };
};
同时要把下面这些内容用/*  */注释掉:
zone "." {
        type hint;
        file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
        type master;
        file "master/localhost.rev";
};

// RFC 3152
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA" {
        type master;
        file "master/localhost-v6.rev";
};
为了让DNS服务器可以解析所有的域名,还需要在named.conf中做一个改动,把        forwarders {
                127.0.0.1;
        };
中的127.0.0.1换成上一级的dns服务器地址,这样的话,如果你访问的域名dns无法解析就会到这些地址里面去查询。
接下来就是本文的重头戏了,看看怎么来实现策略解析,把下面的内容,原封不动的添加到named.conf的最后。
acl "CERNET" {
166.111.0.0/16;
202.4.128.0/19;
202.112.64.0/18;
202.112.128.0/17;
………………
};

view "view_cernet" {
match-clients { CERNET; };
zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
allow-update { none; };
};

include "master/cernet.def";
};

view "view_any" {
match-clients { any; };
zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
};

include "master/other.def";
};
添加完这些内容以后,保存named.conf,我们先来测试一下看是否可以启动bind了。
cd /etc/namedb/master
touch cernet.def
touch other.def
/usr/local/sbin/named -gc /etc/namedb/named.conf
正常的情况下你会看到下面的信息:
11-Jul-2006 09:23:38.711 starting BIND 9.3.2 -gc /etc/namedb/named.conf
11-Jul-2006 09:23:38.735 loading configuration from '/etc/namedb/named.conf'
11-Jul-2006 09:23:38.744 listening on IPv4 interface lo0, 127.0.0.1#53
11-Jul-2006 09:23:38.820 running
只要有最后一行,那么你的配置就算是基本成功了。
按一下键盘的Ctrl+c,先把BIND 9停掉。
下面我们需要做的工作就是添加自己的域名了。
cd /etc/namedb/master
mkdir cernet
mkdir other
ee cernet.def
内容如下:
zone "yourdomain.edu.cn" {
type master;
file "master/cernet/yourdomain.edu.cn";
};

zone "yourdomain.cn" {
type master;
file "master/cernet/yourdomain.cn";
};

ee other.def
内容如下:
zone "yourdomain.edu.cn" {
type master;
file "master/other/yourdomain.edu.cn";
};

zone "yourdomain.cn" {
type master;
file "master/other/yourdomain.cn";
};

ee cernet/yourdomain.edu.cn
内容如下:
$ttl 86400
$ORIGIN yourdomain.edu.cn.
@ IN SOA dns.yourdomain.edu.cn. root.yourdomain.edu.cn. (
        20060711        ; Serial
                                3600    ; Refresh
                                900     ; Retry
                                604800  ; Expire
                                86400 )  ; Minimum

@   IN NS dns.yourdomain.edu.cn.

www.yourdomain.edu.cn.         IN      A       1.2.3.4

ee cernet/yourdomain.cn
内容如下:
$ttl 86400
$ORIGIN yourdomain.cn.
@ IN SOA dns.yourdomain.cn. root.yourdomain.cn. (
        20060711        ; Serial
                                3600    ; Refresh
                                900     ; Retry
                                604800  ; Expire
                                86400 )  ; Minimum

@   IN NS dns.yourdomain.cn.

www.yourdomain.cn.  IN A 1.2.3.4

ee other/yourdomain.edu.cn
内容如下:
$ttl 86400
$ORIGIN yourdomain.edu.cn.
@ IN SOA dns.yourdomain.edu.cn. root.yourdomain.edu.cn. (
        20060711        ; Serial
                                3600    ; Refresh
                                900     ; Retry
                                604800  ; Expire
                                86400 )  ; Minimum

@   IN NS dns.yourdomain.edu.cn.

www.yourdomain.edu.cn.  IN A 4.3.2.1

ee other/yourdomain.cn
内容如下:
$ttl 86400
$ORIGIN yourdomain.cn.
@ IN SOA dns.yourdomain.cn. root.yourdomain.cn. (
        20060711        ; Serial
                                3600    ; Refresh
                                900     ; Retry
                                604800  ; Expire
                                86400 )  ; Minimum

@   IN NS dns.yourdomain.cn.

www.yourdomain.cn. IN A 4.3.2.1

添加一个脚本,用于在系统启动的时候自动把DNS服务器启起来
mkdir -p /usr/local/etc/rc.d
ee /usr/local/etc/rc.d/named.sh
添加内容
#!/bin/sh
/usr/local/sbin/named -c /etc/namedb/named.conf &

chmod 777 /usr/local/etc/rc.d/named.sh
把服务器启起来
/usr/local/etc/rc.d/named.sh
OK,到此你的DNS服务器就算是跑起来了。下面我们开始测试,看是否如我们想像中的那样。
# nslookup
> server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
>www.yourdomain.edu.cn
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:  www.yourdomain.edu.cn
Address: 4.3.2.1
>www.yourdomain.cn
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:  www.yourdomain.cn
Address: 4.3.2.1
可以看出来,这个IP地址访问两个域名解析的地址都是我设定的4.3.2.1,而这个功能的实现就是靠我们在named.conf里面设置的acl和view。
现在DNS服务器已经设置好了,我们还需要把WWW服务器上做一下设置,如果您的WWW服务器本来就是两个,分别用的教育网和公网地址,内容完全一样,那么这一步可以省略,如果您和我这里一样也是双网卡,配置教育网和公网两个地址,那么你就需要设置一下系统的路由,把目的地址是教育网的地址都路由到教育网的网卡,默认的路由到公网网卡上,具体的命令根据操作系统的不同有些差别,本文就不再赘述,只是需要提醒各位读者注意的是服务器上面根据的教育网的地址段一定要和named.conf里面的acl一致,否则不一致的那些IP将无法访问您的服务器了,比如你给他返回的是公网的地址,那么他就从公网网卡来访问您的服务器,但服务器却针对他的IP要从教育网的网卡返回数据,这样他就访问不到了,这一点要注意,两个地方要同时更新。教育网的网段列表可以从教育科研网http://www.edu.cn/获取。
本文到此就已经将如何实现基于策略解析的DNS服务器的架设方法介绍完了,下面简单说一下常见的貌似策略域名解析的域名解析方式。
首先是多个域名对应一个IP地址:这种情况一般用于实现虚拟主机。只用一个IP地址就可以实现多个拥有不同域名的站点,这对那种IP地址资源短缺但又想拥有多个站点的情形非常有用。
其次是一个域名对应多个IP地址:在域名服务的配置里有一种实现服务器负载均衡的方法,DNS配置文件中一般会有类似下面的内容:
www.youdomain.edu.cnIN  A  1.2.3.1
www.youdomain.edu.cnIN  A  1.2.3.2
  ……
www.youdomain.edu.cnIN  A 1.2.3.N
这种方法适用多台内容相同的服务器分流。在这种查询方式中,DNS服务器是以轮循的方式回应请求的,即对第一个请求回应的是地址1.2.3.1,下一个请求回应地址就是1.2.3.2,依此类推。
尽管上面两种方式可以将一个域名解析成几个不同的IP地址,或将多个不同的域名解析成一个IP地址,但它们仍然不能算作策略域名解析。这是因为,我们做的策略域名解析与上面的两种方式相比要智能得多,它是基于策略的,根据客户端所在网络的不同 ,返回不同的解析结果;
本文只是以简单的例子来演示了如何架设一台基于策略解析的DNS服务器,DNS服务器的其他设置读者如果感兴趣,可参看相关书籍或网络上的文章,限于篇幅,本文不再涉及。



TAG: DNS 服务器 网络 网通 中国电信
 

评分:0

我来说两句

seccode