智能DNS又称为解析切割,是对请求DNS解析的IP地址进行判断,将域名解析成不同的地址。一般智能DNS应用常见的场景就是CDN,中国特色社会主义的网络导致了电信和联通这2个特色的运营商,而这2个运营商通过在北京某机房的100G带宽相连,这就导致了电信用户访问联通的网络就会非常慢。玩游戏的童鞋就知道用游戏加速器来解决问题,但一般的用户访问在不同运营商网络的服务器时,变得非常慢。于是苦逼的服务提供商为了更好的用户体验就不得不去花费一笔钱去买CDN服务了……
CDN的原理就是在智能DNS基础上进行web的反向代理缓存实现的。通过不同地域的请求解析到对应地域的缓存服务器上,然后缓存服务器对主服务器进行数据请求,最终返回给客户。这对于静态页面的网站有着很好的加速。
这里就不得不提一下著名的提供智能DNS解析服务的DNSpod(目前已被腾讯收购,软件源代码已经开源,宣称非BIND可以比拟,有兴趣的童鞋可以去研究研究)。还有比较著名的CDN服务提供商有帝盟等。。。
还会一种会使用到智能DNS的场景:在公司内部NS服务器上区分内部和外部的请求,将内部请求解析到内网地址上,外网请求解析到外网地址上,此篇博文针对此应用展开,BIND实现智能DNS的原理是通过view的方式,首先判断客户请求的来源,然后返回不同的IP。
规划:为lustlost.com域进行智能解析
分2个网段:192.168.92.0/24网段的请求解析到192.168.92.102主机上,其它网段的请求解析到172.19.19.102主机上,这里的172.19.19.102模拟外网。
这和一般公司的模式很接近,为公司内部提供内部私网地址的解析,避免路由器性能浪费。为外部提供公网地址的解析。
ns服务器的IP地址为192.168.92.102和172.19.19.102
[root@lustlost ~]# yum -y install bind bind-chroot #安装bind和bind-chroot
named.conf给我们在相应目录下提供了配置文件,根区域和本地区域的数据文件,而且它的主配置是默认以view方式配置的
[root@lustlost etc]# cp -a /var/named/chroot/etc/named.conf{,.bak} #用cp备份原配置文件
[root@lustlost etc]# vim /etc/named.conf
#首先定义控制列表,这里定义了内网的网段
acl innet {
127.0.0.0/8;
192.168.92.0/24;
};
#全局配置,精简一点,只配置数据文件目录位置
options {
directory “/var/named”;
};
#创建内网用户的view
view in {
match-clients { innet; }; #定义用户为控制列表中所定义的
recursion yes; #允许内网用户进行递归查询
#下面是定义根区域和本地区域的正反解析
zone “.” IN {
type hint;
file “named.ca”;
}
zone “localhost” IN {
type master;
file “localhost.zone”;
}
zone “0.0.127.in-addr.arpa” IN {
type master;
file “named.local”;
}
#定义内部网络用户解析
zone “lustlost.com” IN {
type master;
file “lustlost.com.in”;
allow-transfer { none; }; #不允许区域传送
allow-update { none; }; #不允许更新
}
};
#定义外部网络用户解析
view out {
match-clients { any; }; #允许所有用户(这里之所以允许所有用户,是因为bind对配置文件是从上往下读取解析的,匹配不到上面view所定义的acl,才会到这个view中来)
recursion no; #不允许外部网络用户进行递归查询(我们不是免费的公共dns)
zone “lustlost.com” IN {
type master;
file “lustlost.com.out”;
allow-transfer { none; };
allow-update { none; };
}
};
[root@lustlost etc]# named-checkconf #配置完成后注意检查配置文件的语法错误
至此就配置好了主配置文件,接下来创建区域数据文件
[root@lustlost etc]# cd /var/named/
[root@lustlost named]# vim lustlost.com.in #创建内部网络客户解析区域文件
#这里就随便建立几个记录了
$TTL 600
$ORIGIN lustlost.com
@ IN SOA ns.lustlost.com. admin.lustlost.com. (
2012070801
1H
10M
1W
1D
)
IN NS ns
IN MX 10 mail
ns IN A 192.168.92.102
mail IN A 192.168.92.100
www IN A 192.168.92.101
[root@lustlost named]# cp lustlost.com.in lustlost.com.out #创建外部网络客户解析区域文件
$TTL 600
$ORIGIN lustlost.com
@ IN SOA ns.lustlost.com. admin.lustlost.com. (
2012070801
1H
10M
1W
1D
)
IN NS ns
IN MX 10 mail
ns IN A 172.19.19.102
mail IN A 172.19.19.100
www IN A 172.19.19.101
至此所有配置都已经完成
检查下配置有无出错
检查无错误后启动服务
查看下当前网络配置(为了方便,在网卡上配置了2个不同的地址,下面客户机也一样)
查看下客户机的网络配置
于是用这台客户机用不同地址去请求解析DNS
使用192.168.92.0/24网段去解析的结果
使用172.19.19.0/24网段去解析的结果
可以看到,使用不同网段成功的解析到了不同的地址。
这就是基于BIND的智能DNS解析,使用了BIND的view功能,至于dnspod,在智能DNS解析方面应该有更加强大的功能,有兴趣可以去官网下载源代码安装研究。
==================================
传统方法:
最初的bind是不支持通过来源选择不同的ip的,因此只能通过iptables的辅助来实现智能DNS,方法也很简单,在DNS服务器上面启动两 份bind,都不要用默认的端口,两份分别解析不同的线路,然后再用iptables将默认端口的DNS请求根据来源IP发送到不同的bind实例
这种方法缺点很明显,需要多个bind实例,如果需要更多的线路解释那就还要再开bind实例,另外iptables对来源的解释也会导致iptables太多规则