一、详细描述一次加密通讯的过程,结合图示最佳。

普通的TCP通信无法保证数据的安全,它随时可能被第三方截获而泄漏通信双方之间的隐私,这显然是我们不希望看到的,尤其在跟用户名、密码、个人信息息息相关的通信过程(如网上银行交易、机密文件传输等等)尤其看重数据交互的隐秘性,所以我们常常用SSL协议来建立安全保密的通信,SSL协议能够保证交互双方的数据按密文方式传输,第三方在没有私钥的情况下几乎无法破解,从而到达保密的目的。究竟SSL是如何交互数据来确保安全的,很多人却不得而知,为了解答大家的疑惑,这里详细介绍一下SSL的交互过程。   
1、建立TCP连接
由于SSL协议依赖于TCP连接实施,所以在SSL交互之前需要先建立TCP连接。客户端connect服务端,服务端acccept客户端,经历三次握手以后TCP连接建立。
2、客户端发送SSL请求
客户端(Client)向服务端(Server)发送自身使用的SSL版本(SSL一共有三个版本)、加密算法的相关配置、随机数据以及其在在SSL协议中需要用到的信息。
3、服务端处理SSL请求
服务器(Server)反馈给客户端(Client)自己的SSL版本、加密算法的相关配置、随机数据以及用自己的私有密钥加密的SERVER-HELLO信息。服务端(Server)紧接着将自己的证书(包含公共密钥)传递过去。同时有个可选项目,即服务端(Server)可以要求客服端(Client)发送自己的证书。
4、客户端验证服务端身份
客服端(Client)用服务端(Server)传递过来证书验证服务端(Server)的身份,如果身份未验证通过则结束本次通信。证书验证通过后利用服务端(Server)的公共密钥尝试解开被其用私有密钥加密过的SERVER-HELLO信息,如果解开失败,说明该SERVER-HELLO必然是假的,故结束本次通信。
5、客户端发送公共密钥加密过的随机数据
客户端端(Client)生成随机数据(sharedsecret),并且把这个随机数据用服务端(Server)发送过来的的公共密钥加密,此次加密过程产生本次握手中的premastersecret(这个步骤是有可能有服务端的参与的,具体情况由他们使用的加密算法决定),然后将它(premastersecret)送回给服务端(Server)。如果服务端(Server)要求需要验证客户端(Client),那么客服端(Client)也需要自己把自己的证书(包含公共密钥)传递过去,同时送一些自己签过名(私有密钥加密)的数据过去。
6、服务端用私有密钥解密加密后的随机数据并协商暗号
Server验证完client的身份之后,然后用自己的私有密钥解密得到premastersecret然后双方利用这个premastersecret来共同协商,得到mastersecret(可理解为premastersecret为双方协商的暗号,然后使用这个暗号再协商一个mastersecret用来产生真正的会话密钥用来传输数据)以此来保证数据的决对安全。
7、服务端跟客户端利用暗号生成加密算法跟密钥key
双方用mastersecret一起产生真正的sessionkey,这将是一个对称加密的key。这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。
接下来双方就可以用协商好的算法和密钥key,采用对称加密算法来通信了。

wKioL1gF24Pjq-3SAADVqzmID1c978.jpg-wh_50


二、描述创建私有CA的过程,以及为客户端发来的证书请求进行办法证书。
1、创建所需要的文件

[root@localhost CA]# touch index.txt
[root@localhost CA]# echo 01 > serail

2、创建私钥文件

[root@localhost CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)   #生成私钥文件
Generating RSA private key, 2048 bit long modulus
..................................................................................................................................................................................+++
.........................................+++
e is 65537 (0x10001)

3、CA主机生成证书请求,自己为自己颁发证书

命令:      openssl req -new -x509 -key private/cakey.pem -days 7300 -out cacert.pem

参数 :        -new: 生成新的证书签署请求;
                -x509: 专用于CA生成自签证书;
                -key: 生成请求时用到的私钥文件;
                -days n:证书的有效期限;单位为“天”
                -out:指明 证书的保存路径

[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -days 7300 -out cacert.pem    
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN        #国家
State or Province Name (full name) []:shanghai        #省份
Locality Name (eg, city) [Default City]:shanghai        #市区
Organization Name (eg, company) [Default Company Ltd]:magedu        #组织名称
Organizational Unit Name (eg, section) []:ops        #部门
Common Name (eg, your name or your server's hostname) []:ca.magedu.com        #服务器名称
Email Address []:caadmin@magedu.com        #邮件地址
[root@localhost CA]# ll
总用量 24
-rw-r--r--. 1 root root 1424 10月 18 09:50 cacert.pem
drwxr-xr-x. 2 root root 4096 6月  29 2015 certs
drwxr-xr-x. 2 root root 4096 6月  29 2015 crl
-rw-r--r--. 1 root root    0 10月 17 17:42 index.txt
drwxr-xr-x. 2 root root 4096 6月  29 2015 newcerts
drwx------. 2 root root 4096 10月 18 09:38 private
-rw-r--r--. 1 root root    3 10月 17 17:42 serail

4、需要使用证书的主机上生成私钥文件

[root@localhost ssl]# (umask 077; openssl genrsa -out httpd.key 2048)    
Generating RSA private key, 2048 bit long modulus
................+++
....................................+++
e is 65537 (0x10001)

5、需要使用证书的主机上生成CA请求

[root@localhost ssl]# openssl req -new -key httpd.key -days 365 -out httpd.csr    
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanghai
Locality Name (eg, city) [Default City]:shanghai
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:www.magedu.com
Email Address []:webadmin@magedu.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

6、将请求文件传输给CA所在主机

[root@localhost ssl]# scp httpd.csr root@10.18.11.29:/tmp
root@10.18.11.29's password: 
httpd.csr                                                                                                                            100% 1058     1.0KB/s   00:00

7、CA签署证书

[root@localhost CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Oct 18 02:36:27 2016 GMT
            Not After : Oct 18 02:36:27 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = shanghai
            organizationName          = magedu
            organizationalUnitName    = ops
            commonName                = www.magedu.com
            emailAddress              = webadmin@magedu.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                2A:8A:76:E2:94:70:A1:CB:1A:CB:C0:32:35:A3:34:54:BB:4C:43:CA
            X509v3 Authority Key Identifier: 
                keyid:C7:83:51:96:AC:82:AF:DA:35:58:02:CD:B3:75:B2:37:B8:5D:59:38
Certificate is to be certified until Oct 18 02:36:27 2017 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

8、CA将签署过的证书发回发送请求的主机

[root@localhost CA]# scp /tmp/httpd.crt 10.18.11.30:/etc/httpd/ssl/
The authenticity of host '10.18.11.30 (10.18.11.30)' can't be established.
ECDSA key fingerprint is 8a:97:c3:ae:80:30:d2:16:2f:3d:cc:fb:b8:f5:77:14.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.18.11.30' (ECDSA) to the list of known hosts.
root@10.18.11.30's password: 
httpd.crt                                                                                                                            100% 4628     4.5KB/s   00:00

三、搭建一套DNS服务器,负责解析magedu.com域名(自行设定主机名及IP)
(1)、能够对一些主机名进行正向解析和逆向解析;
(2)、对子域cdn.magedu.com进行子域授权,子域负责解析对应子域中的主机名;
(3)、为了保证DNS服务系统的高可用性,请设计一套方案,并写出详细的实施过程

1、安装并配置主DNS服务器正反向解析

[root@localhost ~]# yum install -y bind        #安装DNS服务
[root@localhost ~]# yum install bind-utils        #安装DNS测试工具
[root@localhost ~]# vim /etc/named.conf         #修改主配置文件
options {
        listen-on port 53 { 10.18.11.29; };        #监听在10.18.11.29上
        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";
        allow-query     { any; };

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

//      dnssec-enable yes;            #注释掉dnssec相关内容
//      dnssec-validation yes;

        /* Path to ISC DLV key */
//      bindkeys-file "/etc/named.iscdlv.key";

//      managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

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

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

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

[root@localhost ~]# vim /etc/named.rfc1912.zones 
zone "magedu.com" IN {            #添加正向解析区域
        type master;
        file "magedu.com.zone";
};
zone "18.10.in-addr.arpa" IN {        #添加反向解析区域
    type master;
    file "18.10.in-addr.arpa.zone";
}; 
[root@localhost ~]# vim /var/named/magedu.com.zone         #配置服务器正向解析
$TTL 86400
@       IN      SOA     ns1.magedu.com. admin.magedu.com (
                        20161024
                        1H
                        5M
                        7D
                        1D )
        IN      NS      ns1.magedu.com.
        IN      NS      ns2.magedu.com.
ns1     IN      A       10.18.11.29
ns2     IN      A       10.18.11.30
[root@localhost named]# vim 18.10.zone        #配置服务器反向解析    
$TTL 86400
@       IN      SOA     ns1.magedu.com. admin.magedu.com (
                        20161024
                        1H
                        5M
                        7D
                        1D )
        IN      NS      ns1.magedu.com.
        IN      NS      ns2.magedu.com.
11.29   IN      PTR     ns1.magedu.com.
11.30   IN      PTR     ns2.magedu.com.
11.29   IN      PTR     www.magedu.com.
11.30   IN      PTR     www.magedu.com.
11.29   IN      PTR     mx1.magedu.com.
11.30   IN      PTR     mx2.magedu.com.
[root@localhost ~]# chmod 640 /var/named/magedu.com.zone /var/named/18.10.zone        #修改配置文件权限和属组
[root@localhost ~]# chown :named /var/named/magedu.com.zone /var/named/18.10.zone 
[root@localhost named]# named-checkzone "magedu.com.zone" /var/named/magedu.com.zone        #检测配置文件语法错误
zone magedu.com.zone/IN: loaded serial 20161024
OK
[root@localhost named]# systemctl reload named.service        #重载配置文件
[root@localhost named]# dig www.magedu.com @10.18.11.29        #正向解析测试
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> www.magedu.com @10.18.11.29
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1878
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.magedu.com.                        IN      A

;; ANSWER SECTION:
www.magedu.com.         86400   IN      A       10.18.11.29
www.magedu.com.         86400   IN      A       10.18.11.30

;; AUTHORITY SECTION:
magedu.com.             86400   IN      NS      ns1.magedu.com.
magedu.com.             86400   IN      NS      ns2.magedu.com.

;; ADDITIONAL SECTION:
ns1.magedu.com.         86400   IN      A       10.18.11.29
ns2.magedu.com.         86400   IN      A       10.18.11.30

;; Query time: 0 msec
;; SERVER: 10.18.11.29#53(10.18.11.29)
;; WHEN: 三 10月 26 10:28:16 CST 2016
;; MSG SIZE  rcvd: 143

[root@localhost named]# dig -x 10.18.11.29 @10.18.11.29        #反向解析测试

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> -x 10.18.11.29 @10.18.11.29
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51511
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;29.11.18.10.in-addr.arpa.      IN      PTR

;; ANSWER SECTION:
29.11.18.10.in-addr.arpa. 86400 IN      PTR     mx1.magedu.com.
29.11.18.10.in-addr.arpa. 86400 IN      PTR     www.magedu.com.
29.11.18.10.in-addr.arpa. 86400 IN      PTR     ns1.magedu.com.

;; AUTHORITY SECTION:
11.18.10.in-addr.arpa.  86400   IN      NS      ns2.magedu.com.
11.18.10.in-addr.arpa.  86400   IN      NS      ns1.magedu.com.

;; ADDITIONAL SECTION:
ns1.magedu.com.         86400   IN      A       10.18.11.29
ns2.magedu.com.         86400   IN      A       10.18.11.30

;; Query time: 0 msec
;; SERVER: 10.18.11.29#53(10.18.11.29)
;; WHEN: 三 10月 26 11:34:05 CST 2016
;; MSG SIZE  rcvd: 181

2、DNS服务器配置

[root@localhost ~]# yum install -y bind        #安装DNS服务
[root@localhost ~]# yum install bind-utils        #安装DNS测试工具
[root@localhost slaves]# vim /etc/named.conf
options {
        listen-on port 53 { 10.18.11.30; };
        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";
        allow-query     { any; };        #允许任何人解析

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        //dnssec-enable yes;        #注释掉dnssec相关内容
        //dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

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

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

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
[root@localhost /]# vim /etc/named.rfc1912.zones        
zone "magedu.com" IN {    
     type slave;        #设定为slave类型 
     masters { 10.18.11.29; };        #设定主DNS为10.18.11.29
      file "slaves/magedu.com.zone";        #设定zone文件路径
};
zone "11.18.10.in-addr.arpa." IN {
        type slave;
        masters { 10.18.11.29; };
        file "slaves/11.18.10.zone";
[root@localhost /]# systemctl reload named.service    #重载配置

[root@localhost /]# ll /var/named/slaves/        #查看slaves下已有配置文件从主DNS同步过来
总用量 8
-rw-r--r-- 1 named named 402 10月 26 16:27 11.18.10.zone
-rw-r--r-- 1 named named 500 10月 26 15:54 magedu.com.zone

[root@localhost named]# vim /var/named/magedu.com.zone         #修改主DNS正向区域配置添加一条ftp.magedu.com的A记录
$TTL 86400
@       IN      SOA     ns1.magedu.com. admin.magedu.com. (
                        2016102402
                        1H
                        5M
                        7D
                        1D )
        IN      NS      ns1
        IN      NS      ns2
ns1     IN      A       10.18.11.29
ns2     IN      A       10.18.11.30
mx1     IN      A       10.18.11.29
mx2     IN      A       10.18.11.30
www     IN      A       10.18.11.29
www     IN      A       10.18.11.30
cdn     IN      NS      ns1.cdn
ns1.cdn IN      A       10.18.11.31
ftp     IN      A       10.18.11.29        
[root@localhost named]# vim /var/named/11.18.10.zone        #修改主DNS反向区域配置添加ftp.magedu.com记录
$TTL 86400
@       IN      SOA     ns1.magedu.com. admin.magedu.com. (
                        2016102402        #修改
                        1H
                        5M
                        7D
                        1D )
        IN      NS      ns1.magedu.com.
        IN      NS      ns2.magedu.com.
29      IN      PTR     ns1.magedu.com.
30      IN      PTR     ns2.magedu.com.
29      IN      PTR     www.magedu.com.
30      IN      PTR     www.magedu.com.
29      IN      PTR     mx1.magedu.com.
30      IN      PTR     mx2.magedu.com.
29      IN      PTR     ftp.magedu.com.
[root@localhost named]# systemctl reload named.servic        #重载配置文件

[root@localhost slaves]# cat /var/named/slaves/magedu.com.zone        #在从DNS上查看正反区域配置新加的ftp.magedu.com的配置已同步过来         
$ORIGIN .
$TTL 86400      ; 1 day
magedu.com              IN SOA  ns1.magedu.com. admin.magedu.com. (
                                2016102402 ; serial
                                3600       ; refresh (1 hour)
                                300        ; retry (5 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.magedu.com.
                        NS      ns2.magedu.com.
$ORIGIN magedu.com.
cdn                     NS      ns1.cdn
$ORIGIN cdn.magedu.com.
ns1                     A       10.18.11.31
$ORIGIN magedu.com.
ftp                     A       10.18.11.29
mx1                     A       10.18.11.29
mx2                     A       10.18.11.30
ns1                     A       10.18.11.29
ns2                     A       10.18.11.30
www                     A       10.18.11.29
                        A       10.18.11.30
[root@localhost slaves]# cat /var/named/slaves/11.18.10.zone 
$ORIGIN .
$TTL 86400      ; 1 day
11.18.10.in-addr.arpa   IN SOA  ns1.magedu.com. admin.magedu.com. (
                                2016102402 ; serial
                                3600       ; refresh (1 hour)
                                300        ; retry (5 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.magedu.com.
                        NS      ns2.magedu.com.
$ORIGIN 11.18.10.in-addr.arpa.
29                      PTR     ns1.magedu.com.
                        PTR     www.magedu.com.
                        PTR     mx1.magedu.com.
                        PTR     ftp.magedu.com.
30                      PTR     ns2.magedu.com.
                        PTR     www.magedu.com.
                        PTR     mx2.magedu.com.

[root@localhost named]# dig ftp.magedu.com @10.18.11.30        #测试10.18.11.30可以正常的进行解析

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> ftp.magedu.com @10.18.11.30
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19587
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ftp.magedu.com.                        IN      A

;; ANSWER SECTION:
ftp.magedu.com.         86400   IN      A       10.18.11.29

;; AUTHORITY SECTION:
magedu.com.             86400   IN      NS      ns2.magedu.com.
magedu.com.             86400   IN      NS      ns1.magedu.com.

;; ADDITIONAL SECTION:
ns1.magedu.com.         86400   IN      A       10.18.11.29
ns2.magedu.com.         86400   IN      A       10.18.11.30

;; Query time: 3 msec
;; SERVER: 10.18.11.30#53(10.18.11.30)
;; WHEN: 三 10月 26 17:25:09 CST 2016
;; MSG SIZE  rcvd: 127

[root@localhost named]# dig -x 10.18.11.29  @10.18.11.30

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> -x 10.18.11.29 @10.18.11.30
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38724
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;29.11.18.10.in-addr.arpa.      IN      PTR

;; ANSWER SECTION:
29.11.18.10.in-addr.arpa. 86400 IN      PTR     ns1.magedu.com.
29.11.18.10.in-addr.arpa. 86400 IN      PTR     mx1.magedu.com.
29.11.18.10.in-addr.arpa. 86400 IN      PTR     ftp.magedu.com.
29.11.18.10.in-addr.arpa. 86400 IN      PTR     www.magedu.com.

;; AUTHORITY SECTION:
11.18.10.in-addr.arpa.  86400   IN      NS      ns1.magedu.com.
11.18.10.in-addr.arpa.  86400   IN      NS      ns2.magedu.com.

;; ADDITIONAL SECTION:
ns1.magedu.com.         86400   IN      A       10.18.11.29
ns2.magedu.com.         86400   IN      A       10.18.11.30

;; Query time: 1 msec
;; SERVER: 10.18.11.30#53(10.18.11.30)
;; WHEN: 三 10月 26 17:25:39 CST 2016
;; MSG SIZE  rcvd: 199

3、子域服务器配置

[root@localhost ~]# yum install -y bind        #安装DNS服务
[root@localhost ~]# yum install bind-utils        #安装DNS测试工具
#修改配置主DNS配置文件
[root@localhost ~]# vim /var/named/magedu.com.zone        
cdn     IN      NS      ns1.cdn            #添加两条记录
ns1.cdn IN      A       10.18.11.31


#在子域服务器上添加区域配置
[root@localhost ~]# vim /etc/named.rfc1912.zones       
zone "cdn.magedu.com" IN {        #添加正向解析区域
       type master;
       file "cdn.magedu.com.zone";
};
zone "11.18.10.in-addr.arpa." IN {        #添加反向解析区域
    type master;
    file "11.18.10.zone";
};


#配置子域服务器正向区域配置文件
[root@localhost ~]# vim /var/named/cdn.magedu.com.zone 
$TTL 86400
@       IN      SOA     ns1.cdn.magedu.com. admin.magedu.com (
                        2016102401
                        1H
                        5M
                        7D
                        1D )
        IN      NS      ns1
ns1     IN      A       10.18.11.31
www     IN      A       10.19.11.31

#配置子域服务器反向区域配置文件
[root@localhost ~]# vim /var/named/11.18.10.zone 
$TTL 86400
@       IN      SOA     ns1.cdn.magedu.com. admin.magedu.com. (
                        2016102401
                        1H
                        5M
                        7D
                        1D )
        IN      NS      ns1.cdn.magedu.com.
31      IN      PTR     ns1.cdn.magedu.com.
31      IN      PTR     www.cdn.magedu.com.

#配置主域转发
[root@localhost named]# vim /etc/named.conf        #添加转发域
zone "magedu.com" IN {
    type forward;
    forward first;
    forwarders { 10.18.11.29; };

#测试子域解析
[root@localhost named]# dig www.cdn.magedu.com @10.18.11.31        #测试子域正向解析

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> www.cdn.magedu.com @10.18.11.31
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1172
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.cdn.magedu.com.            IN      A

;; ANSWER SECTION:
www.cdn.magedu.com.     86400   IN      A       10.19.11.31

;; AUTHORITY SECTION:
cdn.magedu.com.         86400   IN      NS      ns1.cdn.magedu.com.

;; ADDITIONAL SECTION:
ns1.cdn.magedu.com.     86400   IN      A       10.18.11.31

;; Query time: 0 msec
;; SERVER: 10.18.11.31#53(10.18.11.31)
;; WHEN: 四 10月 27 11:41:57 CST 2016
;; MSG SIZE  rcvd: 97

[root@localhost named]# dig -x 10.18.11.31 @10.18.11.31        #测试子域反向解析

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> -x 10.18.11.31 @10.18.11.31
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13311
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;31.11.18.10.in-addr.arpa.      IN      PTR

;; ANSWER SECTION:
31.11.18.10.in-addr.arpa. 86400 IN      PTR     ns1.cdn.magedu.com.
31.11.18.10.in-addr.arpa. 86400 IN      PTR     www.cdn.magedu.com.

;; AUTHORITY SECTION:
11.18.10.in-addr.arpa.  86400   IN      NS      ns1.cdn.magedu.com.

;; ADDITIONAL SECTION:
ns1.cdn.magedu.com.     86400   IN      A       10.18.11.31

;; Query time: 0 msec
;; SERVER: 10.18.11.31#53(10.18.11.31)
;; WHEN: 四 10月 27 11:42:29 CST 2016
;; MSG SIZE  rcvd: 133

4、高可用DNS方案

LVS+keepalived负载均衡架构图

wKioL1gS-hPhacvnAAGU1zIOE-M107.jpg

名称
IP
LVS-Master
10.18.11.31
LVS-BACKUP10.18.11.32
LVS-VIP10.18.11.40
DNS-master10.18.11.29
DNS-slave10.18.11.30

配置LVS实现负载均衡

[root@localhost ~]# yum install keepalived        #在两台LVS服务器上安装keepalived
[root@localhost ~]# vim /etc/keepalived/keepalived.conf        #修改LVS-Master配置文件
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_1
}

vrrp_instance VI_DNS1 {
    state MASTER
    interface ens192        #vip绑定的网卡
    virtual_router_id 51        #虚拟路由标记ID,同一组vrrp一致
    priority 100        ##优先级自定义,MASTER高于BACKUP即可
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    
        10.18.11.40        #VIP
        }
}

virtual_server 10.18.11.40 53 {        #VIP和端口
    delay_loop 6
    lb_algo rr        #负载调度算法,RR为轮询
    lb_kind DR        #LVS负载工作模式为DR
    nat_mask 255.255.255.0
    persistence_timeout 50         #会话保持时间,50秒内分配同一节点       
    protocol UDP        #协议类型UDP

    real_server 10.18.11.29 53 {
        weight 100        #权值大小,越大权值越高
        TCP_CHECK {         #realserver 状态检测
        connect_timeout 8        #连接超时时间8秒
        nb_get_retry 3        #重试次数:3次
        delay_before_retry 3        ##重试间隔3秒
        connect_port 53        #检测端口
        }
    }

    real_server 10.18.11.30 53 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 53
        }
    }
}
                                                                                                                                                     57,1          30%
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.18.11.40
        }
}

virtual_server 10.18.11.40 53 {
    delay_loop 6
    lb_algo  rr
    lb_kind DR
    nat_mask 255.255.255.0
    protocol TCP

    real_server 10.18.11.29 53 {
        weight 100
        TCP_CHECK {
        connect_timeout  3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 53
        }
    }

    real_server 10.18.11.30 53 {
        weight 100
        TCP_CHECK {
        connect_timeout  3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 53
        }
    }
}
[root@localhost ~]# vim /etc/keepalived/keepalived.conf         #修改LVS-BACKUP配置
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_2
}

vrrp_instance VI_DNS1 {
    state backup        #状态为backup
    interface ens192
    virtual_router_id 51
    priority 90        #优先级比master低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.18.11.40
        }
}

virtual_server 10.18.11.40 53 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol UDP

    real_server 10.18.11.29 53 {
                                                                                                                                                     1,1          顶端
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.18.11.40
        }
}

virtual_server 10.18.11.40 53 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 1
    protocol TCP

    real_server 10.18.11.29 53 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }

    real_server 10.18.11.30 53 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

在DNS服务器上执行脚本

#!/bin/bash
SNS_VIP=10.18.11.40        
. /etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

测试LVS负载均衡及高可用

[root@localhost ~]#  ipvsadm -ln        #在主LVS服务器上查看lvs状态如下 说明配置生效
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.18.11.40:80 rr
  -> 10.18.11.29:80               Route   100    0          0         
  -> 10.18.11.30:80               Route   100    0          0         
UDP  10.18.11.40:53 rr persistent 50
  -> 10.18.11.29:53               Route   100    0          0         
  -> 10.18.11.30:53               Route   100    0          0     
[16:49:09 root@qa36 /shell]#vim dns_test.sh        #运行测试脚本进行100次dns请求   
#! /bin/sh
for((i=1;i<=100;i++));do
    dig www.magedu.com @10.18.11.40 >/dev/null 2>&1
    sleep 1
done

[root@localhost ~]#  ipvsadm -ln        #查看测试结果
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.18.11.40:53 rr
  -> 10.18.11.29:53               Route   100    0          0         
  -> 10.18.11.30:53               Route   100    0          0         
UDP  10.18.11.40:53 rr
  -> 10.18.11.29:53               Route   100    0          50        
  -> 10.18.11.30:53               Route   100    0          50  
  
[root@localhost ~]# systemctl stop named.service        #关闭一台dns服务器
[root@localhost ~]# systemctl stop keepalived.service        #停止LVS-Master服务
[root@localhost ~]# tail -100f /var/log/messages        #在LVS-backup服务器上查看日志
Oct 28 16:46:34 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS2) Received higher prio advert
Oct 28 16:46:34 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS2) Entering BACKUP STATE
Oct 28 16:46:34 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS2) removing protocol VIPs.
Oct 28 16:46:34 localhost Keepalived_vrrp[4068]: Netlink: error: Cannot assign requested address, type=(21), seq=1477644341, pid=0
Oct 28 16:53:01 localhost Keepalived_healthcheckers[4067]: TCP connection to [10.18.11.29]:53 failed !!!        #检测到一台dns服务器挂了
Oct 28 16:53:01 localhost Keepalived_healthcheckers[4067]: Removing service [10.18.11.29]:53 from VS [10.18.11.40]:53
Oct 28 16:53:01 localhost Keepalived_healthcheckers[4067]: Remote SMTP server [192.168.200.1]:25 connected.
Oct 28 16:53:31 localhost Keepalived_healthcheckers[4067]: Timeout reading data to remote SMTP server [192.168.200.1]:25.
Oct 28 16:53:42 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS1) Transition to MASTER STATE        #LVS-backup切换到master
Oct 28 16:53:42 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS2) Transition to MASTER STATE
Oct 28 16:53:43 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS1) Entering MASTER STATE
Oct 28 16:53:43 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS1) setting protocol VIPs.
Oct 28 16:53:43 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS1) Sending gratuitous ARPs on ens192 for 10.18.11.40
Oct 28 16:53:43 localhost Keepalived_healthcheckers[4067]: Netlink reflector reports IP 10.18.11.40 added
Oct 28 16:53:43 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS2) Entering MASTER STATE        
Oct 28 16:53:43 localhost Keepalived_vrrp[4068]: VRRP_Instance(VI_DNS2) setting protocol VIPs.