1. 程式人生 > >DNS的主從,轉發與負載功能

DNS的主從,轉發與負載功能

功能 應用 systemctl 作用 url 語句 client 重啟 top

接著原來《DNS原理與應用》的文章,本章內容主要通過實現DNS的主從,轉發,及基於域名解析不同的ip實現後端服務負載均衡的效果。最後再實現DNS的高級功能:類似CDN原理實現基於IP實現區域分流負載,通過以上內容更好地理解DNS的工作原理以及拓展高性能的web服務實現思路

利用DNS解析實現簡單的web負載均衡

我們常說的負載均衡解決方案大多是通過nginx、lvs,haporxy等實現業務或者流程的負載,通過DNS也可以實現簡單的負載功能,並且在用戶請求解析的過程中就能實現負載,DNS默認會使用輪詢的機制輪流將請求解析到後端不同主機:這樣就可以將同一站點域名解析到不同的主機IP,讓各主機提供相同的服務。在DNS中配置如下即可實現:

webserver       IN      A       192.168.214.135
webserver       IN      A       192.168.214.136
www     IN      CNAME           webserver
@       IN      A               192.168.214.135
@       IN      A               192.168.214.136

上面的配置將一個站點部署在兩臺主機上,通過定義別名DNS會輪詢解析請求到這兩臺主機上

解析測試:

[root@yufu ~]# curl http://yufu.com/index.html
<html>
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
this is test page
ip:192.168.214.135
</html>
[root@yufu ~]# curl http://www.yufu.com/index.html

<html>
    <head>
<h1>Welcome to nginx!</h1>
this is test page
IP: 192.168.214.136 
   </body>
</html>

DNS負載缺點:為了降低DNS請求的次數以提高訪問效率。瀏覽器經常緩存了DNS查詢的結果。假設一個IP處的服務失效。那麽瀏覽器可能仍會依據DNS緩存中所記錄的信息向該不可用的服務發送請求(不同的瀏覽器可能有不同的行為)。盡管說整個服務僅僅有一處IP所相應的服務失效了,可是從用戶的角度看來該站點已經不可訪問。因此基於DNS的負載平衡方案並不能作為一個獨立的負載平衡解決方式來提供高可用性的保障,而是作為其他負載平衡解決方式的補充方案來使用。

DNS主從同步

要實現DNS的主從復制,必須要在主DNS區域解析庫文章中定義從服務器地址:
思路:

  1. 主DNS解析庫文件中定義從服務器信息
  2. 從服務器在區域庫定義文件中添加要解析的區域信息,大致與主DNS上相同,但是type是為slave;要指定master是誰,以及同步的解析庫文件存放位置
  3. 關於安全考慮:在主從的named.conf文件中要添加訪問控制:允許區域傳送的主機-白名單(allow-transfer {})

實現上面的過程:

  • 主DNS服務器定義從服務器信息/var/named/gudaoyufu.com.zone
$TTL 1D
@       IN      SOA     ns1.yufu.com. amin.yufu.com (
                        2018051503
                        1H
                        5M
                        7D
                        1D )


        IN      NS      ns1.yufu.com.
        IN      NS      ns2.yufu.com.         #定義從DNS
        IN      MX 10   mx1
        IN      MX 20   mx2
ns1     IN      A       192.168.214.128
ns2     IN      A       192.168.214.134      #定義從DNS的IP地址
mx1     IN      A       192.168.214.189
mx2     IN      A       192.168.214.190
webserver       IN      A       192.168.214.135
webserver       IN      A       192.168.214.136
www     IN      CNAME           webserver
@       IN      A               192.168.214.135
@       IN      A               192.168.214.136
;*      IN      CNAME           webserver
  • 在從服務器中定義區域解析信息 /etc/named.rfc1912.zones
zone "yufu.com" IN {
        type slave;
        masters { 192.168.214.128; };
        file "slaves/gudaoyufu.com.zone";
};

註意:從服務器上定義的域必須要與主服務器上相同,從的type類型為:slave,必須要是指定master是誰,否則找不到同步對象,定義的同步解析庫文件存放文章默認在/var/named/slaves目錄下

  • 在主從的named.conf文件中添加要、區域庫傳送控制,以保障服務器的信息安全:這個的作用是幹嘛的?用一個示列一下就看明白

不做區域傳送控制前,用任意一臺主機都可以獲取到DNS區域解析庫文件中的服務器信息

[root@localhost html]# dig -t axfr yufu.com @192.168.214.128

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> -t axfr yufu.com @192.168.214.128
;; global options: +cmd
yufu.com.       86400   IN  SOA ns1.yufu.com. amin.yufu.com.yufu.com. 2018051504 3600 300 604800 86400
yufu.com.       86400   IN  A   192.168.214.135
yufu.com.       86400   IN  A   192.168.214.136
yufu.com.       86400   IN  NS  ns1.yufu.com.
yufu.com.       86400   IN  NS  ns2.yufu.com.
yufu.com.       86400   IN  MX  10 mx1.yufu.com.
yufu.com.       86400   IN  MX  20 mx2.yufu.com.
mx1.yufu.com.       86400   IN  A   192.168.214.189
mx2.yufu.com.       86400   IN  A   192.168.214.190
ns1.yufu.com.       86400   IN  A   192.168.214.128
ns2.yufu.com.       86400   IN  A   192.168.214.134
webserver.yufu.com. 86400   IN  A   192.168.214.135
webserver.yufu.com. 86400   IN  A   192.168.214.136
www.yufu.com.       86400   IN  CNAME   webserver.yufu.com.
yufu.com.       86400   IN  SOA ns1.yufu.com. amin.yufu.com.yufu.com. 2018051504 3600 300 604800 86400
;; Query time: 2 msec
;; SERVER: 192.168.214.128#53(192.168.214.128)
;; WHEN: Sat May 19 20:13:07 2018
;; XFR size: 15 records (messages 1, bytes 344)

添加傳送控制,只允許主從間傳送,定義規則:allow-transfer { 192.168.214.134; };

[root@localhost html]# dig -t axfr yufu.com @192.168.214.128

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> -t axfr yufu.com @192.168.214.128
;; global options: +cmd
; Transfer failed.

看到區別了吧,如果不做限制,任何人可以獲取到服務器的部署情況這是一個很大的安全隱患。

在主DNS服務器中只允許從服務器傳送,而對於從服務器,則要拒絕任何主機進行傳送
最終在/etc/named.conf中配置如下:

  • 主:allow-transfer { 192.168.214.134; };

  • 備:allow-transfer { none; };

配置好主從服務器後檢查配置有沒有問題,執行:** named-checkconf**

沒問題後重啟或重載服務器:rndc reload
如果順利的話,在從服務器的/var/named/slaves目錄中已經有了主服務器中的gudaoyufu.com.zone文件

[root@dns-slave ~]# ls /var/named/slaves/
1  gudaoyufu.com.zone

從服務器已經同步成功,這時可以關閉主服務器,測試解析,先將測試的客戶端添加DNS地址

echo "nameserver 192.168.214.128" > /etc/resolv.conf 
echo "nameserver 192.168.214.134" > /etc/resolv.conf 

關閉主DNS服務器: systemctl stop named
在客戶端請求www.yufu.com 如下:

[root@yufu ~]# curl http://www.yufu.com/index.html
<html>
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
this is test page
ip:192.168.214.135
</html>

[root@yufu ~]# curl http://www.yufu.com/index.html
<html>
    <head>
this is test page
IP: 192.168.214.136 
   </body>
</html>

DNS轉發

如果客戶端向DNS服務器發起的解析請求內容不在本服務器上,那麽可以設置DNS轉發,將解析請求轉發到其他DNS服務器。DNS轉發分兩種情況,一種是只要本地沒有解析內容的都轉發到指定的DNS服務器上這種轉發叫(全局轉發),另一種是進行匹配轉發,只要解析請求符合定義的某個域,就把該請求轉發到指定的DNS服務器上這種轉發叫(區域轉發):

要實現上面的過程,要在兩臺DNS上做相應的配置:

  • 在主DNS上要定義轉發規則,
  • 開啟請求者做遞歸,否則轉發請求不予進行

recursion yes;

  • 第二臺DNS上要有相應的域解析庫內容
  • 註意:關閉dnssec功能:

dnssec-enable no;

dnssec-validation no;

配置主DNS轉發規則

(1) 全局轉發: 對非本機所負責解析區域的請求,全轉發給指定的服務器,在/etc/named.conf中options定義

forward first|only;
forwarders { ip;};

(2) 特定區域轉發:僅轉發對特定的區域的請求,比全局轉發優先級高,在 /etc/named.rfc1912.zones中定義區域信息

zone "ZONE_NAME" IN {
type forward;
forward first | only;
forwarders { ip;};
};

下面分別實現這兩種轉發方式,先看第一種轉發:全局轉發

全局轉發

配主DNS配置文件/etc/named.conf

forward only;
forwarders  { 192.168.214.134; };
dnssec-enable no;
dnssec-validation no;

註意:recursion yes; 主DNS必須要開啟遞歸查詢,否則解析請求轉發不出去

接收轉發DNS端配置:
定義區域文件信息:vim /etc/named.rfc1912.zones

zone "abc123.com" IN {
        type master;
        file "abc123.com.zone";
};

編寫區域解析庫文件:vim /var/named/abc123.com.zone

$TTL 1D
@       IN      SOA     ns1.abc123.com. amin.abc123.com (
                        2018051507
                        1H
                        5M
                        7D
                        1D )


          IN      NS      ns1.abc123.com.
ns1       IN      A       192.168.214.134
www       IN      A       192.168.214.133
@         IN      A      192.168.214.133

重載DNS並測試:

rndc reload

dig測試:

[root@localhost ~]# dig www.abc123.com @192.168.214.128

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> www.abc123.com @192.168.214.128
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11968
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.abc123.com.            IN  A

;; ANSWER SECTION:
www.abc123.com.     86268   IN  A   192.168.214.133

;; AUTHORITY SECTION:
abc123.com.     86268   IN  NS  ns1.abc123.com.

;; ADDITIONAL SECTION:
ns1.abc123.com.     86268   IN  A   192.168.214.134

;; Query time: 1 msec
;; SERVER: 192.168.214.128#53(192.168.214.128)
;; WHEN: Sun May 20 02:01:31 2018
;; MSG SIZE  rcvd: 82

訪問測試

[root@localhost ~]# curl http://www.abc123.com/index.html

<html>
    <body>
www.abc123.com
IP: 192.168.214.133
    </body>
</html>

[root@localhost ~]# cat /etc/resolv.conf 
nameserver 192.168.214.128

區域轉發

設置區域轉發要在主DNS的named.rfc.1912.zones文件中定義區域信息:

zone "abc123.com"  IN {
        type forward;
        forward only;
        forwarders { 192.168.214.134; };

};

設置後情況一下DNS緩存再重載服務:

rndc flush
rndc reload

測試訪問

[root@localhost ~]# curl http://www.abc123.com/index.html

<html>
    <body>
www.abc123.com
IP: 192.168.214.133
    </body>
</html>

智能DNS

智能DNS解析根據客戶機IP地址歸屬地區域進行區別響應,這裏根據ip地址網段實現按ip地址區域解析的過程:

  • 在DNS的主配置文件中定義ACL規則,註意,ACL規則必須定義在named.conf的最前面;
    acl是根據從上到下順序查找匹配的,acl中ip存在包含關系,應該小範圍地址段先定義,大網段在後面,如果大網段在上面會使下面有包含關系的小網段不生效
acl beijing {
        192.168.214.0/24;

};

acl jiangsu {
        172.20.110.0/24;
};

acl other {
        any;
};
  • 定義解析庫文件

為每個IP地址範圍定義單獨的解析庫文件

[root@dns-1 named]# cp gudaoyufu.com.zone gudaoyufu.com.zone.beijing
[root@dns-1 named]# cp gudaoyufu.com.zone gudaoyufu.com.zone.jiangsu

記得修改解析庫文件的屬組為named

  • 將acl與各區域解析庫文件關聯起來:使用view

註意:一旦采用view,必須把所以的區域信息放在view語句塊中,所以named.conf中的這段內容移動到named.rfc1912.zones中

zone "." IN {
        type hint;
        file "named.ca";
};
  • 創建view

先創建單獨區域文件,在view中要指定

[root@dns-1 named]# cp -p /etc/named.rfc1912.zones /etc/named.rfc1912.zones.beijing
[root@dns-1 named]# cp -p /etc/named.rfc1912.zones /etc/named.rfc1912.zones.jiangsu

在named.rfc1912.zones.beijing單獨的文件中定義如下:


zone "yufu.com" IN {
        type master;
        file "gudaoyufu.com.zone.beijing";
};

在named.rfc1912.zones.jiangsu單獨的文件中定義如下:

zone "yufu.com" IN {
        type master;
        file "gudaoyufu.com.zone.jiangsu";
};

在named.conf中定義view

view beijngview {
        match-clients   {beijing;};
        include  "/etc/named.rfc1912.zones.beijing";

};

view jiangsuview {
        match-clients   {jiangsu;};
        include  "/etc/named.rfc1912.zones.jiangsu";

};


view otherview {
        match-clients   {other;};
        include  "/etc/named.rfc1912.zones";

};

這裏的other就使用默認的區域文件,
上面的view信息也可以直接將etc/named.rfc1912.zones.jiangsu中的內容直接寫在view塊中

DNS的主從,轉發與負載功能