摘要:现在许多高校都已接入CERNET,但通过CERNET线路访问教育网以外的资源速度不理想,许多高校纷纷接入另一线路以达到理想的访问速度。为了更好地利用线路资源,节约线路费用,并加快校外用户访问校内服务器的速度,本论文介绍了两种方法,均是在Linux操作系统下基于Bind技术实现的分源地址解析实现的。
关键词:分源解析;BIND9;IPTABLES
中图分类号:TP393.01文献标识码:A文章编号:1673-4513(2005)-04-087-05
一、DNS的概念
DNS是Domain
Name System的缩写,即域名系统。在一个TCP/IP
架构的网络(例如Internet)环境中,DNS
是一个非常重要而且常用的系统。主要的功能就是将人们容易记忆的域名与人不容易记忆的IP地址做转换。运行DNS软件的这台主机(服务器)就称作DNS服务器。通常我们使用最多的是DNS的正向查找,即将域名转换成IP地址,然后再使用所查到的IP去访问目标服务器。将IP地址转换成域名的功能称作反向查找,反向查找也会被经常用到。
二、DNS的体系结构
Internet上的DNS名字服务为一种分布式的体系,由分布在Internet各地的DNS服务器上的named守护进程为整个Internet提供本域内计算机的名字解析服务。DNS域名结构为分级方式,例如www.bcu.edu.cn中最后面的cn为顶级域名,由后向前分别划分为不同级别的域。Internet上的顶级域名有两种,一种象cn这样的国别代码,另一种是如同edu、org、net、com等分类代码。国别顶级域下的次级域名同样可以按照地域或组织结构来分类划分。
要进行名字解析,就需要从域名的后面向前,一级级查找这个域名。因此Internet上就有一些DNS服务器为Internet的顶级域提供解析任务,这些DNS服务器称为根DNS服务器。知道了根DNS服务器的地址,就能按级查找任何具有DNS域名的主机名字,BIND代码中(文件named.ca)就包括了这些根DNS服务器的地址。
名字服务使用zone的概念来表示一个域内的主机,然而zone与域也有所区别,zone只是域的一部分,而不是整个域。因为zone中不包括域下的子域。例如域名www.bcu.edu.cn域为bcu.edu.cn,这是一个独立的zone。这个域下可由子域组成,例如xxxb.bcu.edu.cn。子域也是一个独立的zone,并不包括在bcu.edu.cn这个zone之内。
前面在DNS概念中提到,除了从名字查找主机的IP地址这种正向的查找方式之外,另外还有从IP地址反查主机域名的解析方式。很多情况下网络中使用这种反向解析来确定主机的身份,因此也很重要。查找名字的反向解析是从前面的网络地址向后面的节点地址,逐级查找,因此zone是IP地址的前面部分。然而由于一个主机的域名可以任意设置,并不一定与IP地址相关,因此正向查找和反向查找是两个不同的查找过程,需要配置不同的zone。
三、分源地址智能解析
分源地址智能解析的核心思想是让DNS服务器根据客户端所在位置,即IP地址所属区域,返回不同的解析结果给客户端。使用分源地址智能解析的好处在于以下两个方面。
1. 能够按照网络路径最优最短原则分配接受请求服务器
在CDN(Content
Delivery Network,内容分发网络)中,GAC(Gloable
Access Controller,智能访问控制系统)是ChinaCache CDN中的关键子系统,负责对所有使用服务用户的域名进行解析,决定了最终用户的实际访问地址。GAC除了具备普通DNS
解析功能以外,还具有全球动态智能解析功能。在收到用户的访问解析请求后,会首先对各个节点按照设定的策略进行检查,然后根据检查的情况把当时一个最合适的节点地址返回给用户,从而实现动态智能解析功能,使用户能从最优、最近的节点得到响应。
采用了GAC以后的解析过程如图1所示。
图1利用DNS智能解析来优化CDN的6个步骤
2. 实现多线路接入网络环境下的路由最优化
图2是北京城市学院校园网的拓扑图示意图,我们可以看到三根接入的线路,有一根接入到了教育网、两根接入了中国公众信息网,这也是普通大学Internet出口线路最常见的一种网络环境了。由于教育网和中国公众互联网存在一定的互联瓶颈,所以从中国公众互联网访问教育网时,速度往往比较慢,从教育网访问中国公众互联网时,速度也比较慢。这样的结果就是,大部分使用中国公众互联网的用户访问域名注册在教育网的大学网站时,速度比较慢。而且最关键的是,教育网注册的域名(以edu.cn结尾)只能由教育网的DNS来负责解析,如果按照未实现分源地址智能解析之前的域名解析方法来处理,我们就只能将域名解析到中国公众互联网的地址或者是教育网的地址,不能实现针对访问者(源地址)的地址来动态最优化的分配策略。
图2北京城市学院网络拓扑图
通过分源地址智能解析技术,避开传统的DNS动态轮询,采用根据用户源IP智能解析最佳服务IP的方法,实现DNS智能解析,我们就能够在多条接入线路的基础上,轻松实现不同访问源、不同的服务器访问地址。下表以www.bcu.edu.cn为例,DNS解析结果如表所示:
表1:分源地址智能解析示例
访问者所在网络(源地址)
DNS解析结果
中国公众互联网
218.249.84.3
教育网
211.68.97.3
四、实现方法
1.利用BIND9进行配置
在BIND9的配置文件中通过VIEW和ACL协同工作实现根据用户源IP智能解析对应的服务器IP。如www.bcu.edu.cn在bcu.edu.cn.zone记录文件中有记录指向211.68.97.3(CERNET网段),在bcu.edu.cn.zone.chinanet记录文件中有记录指向218.249.84.3(CHINANET网段)。当用户处于CERNET网段访问www.bcu.edu.cn时,则会智能解析到211.68.97.3,处于其它网段的用户则会智能解析到218.249.84.3,实现了DNS的智能解析功能。
示例文件:教育网dns解析zone文件bcu.edu.cn.zone
$TTL 86400
@ IN
SOA dns1.bcu.edu.cn. root.localhost (
8 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire
86400 ; ttl
)
IN
NS dns1.bcu.edu.cn.
dns1 IN
A 211.68.97.1
@ IN
A 211.68.97.1
示例文件:named.conf文件
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey;
};
};
include "/etc/rndc.key";
options {
directory "/var/named/";
};
view "cernet" {
match-clients {
//Last update: 20050617
//region=BJ
162.105/16; 166.111/16; 202.4.128/19;
202.112.64/18; 202.112.128/17; 202.113/16; 202.204/14;
210.31/16; 211.68/16; 211.71/16;
211.81/16; 211.82/16; 219.242/16; 219.243.0/17;
219.243.128/18;
219.224.0/17; 219.224.128/18; 219.225/16; 219.226/16;
222.28/14;
222.199/16; 59.64/14;
//region=XA
202.117/16; 202.200/15;
......
};
zone "." {
view "chinanet" {
match-clients {any;};
zone "." {
type hint;
file "named.ca";
};
示例文件:公众网dns解析zone文件
bcu.edu.cn.zone.chinanet
$TTL 86400
@ IN
SOA dns1.bcu.edu.cn. root.localhost (
8 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire
86400 ; ttl
)
IN
NS dns1.bcu.edu.cn.
dns1 IN
A 211.68.97.1
@ IN
A 211.68.97.1
type hint;
file "named.ca";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "0.0.127.in-addr.arpa.zone";
};
zone "97.68.211.in-addr.arpa" {
type master;
file "97.68.211.in-addr.arpa.zone";
};
zone "localhost" {
type master;
file "localhost.zone";
};
zone "bcu.edu.cn" {
type master;
file "bcu.edu.cn.zone";
};
};
one "bcu.edu.cn" {
type master;
file "bcu.edu.cn.zone.chinanet";
};
};
2.利用Iptables+bind配置
配置分源地址智能解析DNS的核心思想是:在DNS服务器上运行多个BIND,每个BIND为来自不同区域的用户提供解析,因此每个BIND都应具有不同的配置文件和域文件,并且分别监听在不同的端口。在接到客户端DNS请求时,根据客户的ip地址将请求重定向不同的BIND服务端口。
BIND响应时,再改写相应包的服务端口为标准的53端口,这样就可以根据客户端的ip地址将不同的解析结果返回给客户端。整个过程对于客户端来说都是透明的。实现的关键在于运行不同的BIND及运用iptables进行ip地址及端口改写操作。
缺省地,BIND服务监听在53端口,我们可以通过配置让BIND运行在不同的ip及端口上。实现这一点并不复杂,假设我们的DNS服务器的ip地址是211.163.76.1,并且我们想区分CERNET及非CERNET的客户,这时我们必须运行两个BIND,使用不同的配置文件。可以在使用非标准监听端口的BIND的配置文件中用listen-on指定BIND监听的端口,比如:
Options {
listen-on port 54 {211.68.97.1;}
directory "/var/named_cernet";
};
可以用named的-c选项指定named读入不同的配置文件,比如:
/usr/sbin/named -u named -c /etc/named_cernet.conf
假设监听在标准端口的BIND服务器为非CERNET客户提供DNS解析,监听在54端口的BIND服务器为CERNET服务器提供DNS解析,我们可以建立如下的规则脚本:
#!/bin/bash
#打开端口转发
echo 1 > /proc/sys/net/ipv4/ip_forward
#加载相关的内核模块
/sbin/modprobe iptable_filter
/sbin/modprobe ip_tables
/sbin/modprobe iptables_nat
#刷新所有规则
/sbin/iptables -t nat -F
#加入来自CERNET的DNS请求转发规则,将其转发到本地54端口,
#CERNET地址列表可从www.nic.edu.cn/RS/ipstat/获得
/sbin/iptables -t nat -A PREROUTING -p udp -s 163.105.0.0/16
--dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 163.105.0.0/16
--dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p udp -s 166.111.0.0/16
--dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 166.111.0.0/16
--dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p udp -s 202.4.128.0/19
--dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 202.4.128.0/19
--dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p udp -s 202.112.0.0/15
--dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 202.112.0.0/15
--dport 53 -i eth0 -j REDIRECT 54
…
#将返回给CERNET
DNS客户数据包的源端口(54端口)伪装成53端口
/sbin/iptables -t nat -A POSTROUTING -p udp
--sport 54 -o eth0 -j SNAT --to
211.163.76.1:53
/sbin/iptables -t nat -A POSTROUTING -p tcp
--sport 54 -o eth0 -j SNAT --to
211.163.76.1:53
用来进行DNS查询的一个非常有用的工具是nslookup,可以使用它来查询DNS中的各种数据。除了可以在命令行下直接进行基本的DNS查询之外,直接启动nslookup将进入一个交互模式,这里能查询各种类型的DNS数据。