简单CDN其实就是实现智能DNS+缓存代理(Squid)+Web后台主机的实现,智能的对IP地址进行解析,然后按地区的划分进行访问

下面来记录下智能DNS的部署和运行的一些步骤和配置文档,以记录自己的实验实现的效果:

一、智能DNS的部署和运行分为:收集IP、部署DNS以及运行等几部分

(1)收集IP我们可以在网上找到一些比较齐全的DNS服务器ip段,或者进行购买

(2)DNS服务器部署选择操作系统Centos,DNS软件选择Bind9.4以上的版本,9.4以下版本不支持view功能

(3)产生从DNS同步所需要的TSIG KEY,我们可以使用 dnssec-keygen -a hmac-md5 -b 128 -h HOST 视图名称(自行定义)生成

DNS 原理及安装安装


域名服务器解析原理及过程:

<1>当tom用户查询www.fb.com这台主机的相关记录,它首先去本地(/etc/hosts)查询有没有相关

  的记录,有则返回结果,没有则去本地DNS服务器(ns.fb.com)发送请求。

  <2>本地域名服务器(ns.fb.com)查询缓存发现没tom用户查询的相关记录,所以它去根服务器查询

  www.fb.com的相关记录,并得到一个推荐的DNS服务器的地址(.com)  

  <3>然后本地域名服务去com域名服务器查询(www.fb.com)的相关记录,并得到了关于exampl.com域服务器地址,

  然后本地域名服务向example.com发送查询请求,example.com域名服务器查询缓存没有相应的答案,则推荐到

  www.fb.com域名服务器去查询,对于查询域名信息来说,www.fb.com的域名则是权威的,它在自己的管辖

  内找到www这台主机,然后用www这台主机的地址回复本地域名服务器(ns.fb.com)。  

  <4>本地域名服务器(ns.fb.com)得到了关于www.fb.com的主机记录,并将记录到缓存区域,然后

  发送给sandy用户。  

  <5>下次再有用户查询www.fb.com主机信息时,本地域名服务器直接从缓存中调用此记录即可。


DNS服务器的分类:  

  主域名服务器(Primary Name Server)

主域名服务器是特定域所有信息的权威来源,主域名服务器是特定域所有信息的权威来源,它从域管理员构造本地文件中加载域信息,

该文件包含服务器具有管理权的部分域结果的最权威信息。主域名服务器需要配置一组完整的文件,即主机配置文件(named.conf),

正向区域文件、反向区域文件、高速缓存初始化文件(named.ca),回送文件(named.local)  辅助DNS服务器(Second Name Server)

辅助DNS服务器

用来从主域名服务器同步区域数据文件,作为磁盘文件保存在辅助域名服务器相对应的目录,辅助DNS服务器只需要配置主配置文件即可,

不需要配置区域数据文件。  唯高速缓存域名服务器(Cache-only Server)  

唯高速缓存域名服务器不包含域名数据库文件,它每次将从域名服务器得到的查询结果返回给客户端,并在本地将以缓存,供下次查询使用。


DNS 层次结构中资源记录介绍:

[ttl]字段      TTL(time to live (存活时间)),默认字段以秒为单位指定时间长度,在指定的时间内,数据项可被缓存并且仍被认为是有效的。

TTL必须位于该区域数据文件的第一行,来进行标识  

class:class指定网络类型:默认类型为IN IN(指Internet)、HS(Hesiod:本地使用的目录服务)、CH(供域名服务器内部用来标示自己)

type类型A(Address):记录FQDN-IP转换

MX(Mail eXchanger):记录邮件交换记录

CNAME(Canonical NAME):记录别名,允许将多个名字映射到一个主机,通常CNAME主要用于WEB和邮件服务器。

SOA:(Start Of Authority):一个授权区的开始。每个配置文件必须包含SOA记录,以标志服务器所管理的起始处。

PTR(domain name PonitTeR):记录IP-FQDN      HINFO(Host INFOrmation):记录一组描述主机的信息文件组成,

例如:一些硬件名称及操作系统名称等信息。  

rdata:      A:记录主机IP地址      

HINFO:记录Hardware和OS相关记录      

MX:记录提供收发电子邮件相关信息,一般包含两个部分(preference-value)


Bind常用的资源记录语法:

1、SOA资源记录  $TTL 86400  区域名称(Name)  记录类型(type)  SOA   主域名服务器(FQDN)   管理员邮箱地址(mail)  (

serial     ##number 序列号,每次更改配置值是都要在原来的基础上加上1,表示以更新。

refresh    ##刷新时间(间隔)                                      

retry      ##重试时间(间隔)                                    

expire     ##过期时间(间隔)     na ttl )   ##否定答案缓存TTL值      

时间单位:M(分钟)、H(小时)、D(天)、W(周),默认单位是秒


安装:

第一步:

1.wget ftp://ftp.isc.org/isc/bind9/9.8.1-P1/bind-9.8.1-P1.tar.gz

2.tar xzf bind-9.8.1-P1.tar.gz

3.cd bind-9.8.1-P1

4../configure --prefix=/usr/local/bind --enable-threads

5.make && make install

第二步:

创建DNS所需文件( named.ca、localhost.zone、named.local)

(也可以选择yum安装方式安装,不过必须要选择版本高于9.4以上的才能支持view功能, yum install bind97 bind97-utils ......)

# /usr/local/named/bin/dig > named.ca(生成named.ca文件)
# vim localhost.zone
    $TTL    86400
    $ORIGIN localhost.
    @       1D  IN  SOA @ root (
                        42
                        3H
                        15M
                        1W  
                        1D)
            1D  IN  NS  @
            1D  IN  A   127.0.0.1
                                                                                                               
# vim named.local
    $TTL    86400
    @   IN  SOA localhost.  root.localhost. (
                        1997022700
                        28800
                        14400
                        3600000
                        86400 )
            IN  NS  localhost.
        1   IN  PTR localhost.
                                                                                                               
# /usr/local/named/sbin/rndc-confgen >rndc.conf (生成rndc文件,里面自动生成rndc.key)

第三步:创建 named.conf 主配置文件


options {   ##定义全局选项,在所有区域中均有效,如果区域中对某一项有定义,则使用区域中定义的,否则使用此处已定义好的
    directory "/usr/local/named/etc";      #指定区域配置文件所保存的路径
    version "9.6.0";   #显示版本
    allow-query-cache { any; };     #指定接受DNS查询请求缓存的客户端
    allow-query { any; };            #指定接受DNS查询请求的客户端
    pid-file "/var/run/named/named.pid";  #指定DNS运行的pid文件
    };
controls {
    inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};
    # controls语句限定了rndc和正在运行的named进程之间如何进行交互,系统管理员可以用rndc向named进程发送信号并控制它。
    rndc可以连接并控制启动和停止named进程、转储named状态、将named转入调试模式。rndc是一个网络程序,如果配置不当或不正确,来自互联网上的用
    都可以连接并控制DNS服务,rndc用来于named通信的端口默认为953  (通过rndc-confgen命令生成rndc和named之间使用验证配置rndc,实现远程控制DNS服务)
logging {     #指定BIND服务的日志参数
    channel warning { file "/var/log/named/dns_warnings" versions 3 size 1240k;  # 警告通道,用于指定警告日志发送的目标,把警告的信息保存在指定目录下的文件
    severity warning;
        print-category yes;
        print-severity yes;
        print-time yes;
  };
#在 日志中主要有两个概念:通道(channel)和类别(category)。通道指定了应该向哪里发送日志数据:
是发送给syslog,还是写在一个文件里,或是发送给named的标准错误输出,还是发送到位存储桶(bit bucket)。
类别则规定了哪些数据需要记录
                                                                                
 channel general_dns { file "/var/log/named/dns_logs" versions 3 size 1240k;    # 日志通道,用于指定访问日志发送的目标,把访问的信息日志保存在指定目录下的文件
    severity info;                                                              #version是指定允许同时存在多少个版本的该文件,比如指定3个版本(version 3),
    print-category yes;                                                         #bind9会保存query.log、query.log0、query.log1和query.log2。
    print-severity yes;
    print-time yes;
  };
  category default { warning; };
  category queries { general_dns; };
};
#在定义通道的语句中,severity是指定记录消息的级别。在bind中主要有以下几个级别(按照严重性递减的顺序):
# critical、error、warning、notice、info、debug [ level ]、dynamic
#定义了某个级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息。比如定义级别为error,
#则会记录critical和error两个级别 的信息。一般情况下,我们记录到info级别就可以了。print-time是设定在日志中是否需要写入时间,
#print-severity是设定在日志 中是否需要写入消息级别,print-category是设定在日志中是否需要写入日志类别
// key config
include "china.key"; #/usr/local/named/sbin/dnssec-keygen -a hmac-md5 -b 128 -n HOST china生成的key
include "hk.key";
include "rndc.key";
include "tw.key";
//add ip acl
include "ip.china";  # 把预先定义好的访问控制列表文件包含进来,里面都是分类的各个地区的dns域名区域
include "ip.hk";
include "TW.acl";
view "view_china" { # 定义一个视图,名称自定义
    match-clients { key chinakey; CHINA; };  # key为 include "china.key"里面包含的key,可以用dnssec-keygen -a hmac-md5 -b 128 -n HOST 视图名称 生成
    allow-transfer { key chinakey; };
    server 172.28.10.12 { keys chinakey; };  # 从DNS服务器的IP地址
                                                                                   
zone "." IN {
    type hint;
    file "named.ca"; #根服务器的区域文件
    file "named.ca"; #根服务器的区域文件
};
zone "localhost" IN {  #本地解析配置定义
    type master;
    file "localhost.zone";
    allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {   # 反向解析的定义设置
    type master;
    file "named.local";
    allow-update { none; };
};
zone "test.com" IN {    #设置正向DNS区域名称,自定义的一个域名
    type master;          #此配置是主DNS
    file "test.com.cn";   # 设置对应的正向区域地质数据库文件配置文件
    allow-transfer { 172.28.10.12; };  #允许哪台机子来同步,IP为从DNS服务器
};
};
view "view_HK" {
    match-clients { key hkkey; HK; };
    allow-transfer { key hkkey; };
    server 172.28.10.12 { keys hkkey; };
zone "." IN {
    type hint;
    file "named.ca";
};
zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
};
zone "test.com" IN {
    type master;
    file "test.com.hk";
    allow-transfer { 172.28.10.12; };
};
};
view "TW" {
    match-clients { key twkey; TW; };
    allow-transfer { key twkey; };
    server  172.28.10.12 { keys twkey; };
zone "." IN {
    type hint;
    file "named.ca";
};
zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};
zone "0.0.127.in-addr-arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
};
zone "test.com" IN {
    type master;
    file "test.com.tw";
    allow-transfer { 172.28.10.12; };
};
};

# 正向解析配置文件:

# vim test.com.cn   (从DNS会自动同步这个文件,无需自己创建)
$TTL 60   #全局定义TTL值,存活时间
$ORIGIN test.com.
@   IN  SOA ns1.test.com.(主DNS服务器的FQDN,需注册) root.test.com. (
                2013051915; Serial  #序列号,修改主DNS时要让从同步需要把这个值改比从的大+1
                60  ;Refresh        # 多少秒刷新一次
                900 ;Retry          # 同步失败多久再重试一次
                3600000 ;Expire     # 过期时间
                3600 );Minimum
ns1 60  IN A    172.28.10.11
ns2 60  IN A    172.28.10.12
www             IN CNAME    ua1.asd.com.
ua1.asd.com     IN  A   110.110.110.110

第四步:创建从DNS named.conf 主配置文件

options {   #定义全局配置
    directory "/usr/local/named/etc";  #指定区域配置文件所指定的路径
    version "9.6.0";
    allow-query-cache { any; };
    allow-query { any; };
    pid-file "/var/run/named/named.pid";
    };
controls {
    inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};
logging {
    channel warning { file "/var/log/named/dns_warnings" versions 3 size 1240k;
    severity warning;
        print-category yes;
        print-severity yes;
        print-time yes;
  };
                                                                  
  channel general_dns { file "/var/log/named/dns_logs" versions 3 size 1240k;
    severity info;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  category default { warning; };
  category queries { general_dns; };
};
// key config
include "china.key";
include "hk.key";
include "rndc.key";
include "tw.key";
//add ip acl
include "ip.china";
include "ip.hk";
include "TW.acl";
view "view_china" {
    match-clients { key chinakey; CHINA; };
    allow-transfer { key chinakey; };
    server 172.28.10.11 { keys chinakey; }; #主DNS服务器IP,与主DNS服务器进行key的校队
                                                              
zone "." IN {
    type hint;
    file "named.ca";
};
zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
};
zone "test.com" IN {
    type slave;           #从服务器定义为slave
    file "test.com.cn"; #设置对应的正向区域地质数据库文件
    masters { 172.28.10.11; };
};
};
view "view_HK" {
    match-clients { key hkkey; HK; };
    allow-transfer { key hkkey; };
    server 172.28.10.11 { keys hkkey; };
zone "." IN {
    type hint;
    file "named.ca";
};
zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
};
zone "test.com" IN {
    type slave;
    file "test.com.hk";
    masters { 172.28.10.11; };
};
};
view "TW" {
    match-clients { key twkey; TW; };
    allow-transfer { key twkey; };
    server 172.28.10.11 { keys twkey; };
zone "." IN {
    type hint;
    file "named.ca";
};
zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};
zone "0.0.127.in-addr-arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
};
zone "test.com" IN {
    type slave;
    file "test.com.tw";
    masters { 172.28.10.11; };
};
};

第五步:检查配置文件是否有错误

/usr/local/named/sbin/named-checkconf /usr/local/named/etc/named.conf

调试命令: /usr/local/named/sbin/named -gc /usr/local/named/etc/named.conf (会输出日志,可以进行错误调试)

检查zone 文件是否有错误: /usr/local/named/sbin/named-checkzone

第六步:查看日志、进程和端口,看是否成功启动

# tail -f /var/log/message (查看日志是否有报错)

# ps -ef|grep named (查看进程是否正常启动)

# netstat -antp|grep named

tcp        0      0 10.146.70.199:53            0.0.0.0:*                   LISTEN      1539/named          

tcp        0      0 127.0.0.1:53                0.0.0.0:*                   LISTEN      1539/named          

tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN      1539/named

第7步:测试

由于我们做的是CDN,就是把某个地区的ip解析到哪个ip地址,进行区域的划分,本案例是划分为中国、香港、台湾,所以我们可以用***来拨号测试,我们可以使用***拨号到香港、台湾、中国进行测试,看是否访问同一个域名时是否ip是不一样的,如果测试出来是我们设置的IP那说明我们的实验成功了

测试命令: dig +trace www.test.com (域名)

           dig www.test.com

           nslookup www.test.com