在中国一般有电信(telecom)和联通(Unicom)两大运营商,但是电信和联通的网络都是各自独立的,而两大网络相连处的带宽相对很小;所以如果你是电信的网络去联通的服务器上下载数据一般来说要比去电信的服务器下载要慢。

在我们去某些网站下载数据时,经常会看到网站建议你使用电信高速下载或者联通高速下载,甚至有华南电信,华北网通等的区分;而这些都是为了加速你的下载速度,即让你访问距离你最近且和你属于一个运营商的服务器


比如像淘宝这样的大型站点。它一般讲中国划成了许多区域,在每个区域内都有一组服务器,进行用户的访问请求响应,而用户的访问请求一般也会分到距离他最近的那个服务器上,这就需要用到CDN网络


并且有时候也会为每个服务器提供双网卡,一个是电信的IP,一个是联通的IP,如果是电信的用户请求就用电信的网络进行数据传送,反之则用联通的;而通过对用户IP的判断知道他是属于哪个运营商的就需要用到智能DNS解析


一般来说用户访问的距离他最近的网站服务器很可能只是一个缓存服务器而不是原始服务器,而要对网站的内容进行修改则运行商只需要将原始服务器的数据修改,而用户访问缓存服务器时,第一次请求可能响应会相对较慢,因为缓存服务器要去它的上游服务器(很可能还是个缓存服务器)上去找,甚至要去原始服务器上去找,然后缓存再本地在进行用户的响应,而第二次请求相同的内容则会大大提高响应速度

CDN(content delivery network)内容分发网络:即原始服务器会将用户的访问数据发送到距离他最近的服务器上缓存下来,并且通过判断用户的IP进行智能DNS解析,让用户直接访问距离他最近的缓存服务器,从而大大提高了用户的访问速度;而web服务器一般缓存的数据大多数为静态内容,也可以用策略将大多数的动态资源静态化也放到缓存服务器上,而只保留少量不能静态化的动态资源到原始服务器上,这样不仅提高了用户的访问速度也大大降低了原始服务器的访问压力


CDN的前提:

  1. 要能够判断客户端的来源,属于哪个地区哪个运营商

  2. 根据客户端的来源让客户端访问距离他最近的那台服务器

而以上的两个前提必须用智能DNS实现



构建一个DNS服务器 172.16.0.0/16 和127.0.0.0/8的客户端属于电信网络

192.168.0.0/24的客户端属于联通网络


配置智能DNS解析,让不同网段的客户端解析到不同的结果必须用到DNS的视图(view)功能

注:一旦定义了view,则所有的区域都必须定义在视图中,根区域只需定义在需要进行递归的视图中



本机IP为172.16.100.1

#vim /etc/named.conf


acl  innet  {               #acl访问控制列表,相当于变量多次引用,要放在子上边

         172.16.0.0/16;

         127.0.0.0/8;

          };


options {

      directory "/var/named";

      allow-recursion { innet;};   只允许172.16.0.0/16 和127.0.0.1/8的客户端进行递归

      };



view  telecom  {

       match-clients {innet;}; telecom的只匹配172.16.0.0/16 和127.0.0.1/8的客户端

       zone "fade.com"  IN {

                type master;

                file  "telecom.fade.com.zone";

               };


       zone "a.net"  IN {

                   type  master;

                   file  "a.net.zone";

                   };

              };



view  unicom  {

        match-clients { any;}; 电信不匹配的全部匹配到联通

        zone  "fade.com"  IN {

                type master;

                file  "unicom.fade.com.zone";

               };


       zone "a.net"  IN {

                   type  master;

                   file  "a.net.zone";

                   };

              };



注:a.net域在电信和联通两个中都有定义,这样就可以做到不对a.net域的解析进行客户端来源划分

且一个DNS中可以定义多个域,本实验为fade.com和a.net两个域


然后建立DNS资源记录文件

# vim /var/named/telecom.fade.com.zone

$TTL 600

@     IN   SOA    ns1.fade.com.  admin.fade.com(

                             2017022201

                             1H    

                             10M 

                             1D 

                             2D)

     IN   NS     ns1

     IN   MX  10  mail

ns1    IN  A      172.16.100.1

mail   IN   A      172.16.100.2

www    IN  A      172.16.100.3


#chgrp  named  /var/named/telecom.fade.com.zone

#chmod  640   /var/named/telecom.fade.com.zone



# vim /var/named/unicom.fade.com.zone

$TTL 600

@     IN   SOA    ns1.fade.com.  admin.fade.com(

                             2017022201

                             1H    

                             10M 

                             1D 

                             2D)

     IN   NS     ns1

     IN   MX  10  mail

ns1    IN  A      172.16.100.1

mail   IN   A      172.16.100.11

www    IN  A      172.16.100.12


#chgrp  named  /var/named/unicom.fade.com.zone

#chmod  640   /var/named/unicom.fade.com.zone



#vim /var/named/a.net.zone

$TTL 600

@     IN   SOA    ns1.a.net  admin.a.net(

                             2017022201

                             1H    

                             10M 

                             1D 

                             2D)

     IN   NS     ns1

     IN   MX  10  mail

ns1    IN  A      172.16.100.1

mail   IN   A      172.16.100.20

www    IN  A      172.16.100.21


#chgrp  named  /var/named/a.net.zone

#chmod  640   /var/named/a.net.zone



#service named restart


然后就可以用不同网段的客户端进行测试

192.168.0.2#dig -t A www.fade.com @172.16.100.1

         结果应该是172.16.100.12

172.16.100.2#dig -t A www.fade.com @172.16.100.1

         结果应该是172.16.100.3

192.168.0.2#dig -t A www.a.net   @172.16.100.1

         结果应该是172.16.100.21

172.168.0.2#dig -t A www.a.net   @172.16.100.1

         结果应该是172.16.100.21



而当一个DNS服务器要解析很多个域时,这种将DNS数据保存在数据库中的方法会非常的麻烦(修改记录必须打开文件加锁修改等)

所以可以将DNS的数据记录保存在数据库中如MySQL,一旦有DNS请求可以临时性的查询数据库,也可以做到实时修改实时生效;而dlz机制就可以实现将DNS数据导入MySQL数据库在,除此外还可以用bind-sdb实现等等

国内比较知名的DNS运营商有

dnsport

www.dns.la