前提
本次实验应该用到5台Server和至少两台测试Client。
但受制于服务器数量影响,实际一共用到了3台服务器,其中权威DNS本次没有配置。智能DNS跟CDN缓存节点1共用同一台服务器。

本次实验不介绍源站Server的搭建。本实验环境中用的是现成的系统。
本次实验默认读者已经了解 DNS的相关知识,如A记录、CNAME记录、NS记录等。
本次实验默认读者已经了解CDN的基本原理。
本次实验默认读者了解Linux基本的知识点。
如果不具备以上知识点,请先补充完善自己的知识体系。

实验规划:
1、 客户源站域名为test.wangrx.com,正常配置在权威DNS上作解析,解析地址为10.163.250.53
2、 CDN系统域名为 x.cdn.com,CDN系统智能DNS服务器为10.200.17.7。其中CDN系统域名(x.cdn.com)在权威DNS上有一条NS记录,NS记录指向10.200.17.7。
3、 以下步骤为客户开始使用CDN服务。
4、 第一步,客户需要在权威DNS上把域名的A记录修改为CDN服务商给的CNAME记录。比如本次实验CDN服务商给客户提供的CNAME记录为 test.wangrx.cdn.com。即test.wangrx.com-----CNAME----test.wangrx.cdn.com
5、 第二步,CDN服务商在智能DNS系统上配置相应的解析记录。
6、 第三步,CDN服务商在CDN缓存节点配置相应的反向代理。
7、 第四步,用客户端测试。
(PS:我们做实验,其实我们自己就是CDN服务提供商。)

利用智能DNS和squid反向代理模拟简易CDN_第1张图片

  1. 第一步部分 搭建智能DNS系统
    实验步骤
    1、 准备一台CentOS 7服务器作为智能DNS服务器
    2、 用bind搭建DNS服务器
    3、 配置test.wangrx.cdn.com域名解析A记录。其中QD地区IP过来的DNS解析请求解析到CDN缓存节点1,HD地址IP过来的DNS解析请求解析到CDN缓存节点2。
    4、 用client进行解析测试

实验
1、 我的环境CentOS7已经创建完成
2、 安装DNS服务
# yum -y install bind
3、 修改全局配置文件/etc/named.conf

先备份配置文件
\# cp /etc/named.conf /etc/named.conf.bak
修改配置文件
# vi /etc/named.conf

acl qd {
    10.190.0.0/16;            /\*模拟QD地区IP地址\*/
};

acl hd {
    10.200.0.0/16;            /\*模拟HD地址IP地址\*/
};

acl others {``
    0.0.0.0/0;               /\*其他IP地址\*/
};

options {
//      listen-on port 53 { any; };   /\*这行注释掉,不注释的话括号里修改成any也可\*/
//      listen-on-v6 port 53 { ::1; };
    directory       "/var/named";
    dump-file       "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    recursing-file  "/var/named/data/named.recursing";
    secroots-file   "/var/named/data/named.secroots";
    allow-query     { any; };      /\*这行不要注释,括号里修改成any\*/
    recursion yes;

//      dnssec-enable yes;          /\*注释掉即可\*/
//      dnssec-validation yes;       /\*注释掉即可\*/
    /\* Path to ISC DLV key \*/
//      bindkeys-file "/etc/named.root.key";    /\*注释掉即可\*/

//      managed-keys-directory "/var/named/dynamic";    /\*注释掉即可\*/
//      pid-file "/run/named/named.pid";           /\*注释掉即可\*/
//      session-keyfile "/run/named/session.key";    /\*注释掉即可\*/

forwarders { 10.138.92.76;10.138.92.77;};    /\*根据实际情况配置上级转发DNS服务器,如果单纯本机局域网内解析,可以不配置转发\*/
    forward first   ;    /\*这条可不配,具体含义百度吧\*/
};

logging {
    channel default_debug {
            file "data/named.run";
            severity dynamic;
    };
};

//zone "." IN {                 /\*配置view之后,所有解析zong都转到具体解析文件内,所以此处的zone需要注释掉\*/
//      type hint;
//      file "named.ca";
//};

//include "/etc/named.rfc1912.zones";    /\*注释掉\*/
//include "/etc/named.root.key";         /\*注释掉\*/

view view_qd {      /\*添加配置,QD地区IP地址匹配到/etc/named.rfc1912.zones.qd文件中\*/
            match-clients {qd;};
            include "/etc/named.rfc1912.zones.qd";
};

view view_hd {     /\*添加配置,HD地区IP地址匹配到/etc/named.rfc1912.zones.hd文件中\*/

            match-clients {hd;};
            include "/etc/named.rfc1912.zones.hd";
};

view view_others {     /\*添加配置,others地区IP地址匹配到/etc/named.rfc1912.zones.others文件中\*/

            match-clients {others;};
            include "/etc/named.rfc1912.zones.others";
};

:wq    保存退出

4、 创建QD、HD、others地区的配置文件
创建QD区域配置文件
# cp /etc/named.rfc1912.zones \/etc/named.rfc1912.zones.qd
# chown :named /etc/named.rfc1912.zones.qd
# vi /etc/named.rfc1912.zones.qd

/*添加以下解析记录*/

zone "." IN {
            type hint;
            file "named.ca";
};

zone "cdn.com" {
            type master;
            file "cdn.com.zone.qd";
};

:wq     /*保存退出*/

创建HD区域配置文件
# cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.hd
# chown :named \/etc/named.rfc1912.zones.hd
# vi /etc/named.rfc1912.zones.hd

/*添加以下解析记录*/

zone "." IN {
            type hint;
            file "named.ca";
};

zone "cdn.com" {
            type master;
            file "cdn.com.zone.hd";
};

:wq     /*保存退出*/

创建others区域配置文件
# cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.others
# chown :named /etc/named.rfc1912.zones.others
# vi /etc/named.rfc1912.zones.others

/*添加以下解析记录*/

zone "." IN {
            type hint;
            file "named.ca";
};

zone "cdn.com" {
            type master;
            file "cdn.com.zone.others";
};

:wq     /*保存退出*/

5、 修改qd地区解析数据库
# cp /var/named/named.localhost /var/named/cdn.com.zone.qd
# chown :named /var/named/cdn.com.zone.qd
# chmod 640 /var/named/cdn.com.zone.qd
# vi /var/named/cdn.com.zone.qd

$TTL 1D
@       IN SOA  @  cdn.com. (
                                    0       ; serial
                                    1D      ; refresh
                                    1H      ; retry
                                    1W      ; expire
                                    3H )    ; minimum
    NS      @
    A       127.0.0.1
    AAAA    ::1

dns                         IN      A       10.200.17.7
test.wangrx             IN      A       10.200.17.7   /*配置QD地区客户解析的A记录*/

:wq       /*保存退出*/

利用智能DNS和squid反向代理模拟简易CDN_第2张图片
6、 修改HD地区解析数据库
# cp /var/named/named.localhost /var/named/cdn.com.zone.hd
# chown :named /var/named/cdn.com.zone.hd
# chmod 640 /var/named/cdn.com.zone.hd
# vi /var/named/cdn.com.zone.hd

$TTL 1D
@       IN SOA  @  cdn.com. (
                                    0       ; serial
                                    1D      ; refresh
                                    1H      ; retry
                                    1W      ; expire
                                    3H )    ; minimum
    NS      @
    A       127.0.0.1
    AAAA    ::1

dns                        IN      A       10.200.17.7
test.wangrx             IN      A       10.163.250.54   /*配置HD地区客户解析的A记录*/

:wq       /*保存退出*/

7、 修改others地区解析数据库
# cp /var/named/named.localhost /var/named/cdn.com.zone.others
# chown :named /var/named/cdn.com.zone.others
# chmod 640 /var/named/cdn.com.zone.others

$TTL 1D
@       IN SOA  @ cdn.com. (
                                    0       ; serial
                                    1D      ; refresh
                                    1H      ; retry
                                    1W      ; expire
                                    3H )    ; minimum
    NS      @
    A       127.0.0.1
    AAAA    ::1
dns                         IN      A       10.200.17.7
test.wangrx             IN      A       10.200.17.7  /*跟qd地区配置一样*/

8、 到此,简易版的智能DNS系统就配置完成了。实现功能如下:
>当智能DNS收到属于10.190.0.0/16网段的QD地址的DNS查询请求时,返回/var/named/cdn.com.zone.qd数据库文件里的解析记录,即test.wangrx.cdn.com的A记录IP 10.200.17.7
>当智能DNS收到属于10.200.0.0/16网段的HD地址的DNS查询请求时,返回/var/named/cdn.com.zone.hd数据库文件里的解析记录,即test.wangrx.cdn.com的A记录IP 10.163.250.54

9、 启动DNS服务
# systemctl start named
10、测试

Client把DNS服务器配置为10.200.17.7,即智能DNS服务器地址,然后对test.wangrx.cdn.com作解析,结果如下:
Client1:
属于10.190.0.0/16的QD地区的地址,解析到的IP为10.200.17.7
利用智能DNS和squid反向代理模拟简易CDN_第3张图片

Client2:
属于10.200.0.0/16的HD地区的地址,解析到的IP为10.200.250.54

利用智能DNS和squid反向代理模拟简易CDN_第4张图片

利用智能DNS和squid反向代理模拟简易CDN_第5张图片

第二部分 利用squid搭建缓存服务器
实验步骤

1、 部署两台CentOS服务器作为CDN缓存节点,IP地址分别是10.200.17.7和10.163.250.54
2、 在两台缓存节点上搭建squid
3、 配置反向代理作为缓存服务器
实验

一、 squid介绍
Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
代理分为 正向代理,透明代理,反向代理
1) 正向代理:为局域网中的机器 访问目标地址(比如www.baidu.com) 不可达时 可以通过一个中间代理服务器(可以访问www.baidu.com)进行转发 。正向代理 一般用于局域网联网等用途 并且局域网pc机器 需要在客户端进行一些设置 比如浏览器设置局域网代理设置
2) 反向代理:互联网中的机器访问局域网中代理服务器,代理服务器通过各种规则找到对应后台服务器,获取数据响应。反向代理中,访问机器明确访问的资源就是位于代理服务器,不需要在机器进行任何设置。可以用于设计cdn服务器,代理后端的静态资源
二、 squid安装
这里使用yum安装,安装环境 centos7。默认squid安装启动其实就是一个正向代理。本次实验使用反向代理,对正向代理不做介绍。
1、 yum 安装过程
`yum -y install squid
2、 修改squid配置文件
vi /etc/squid/squid.conf

http_port 10080 accel vhost vport   # accel表示使用加速(缓存) vhost vport表示使用虚拟ip和端口
cache_peer 10.163.250.53 parent 10080 0  #抓取的后端服务器的ip parent表示后台服务器(slibing抓取同级squid)10080后台端口  0表示是否使用icp端口
cache_peer_access web allow all
offline_mode on   #表示不会后台验证资源是否有效 直接从缓存中获取

利用智能DNS和squid反向代理模拟简易CDN_第6张图片
本次实验源站服务器系统是10.163.250.53:10080,所以在squid.conf配置文件中的IP和端口都是根据实际情况修改的。
3、 两台缓存服务器 10.200.17.7和10.163.250.54都配置squid反向代理。
# systemctl start squit /*启动服务*/
因为本人对squid研究非常有限,仅限于搭建起来而已,更深层次的功能大家自己查阅资料。
*查看缓存击中率
cat /var/log/squid/access.log |grep TCPMEMHIT
相应于HTTP请求,下列标签可能出现在access.log文件的第四个空格后.
TCPHIT
Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端.
TCPMISS
Squid没有请求资源的cache拷贝.
TCPREFERSHHIT
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的.
TCPREFFAILHIT
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.然而,原始服务器响应失败,或者返回的响应Squid不能理解.在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端.
TCPREFRESHMISS
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的.
TCPCLIENTREFRESHMISS
Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令.Squid转发客户端的请求到原始服务器,强迫cache确认.

TCPSWAPFAILMISS
Squid发现请求资源的有效拷贝,但从磁盘装载它失败.这时squid发送请求到原始服务器,就如同这是个cache丢失一样.
TCPNEGATIVEHIT
在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应.在短时间内对这些资源的重复请求,导致了否命中. negativettl指令控制这些错误被cache的时间数量.请注意这些错误只在内存cache,不会写往磁盘.下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504.
TCPMEMHIT
Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端.注意这点并非精确的呈现了所有从内存服务的响应.例如,某些cache在内存里,但要求确认的响应,会以TCPREFRESHHIT, TCPREFRESHMISS等形式记录.
TCPDENIED
因为httpaccess或httpreplyaccess规则,客户端的请求被拒绝了.注意被httpaccess拒绝的请求在第9域的值是NONE/-,然而被httpreplyaccess拒绝的请求,在相应地方有一个有效值.
TCPOFFLINEHIT
当offlinemode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度.
TCPREDIRECT
重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节).正常的,Squid不会记录这些重定向.假如要这样做,必须在编译squid前,手工定义LOGTCPREDIRECTS预处理指令.
NONE
无分类的结果用于特定错误,例如无效主机名.
相应于ICP查询,下列标签可能出现在access.log文件的第四域.
UDPHIT
Squid在cache里发现请求资源的貌似新鲜的拷贝.
UDPMISS
Squid没有在cache里发现请求资源的貌似新鲜的拷贝.假如同一目标通过HTTP请求,就可能是个cache丢失.请对比UDPMISSNOFETCH.
UDPMISSNOFETCH
跟UDPMISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求.假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDPMISS.
UDPDENIED
因为icpaccess规则,ICP查询被拒绝.假如超过95%的到某客户端的ICP响应是UDPDENIED,并且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端.若这点发生,你也可在cache.log里见到一个警告.
UDPINVALID
Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等).Squid发送UDPINVALID响应到客户端.*

4、 Client上测试
可以看到,用client进行测试已经可以访问成功了
利用智能DNS和squid反向代理模拟简易CDN_第7张图片

至此,一个非常简易的模拟CDN系统就搭建完成了。