DNS實戰

實戰Dns

1、 理論基礎

一、 dns的出現及演化

網絡出現的早期是使用IP地址通信的,那時就幾臺主機通信。可是隨着接入網絡主機的增多,這種數字標識的地址很是不便於記憶,UNIX上就出現了創建一個叫作hosts的文件(LinuxWindows也繼承保留了這個文件)。這個文件中記錄着主機名稱和IP地址的對應表。這樣只要輸入主機名稱,系統就會去加載hosts文件並查找對應關係,找到對應的IP,就能夠訪問這個IP的主機了。php

    可是後來主機太多了,沒法保證全部人都能拿到統一的最新的hosts文件,就出現了在文件服務器上集中存放hosts文件,以供下載使用。互聯網規模進一步擴大,這種方式也不堪重負,並且把全部地址解析記錄造成的文件都同步到全部的客戶機彷佛也不是一個好辦法。這時DNS系統出現了,隨着解析規模的繼續擴大,DNS系統也在不斷的演化,直到現今的多層架構體系。mysql

2dns概述入門

DNSDomain Name System,域名系統),因特網上做爲域名和IP地址相互映射的一個分佈式數據庫,可以使用戶更方便的訪問互聯網,而不用去記住可以被機器直接讀取的IP數串。經過主機名,最終獲得該主機名對應的IP地址的過程叫作域名解析(或主機名解析)。DNS協議運行在UDP協議之上,使用端口號53linux

DNS 的分佈式數據庫是以域名爲索引的,每一個域名實際上就是一棵很大的逆向樹中路徑,這棵逆向樹稱爲域名空間(domain name space)。如圖所示樹的最大深度不得超過127 層,樹中每一個節點都有一個能夠長達63 個字符的文本標號。git

 

3dns域名解析過程

首先,客戶端先在本地緩存查找有沒有域名緩存,若是沒有,客戶端發出DNS請求翻譯IP地址或主機名。DNS服務器在收到客戶機的請求後:github

1)檢查DNS服務器的緩存,若查到請求的地址或名字,即向客戶機發出應答信息;面試

2)若沒有查到,則在數據庫中查找,若查到請求的地址或名字,即向客戶機發出應答信息;sql

3)若沒有查到,則將請求發給根域DNS服務器,並依序從根域查找頂級域,由頂級查找二級域,二級域查找三級,直至找到要解析的地址或名字,即向客戶機所在網絡的DNS服務器發出應答信息,DNS服務器收到應答後如今緩存中存儲,而後,將解析結果發給客戶機。thinkphp

4)若沒有找到,則返回錯誤信息。數據庫

4dns的分類

DNS服務器:就是一臺存儲着原始資料的DNS服務器。vim

DNS服務器:使用自動更新方式從主DNS服務器同步數據的DNS服務器。也成輔助DNS服務器。

緩存服務器:不負責本地解析,採用遞歸方式轉發客戶機查詢請求,並返回結果給客戶機的DNS服務器。同時緩存查詢回來的結果,也叫遞歸服務器。

轉發器:這臺DNS發現非本機負責的查詢請求時,再也不向根域發起請求,而是直接轉發給指定的一臺或者多臺服務器。自身並不緩存查詢結果。

5dns中記錄類型

SOA

能夠理解爲一段爲本身dns作備註說明的文本,通常與ns一致

好比:dns.laonanhai.com sa.laonanhai.com

示例:

a.shifen.com.        579    IN    SOA    dns.baidu.com. sa.baidu.com.  (                            1408010001 ; serial number                            5 ; refresh 5s                            5 ; retry 5s                            86400 ; expire 1d                            3600 ;min TTL 1h      )

NS

域的受權名稱服務器

NSDNameDNSFQDN

baidu.com.        64899    IN    NS    ns2.baidu.com.      baidu.com.        64899    IN    NS    ns4.baidu.com.      baidu.com.        64899    IN    NS    dns.baidu.com.      baidu.com.        64899    IN    NS    ns7.baidu.com.      baidu.com.        64899    IN    NS    ns3.baidu.com.

MX

域的郵件交換器,要跟着一個優先級值,越小越高

baidu.com.        7200    IN    MX    20 jpmx.baidu.com.     

baidu.com.        7200    IN    MX    20 mx50.baidu.com.     

baidu.com.        7200    IN    MX    10 mx.n.shifen.com.     

baidu.com.        7200    IN    MX    20 mx1.baidu.com.

A

IPV4主機地址

AAAA

IPV6主機地址

PTR

解析IP的指針,反向記錄

CNAME

權威(正式)名稱,定義別名記錄

www.baidu.com.        1154    IN    CNAME    www.a.shifen.com.

6dns命名規範

1. 26個英文字母

2. 0123456789」十個數字

3. -」(英文中的連詞號)

4. 最多63字節長度

要不按照這個,bind支不支持,支持,合適麼,不合適。

非要不按照這個,怎麼辦?master-view文件上配置check-names ignore;

7dignslookuphost的介紹

Host命令也是大多數系統、軟件庫調用的解析命令,好比php中。

 

Nslookup可以反映出是哪一個dnsserver返回的結果

 

Dig返回整個解析過程的詳細路徑,相似traceroute

 

2、 學習部署bind9

Bind是一款開放源碼的DNS服務器軟件,Bind由美國加州大學Berkeley分校開發和維護的,全名爲Berkeley Internet Name Domain它是目前世界上使用最爲普遍的DNS

環境準備

配置yum

使用centos6自帶的yum源便可,同時確保機器能夠解析外網域名,並能鏈接公網

一、 部署單臺dns

Yum安裝bind

yum install bind-utils bind bind-devel bind-chroot

 

編輯/etc/named.conf

options {

  version "1.1.1";

  listen-on port 53 {any;};

  directory "/var/named/chroot/etc/";

  pid-file "/var/named/chroot/var/run/named/named.pid";

  allow-query { any; };

  Dump-file "/var/named/chroot/var/log/binddump.db";

  Statistics-file "/var/named/chroot/var/log/named_stats";

  zone-statistics yes;

  memstatistics-file "log/mem_stats";

  empty-zones-enable no;

  forwarders {202.106.196.115;8.8.8.8; };

};

 

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

controls {

       inet 127.0.0.1 port 953

               allow { 127.0.0.1; } keys { "rndc-key"; };

 };

 

logging {

  channel warning {

    file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;

    severity warning;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  channel general_dns {

    file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;

    severity info;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  category default {

    warning;

  };

  category queries {

    general_dns;

  };

};

 

include "/var/named/chroot/etc/view.conf";

編輯/etc/rndc.key

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

編輯/etc/rndc.conf

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

options {

        default-key "rndc-key";

        default-server 127.0.0.1;

        default-port 953;

};

編輯/var/named/chroot/etc/view.conf

view "View" {

  zone "lnh.com" {

        type    master;

        file    "lnh.com.zone";

        allow-transfer {

                10.255.253.211;

        };

        notify  yes;

        also-notify {

                10.255.253.211;

        };

  };

};

編輯/var/named/chroot/etc/lnh.com.zone

$ORIGIN .

$TTL 3600       ; 1 hour

lnh.com                  IN SOA  op.lnh.com. dns.lnh.com. (

                                2000       ; serial

                                900        ; refresh (15 minutes)

                                600        ; retry (10 minutes)

                                86400      ; expire (1 day)

                                3600       ; minimum (1 hour)

                                )

                        NS      op.lnh.com.

$ORIGIN lnh.com.

shanks              A       1.2.3.4

op              A       1.2.3.4

Serial:只是一個序號,但這個序號可被用來做爲 slave 與 master 更新的依據。 舉例來講, master 序號爲 100 但 slave 序號爲 90 時,那麼這個 zone file 的資料就會被傳送到 slave 來更新了。因爲這個序號表明新舊資料,一般咱們建議你能夠利用日期來設定!舉例來講,上面的資料是在 2006/10/20 所寫的第一次,因此用 2006102001 做爲序號表明!(yyyymmddnn,nn表明這一天是第幾回修改)

Refresh:除了根據 Serial 來判斷新舊以外,咱們能夠利用這個 refresh(更新) 命令 slave 多久進行一次主動更新;

Retry:若是到了 Refresh 的時間,可是 slave 卻沒法鏈接到 master 時, 那麼在多久以後,slave 會再次的主動嘗試與主機連線;

Expire:若是 slave 一直沒法與 master 鏈接上,那麼通過多久的時間以後, 則命令 slave 不要再鏈接 master 了! 也就是說,此時咱們假設 master DNS 可能遇到重大問題而沒法上線,則等待系統管理員處理完畢後, 再從新來到 slave DNS 從新啓動 bind 吧!

Minimun:這個就有點象是 TTL !

 

修改目錄權限,並啓動服務

cd /var && chown -R named.named named/

/etc/init.d/named start

chkconfig named on

咱們試一把能不能解析

dig @127.0.0.1 shanks.lnh.com

二、 部署主從dns

Yum安裝bind

yum install bind-utils bind bind-devel bind-chroot

編輯/etc/named.conf

options {

  version "1.1.1";

  listen-on port 53 {any;};

  directory "/var/named/chroot/etc/";

  pid-file "/var/named/chroot/var/run/named/named.pid";

  allow-query { any; };

  Dump-file "/var/named/chroot/var/log/binddump.db";

  Statistics-file "/var/named/chroot/var/log/named_stats";

  zone-statistics yes;

  memstatistics-file "log/mem_stats";

  empty-zones-enable no;

  forwarders {202.106.196.115;8.8.8.8; };

};

 

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

controls {

       inet 127.0.0.1 port 953

               allow { 127.0.0.1; } keys { "rndc-key"; };

 };

 

logging {

  channel warning {

    file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;

    severity warning;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  channel general_dns {

    file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;

    severity info;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  category default {

    warning;

  };

  category queries {

    general_dns;

  };

};

 

include "/var/named/chroot/etc/view.conf";

編輯/etc/rndc.key

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

編輯/etc/rndc.conf

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

options {

        default-key "rndc-key";

        default-server 127.0.0.1;

        default-port 953;

};

編輯/var/named/chroot/etc/view.conf

view "SlaveView" {

        zone "lnh.com" {

             type    slave;

             masters {10.6.0.253; };

             file    "slave.lnh.com.zone";

        };

};

修改masterview.conf配置,將slave節點ip加入,

以後修改lnh.com.zoneserial+1

以後在slave上修改目錄權限,並啓動

cd /var && chown -R named.named named/

/etc/init.d/named start

chkconfig named on

回到master節點,執行rndc reload

三、 添加ACNAMEMXPTR記錄

A記錄

編輯master節點/var/named/chroot/etc/lnh.com.zone,在文件末尾添加一條記錄

a               A       192.168.122.100

serial+1

執行rndc reload命令

分別對masterslave解析下:host a.lnh.com 127.0.0.1 結果應該是192.168.122.100

CNAME記錄

編輯master節點/var/named/chroot/etc/lnh.com.zone,在文件末尾添加一條記錄

cname            CNAME   a.lnh.com.

serial+1

執行rndc reload命令

分別對masterslave解析下:host cname.lnh.com 127.0.0.1結果應該是192.168.122.101

MX記錄

編輯master節點/var/named/chroot/etc/lnh.com.zone,在文件末尾添加一條記錄

mx               MX 5       192.168.122.101

serial+1

執行rndc reload命令

分別對masterslave解析下:host mx.lnh.com 127.0.0.1 結果應該是192.168.122.101

PTR記錄

編輯master節點/var/named/chroot/etc/view.conf,加入ptrzone配置

zone "168.192.in-addr.arpa" {

        type    master;

        file    "168.192.zone";

        allow-transfer {

                10.6.0.254;

        };

        notify  yes;

        also-notify {

                10.6.0.254;

        };

  };

編輯master節點/var/named/chroot/etc/168.192.zone

$TTL 3600       ; 1 hour

@                  IN SOA  op.lnh.com. dns.lnh.com. (

                                2004       ; serial

                                900        ; refresh (15 minutes)

                                600        ; retry (10 minutes)

                                86400      ; expire (1 day)

                                3600       ; minimum (1 hour)

                                )

                        NS      op.lnh.com.

102.122     IN      PTR     a.lnh.com.

修改168.192.zone文件的屬性

chown named.named 168.192.zone

rndc reload

編輯slave節點/var/named/chroot/etc/view.conf,加入ptrzone配置

zone "168.192.in-addr.arpa" {

             type    slave;

             masters {10.5.35.14; };

             file    "slave.168.192.zone";

        };

使slave配置生效,slave上執行

rndc reload

分別對兩臺機器作ptr記錄的解析

host 192.168.122.102 127.0.0.1 結果應爲a.lnh.com

四、 經過dns實現服務的負載均衡

編輯master節點/var/named/chroot/etc/lnh.com.zone,在文件末尾添加一條記錄

a               A       192.168.122.102

serial+1

執行rndc reload命令

分別對masterslave解析下:host a.lnh.com 127.0.0.1 結果應該是192.168.122.100192.168.122.102

五、 配置dns視圖(智能dns

編輯master節點vim /var/named/chroot/etc/named.conf,在include上面添加

acl group1 {

  10.5.35.14;

};

 

acl group2 {

  10.5.35.15;

};

編輯master節點vim /var/named/chroot/etc/view.conf

view "GROUP1" {

  match-clients { group1; };

  zone "viewlnh.com" {

    type master;

    file "group1.viewlnh.com.zone";

  };

};

 

view "GROUP2" {

  match-clients { group2; };

  zone "viewlnh.com" {

    type master;

    file "group2.viewlnh.com.zone";

  };

};

編輯master節點vim /var/named/chroot/etc/group1.viewlnh.com.zone

$ORIGIN .

$TTL 3600       ; 1 hour

viewlnh.com                  IN SOA  op.viewlnh.com. dns.viewlnh.com. (

                                2005       ; serial

                                900        ; refresh (15 minutes)

                                600        ; retry (10 minutes)

                                86400      ; expire (1 day)

                                3600       ; minimum (1 hour)

                                )

                        NS      op.viewlnh.com.

$ORIGIN viewlnh.com.

op                 A       192.168.122.1

view               A       192.168.122.1

編輯master節點vim /var/named/chroot/etc/group2.viewlnh.com.zone

$ORIGIN .

$TTL 3600       ; 1 hour

viewlnh.com                  IN SOA  op.viewlnh.com. dns.viewlnh.com. (

                                2005       ; serial

                                900        ; refresh (15 minutes)

                                600        ; retry (10 minutes)

                                86400      ; expire (1 day)

                                3600       ; minimum (1 hour)

                                )

                        NS      op.viewlnh.com.

$ORIGIN viewlnh.com.

op                 A       192.168.122.2

view               A       192.168.122.2

修改文件所屬,加載配置

chown named.named /var/named/chroot/etc/group*.zone

rndc reload

分別在主機AB上作view.viewlnh.com的域名解析測試

 

dig @10.240.17.103 view.viewlnh.com

 

結果應爲主機A上是192.168.122.1主機B上是192.168.122.2

 

 

3、構建企業級dns

1、硬件選型

Cpu12c以上配置

內存16G

網絡:千兆

六、 初始化系統

關閉selinux: /etc/selinux/config

關閉iptables: chkconfig iptables off

調整ulimit限制: echo -e '* soft nproc 65536\n* hard nproc 65536\n* soft nofile 65536\n* hard nofile 65536\n' >>  /etc/security/limits.conf

3、構建高性能、高可用dns

 

採用lvs-dr模式負載均衡,多idc,多套dns集羣,經過master-slave技術保證dns配置的一致性。

一、 高可用

物理層:

首先確保兩臺lvs不在同一機櫃、同一物理交換機接入;

其次確保將全部dns服務器也作到不在同一機櫃、同一物理交換機接入。

同時,在不一樣的idc構建多套dns集羣,爲客戶端提供可切換的配置。

服務層:

堅定摒棄lvs上端口檢測這種方式,採用自定義腳本檢測,爲dns的健康檢測單獨設置一個域名,就爲了lvs檢測dns是否存活而設計。

腳本示例:

 

客戶端層:

idc之間的流量切換是經過客戶端的健康檢測cron實現的,腳本每分鐘運行一次,分別檢測每一個dns集羣虛地址的可用性。

二、 高性能

經過lvs能夠對每一個集羣作橫向擴容,是否須要擴容的依據是對現有系統的壓測結果,以及實時的監控數據。

亦或者能夠在最靠近應用層處,加上一層cache-only集羣,但前提是你的線上環境中,沒有任何系統依賴於dns負載均衡。

4、壓測

安裝queryperf

下載bind源碼wget http://ftp.isc.org/isc/bind9/9.7.3/bind-9.7.3.tar.gz

解壓bind源碼tar zxf bind-9.7.3.tar.gz

進入解壓後bind源碼目錄cd bind-9.7.3/contrib/queryperf/

編譯./configure

make

會在當前目錄下出現queryperf,能夠將它拷貝至/usr/bin/

編輯域名記錄文件(test.txt),格式以下:

www.baidu.com A

www.baidu.com A

www.baidu.com A

www.baidu.com A

www.baidu.com A

壓測命令queryperf -d test.txt -s 8.8.8.8

按照3.1中的硬件選型,也作了3.2的初始化,這樣在相同idc的壓測下,單臺dns-serverqps能夠達到35~40k

5、監控

監控結合zabbix實現

系統基礎性能

使用zabbix自帶模板便可。Cpu、內存、主機存活、磁盤空間、主機運行時間、系統load

Loopback地址綁定狀態監控

該架構中,dnsserver在集羣中充當realserver的角色,在dr中,須要綁定loopback地址方能通訊,所以當loopback地址沒有綁定上時,lvs健康檢測經過,可是當請求到達dnsserver時,請求被拒絕,dns集羣會出現異常。

Dns數據與master一致性監控

此處個人方案是分爲兩部分:

一是經過寫zabbix自定義discovery,掃出dns配置中全部zone,而後分別對比slavemaster每一個zoneserial值,當slavemaster的值持續5分鐘不一致時報警

二是寫腳本,每15分鐘掃一遍master上全部域名解析結果,與每一個slave的結果作對比,當出現結果不一致狀況時,報警

Dns響應時間監控

遠端一組主機跑在fullnat下(提供高可用),經過dig命令檢測dnsserver的響應時間。

Dns每秒請求數監控

在每臺dns主機上,編寫zabbix腳本,分析named_stats文件,獲取每秒請求數

#!/bin/bash

#rndc stats

STATS='/var/named/chroot/var/log/named_stats'

if [[ $# -ne 1 ]]

then

  echo "$0 [querys]"

  exit 2

else

  which=$1

fi

 

if [[ -f "${STATS}" ]]

then

  echo > ${STATS}

  rndc stats >/dev/null 2>&1

else

  echo "${STATS} not found."

  exit 2

fi

 

case ${which} in

querys)

  RESULT=`awk '{if ($2=="QUERY") {print $1}}' ${STATS}`

;;

*)

  echo "$0 [querys]"

  exit 2

;;

esac

 

echo ${RESULT}

 

Dns可用性監控

遠端一組主機跑在fullnat下(提供高可用),經過host命令檢測dnsserver的可用性,腳本與lvs健康檢測腳本相似。

6、自動化

saltstack安裝、部署

經過定製saltstack配置,實現自動、批量安裝、部署dns

配置管理自動化

業界最多的是bind-dlzdlz是指將全部的配置都存在mysql表中,對bind作特殊配置,使得每次bind接受的請求都去mysql中查詢數據以後返回給用戶。

bind-dlz的優缺點

優點:將數據所有存在數據庫,符合運維開發的理念。

劣勢:每次解析都要select數據庫,性能低下;

增長了系統的藕合性,還須要保證mysql的高可用。

個人方案

採用dlz的數據庫部分表結構;

thinkphp實現對mysql的增刪改查,和一些權限控制的頁面,在該頁面,用戶能夠完成對域名的增刪改查操做,數據源在MySQL中;

經過saltstack+py實現從mysql中調數據,生成bind的配置文件,並檢測文件格式,以後reload

 

 

 

爲何作這些,我要將dns作成可交付、已維護的系統,交付給應用運維同窗使用,我只負責dns架構的server端;

https://github.com/shanks1127/dns 

7、安全

時刻關注dns相關的漏洞、補丁;

選用稍大些的廠商做爲域名服務商,咱們是萬網;

對服務器的登陸日誌作監控分析;

8、平常運維規範

Dns做爲基礎服務,在作好高可用、高性能、好擴容的基礎上,任什麼時候刻都不能掉以輕心!!!

確保全部監控均處於生效狀態;

全部新機器,均在saltstack上完成初始化和安裝、部署操做,不能單獨操做;

全部針對dns架構調整的操做,均需在流量低谷時操做;

對集羣擴容操做時,務必對新加入節點作壓測,同時重啓服務器並檢測重啓後各項指標是否正常;

關注dns相關新聞,時刻跟進;

4、 dns的發展趨勢

Dnsmasq

DNSmasq是一個小巧且方便地用於配置DNSDHCP的工具,適用於小型網絡,它提供了DNS功能和可選擇的DHCP功能。它服務那些只在本地適用的域名,這些域名是不會在全球的DNS服務器中出現的。DHCP服務器和DNS服務器結合,而且容許DHCP分配的地址能在DNS中正常解析,而這些DHCP分配的地址和相關命令能夠配置到每臺主機中,也能夠配置到一臺核心設備中(好比路由器),DNSmasq支持靜態和動態兩種DHCP配置方式。

有一些公司在每臺服務器上都起着dnsmasq,充當本地dns緩存服務,來提升dns解析性能同時減輕dnsserver的壓力。

Httpdns

但凡使用域名來給用戶提供服務的互聯網企業,都或多或少地沒法避免在有中國特點的互聯網環境中遭遇到各類域名被緩存、用戶跨網訪問緩慢等問題。

首先是域名緩存,不一樣運營商,不一樣節點的緩存時間設置的差異較大。這樣在流量切換時,就會產生新、舊應用數據不一致的現象。

其次就是域名解析過了太多層的nat,這就致使dns獲取客戶端地址時很難準肯定位,從而智能dns的準確度大打折扣。

最近兩年,httpdns出現了

用戶明確的知道我在訪問某廠的服務時,應該去找哪一個ip要對應的域名,實現這個的前提是你能夠左右用戶的訪問習慣,目前應用最適合的場景是app

 

在可預見的將來,不論在公司內網仍是公網環境,dns在整個架構中,都將會以一個基礎服務的位置存在,而目前最爲穩定、高效的,依然是bind

5、 生產常見dns問題以及排障方法

Dns須要開通53udptcp

正常狀況下dns會優先使用udp,可是在udp受限的狀況下會使用tcp

運維同窗忽然告訴我,你的dns不能用了

記得那時我剛來公司還沒轉正的時候。有個哥們問我,dns如今沒什麼事吧?臥槽,dns?什麼dns

記得那會線上跑着多少dns,每臺dns配置一不同,沒人說得清楚。因而我說兄弟,你什麼dns,怎麼了?他告訴我一個ip,說用的這個dns,如今解析不了了。我說我看下,你先改個別的dns,這種時候必定要先恢復業務,而後再排查、解決問題。

我嘗試用那臺dns解析域名,確實不行了,登上去看,dns進程還在,想來是有什麼瓶頸了,看日誌吧,在日誌中發現有報netfilter滿了的日誌,怎麼tm會報這個呢,難道機器起着iptables?臥槽,還真是起着呢,這不蛋逼呢麼。趕忙把iptables停掉,問題恢復了。

iptable運行時,即使是沒有任何規則,全部的報文也要過netfilter表,而dns這種高併發的業務很容易把netfilter表填滿,從而影響服務。

後續的工做就是整理線上dns,同一配置,作好監控,作好高可用和負載均衡

忽然收到報警,提示dns虛地址不能正常解析了

那天帶孩子體檢,請了一天假,還在醫院的時候,收到的報警,趕忙電話到公司,詢問怎麼回事,原來是有同事將zabbix的一個域名刪除了,而這個域名偏偏是我lvs健康檢測dns服務是否能夠提供解析的域名,域名都沒了,那確定解析失敗,因而lvs把全部dns都剔除了。

雖然恢復起來很快,可是這也提醒我,系統之間,必定要儘可能減少藕合性,避免雪崩。

開發來找,說調用微信支付接口有超時的現象,錯誤日誌中報解析微信域名失敗

接到這個case,首先是確認問題是否出如今域名解析的環節,我登陸到服務器上,用nslookup解析對應的域名,連續解析1000次均沒問題,但開發小妹依然喋喋不休,我按耐住tmd心情。忽然想起也許她php中調用的解析函數與nslookup不一樣,因而我用host解析,這時發現問題了。每次解析微信支付這個域名的時候,都要等10s左右纔出結果。這時,我又找其餘機器作測試,發現只有這個微信支付的域名有這種現象,這不禁得讓我對大qq產生了膜拜的情緒。

出現這種狀況讓人很頭大,而旁邊開發小妹還在殷切的看着你,你背後還有領導不時的喘着粗氣,而偏偏此時你對這問題一點頭緒也沒有,怎麼辦?

越是這種時候,越要淡定,否則怎麼辦?!這玩意不是誰教的,是你多遇到幾回這種狀況,每次都要提醒本身,冷靜、冷靜、tmd冷靜

既然只有解析微信這個接口有問題,那我想多是微信對dns這塊有什麼限制,那我可不能夠換個forward的公網dns試下呢?分兩頭,一頭是我去測試,另一頭讓同事聯繫微信,給提供一個qq那邊的權威dnsip,最終我將qq權威dnsip加到我dnsforward列表中解決了這個case

6、部分dns相關的面試題

dns中遞歸查詢與迭代查詢的區別

1.遞歸查詢:

通常客戶機和服務器之間屬遞歸查詢,即當客戶機向DNS服務器發出請求後,DNS服務器自己不能解析,則會向另外的DNS服務器發出查詢請求,獲得結果後轉交給客戶機

2.迭代查詢(反覆查詢):

通常DNS服務器之間屬迭代查詢,如:若DNS2不能響應DNS1的請求,則它會將DNS3IPDNS2,以便其再向DNS3發出請求;

 

以一個dns請求解析爲例:

1、用戶發起域名請求到dnsA,這時dnsA有這個記錄,將結果返回給用戶,這個過程是遞歸查詢

2、用戶發起域名請求到dnsA,這時dnsA沒有這個記錄,他去向dnsB問有沒有這個記錄,以此類推,直到把結果返回給用戶,這個過程是遞歸查詢

3、用戶發起域名請求到dnsA,這時dnsA沒有這個記錄,他告訴用戶,我沒有這個記錄,你去問dnsB吧,這個過程是迭代查詢

簡述DNS進行域名解析的過程

首先,客戶端發出DNS請求翻譯IP地址或主機名。DNS服務器在收到客戶機的請求後:

1)檢查DNS服務器的緩存,若查到請求的地址或名字,即向客戶機發出應答信息;

2)若沒有查到,則在自身配置中查找,若查到請求的地址或名字,即向客戶機發出應答信息;

3)若沒有查到,則將請求發給根域DNS服務器,並依序從根域查找頂級域,由頂級查找二級域,二級域查找三級,直至找到要解析的地址或名字,即向客戶機所在網絡的DNS服務器發出應答信息,DNS服務器收到應答後如今緩存中存儲,而後,將解析結果發給客戶機。

4)若沒有找到,則返回錯誤信息。

附錄

Dns安裝腳本yum

#!/bin/bash

####################################################################

# Auto install bind

# Create Date :  2012-11-28

# Written by :shanks

# Organization:  DangDang

####################################################################

 

IN_Face=`route -n |awk '{if($4~/UG/){print $8}}'|head -n 1`

Local_IP=`/sbin/ifconfig|grep -B1 -C1 -w "${IN_Face}"|grep -w 'inet addr'|awk -F: '{print $2}'|awk '{print $1}'`

 

cd /usr/local/src/

yum -y install bind-utils bind bind-devel bind-chroot bind-libs >>/tmp/init_sn.log -y && rndc-confgen -r /dev/urandom -a || exit 1

  # ***config /etc/named.conf***

cat << shanks1  > /etc/named.conf

options {

  version "1.1.1";

  listen-on port 53 {any;};

  directory "/var/named/chroot/etc/";

  pid-file "/var/named/chroot/var/run/named/named.pid";

  allow-query { any; };

  Dump-file "/var/named/chroot/var/log/binddump.db";

  Statistics-file "/var/named/chroot/var/log/named_stats";

  zone-statistics yes;

  memstatistics-file "log/mem_stats";

  empty-zones-enable no;

  forwarders {202.106.196.115;8.8.8.8; };

};

 

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

controls {

       inet 127.0.0.1 port 953

               allow { 127.0.0.1; } keys { "rndc-key"; };

 };

 

logging {

  channel warning {

    file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;

    severity warning;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  channel general_dns {

    file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;

    severity info;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  category default {

    warning;

  };

  category queries {

    general_dns;

  };

};

 

include "/var/named/chroot/etc/view.conf";

 

shanks1

# ***config /etc/rndc.key***

cat << shanks2  > /etc/rndc.key

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

shanks2

# ***config /etc/rndc.conf***

cat << shanks3  > /etc/rndc.conf

# Start of rndc.conf

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

options {

        default-key "rndc-key";

        default-server 127.0.0.1;

        default-port 953;

};

shanks3

# ***config /var/named/chroot/etc/view.conf***

cat << shanks4  > /var/named/chroot/etc/view.conf

view "View" {

             allow-transfer {

                #dns-ip-list;

        };      

             notify  yes;

             also-notify {

                #dns-ip-list;

        };

       

#  ixfr-from-differences yes;

zone "com" {

        type    master;

        file    "com.zone";

        allow-transfer {

                10.255.253.211;

        };

        notify  yes;

        also-notify {

                10.255.253.211;

        };

  };

        zone "forward.com" {

             type    forward;

              forwarders { 10.255.253.220; };

        };

};

shanks4

# ***config  /var/named/chroot/etc/com.zone***

cat << shanks5  >  /var/named/chroot/etc/com.zone

\$ORIGIN .

\$TTL 3600       ; 1 hour

com                  IN SOA  op.shanks.com. dns.shanks.com. (

                                2000       ; serial

                                900        ; refresh (15 minutes)

                                600        ; retry (10 minutes)

                                86400      ; expire (1 day)

                                3600       ; minimum (1 hour)

                                )

                        NS      op.shanks.com.

\$ORIGIN com.

shanks              A       1.2.3.4

shanks5

cd /var && chown -R named.named named/

/etc/init.d/named start

chkconfig named on

#check install status.

check_cmd=`host  -s -W 0.5 shanks.com 127.0.0.1|grep "1.2.3.4"`

if [ -z "${check_cmd}" ]

then

  echo "<ERROR!> hey,man.install bind --- ERROR!"

  exit 5

else

  echo "<OK> hey,man.install bind --- ok."

  rndc stats

fi

 

if [ -f /tmp/Install_bind.sh ]

then

  rm -rf /tmp/Install_bind.sh

fi

dns安裝腳本9.9版(編譯版本)

#!/bin/bash

####################################################################

# Auto install bind

# Create Date :  2012-11-28

# Written by :shanks

# Organization:  DangDang

####################################################################

 

IN_Face=`route -n |awk '{if($4~/UG/){print $8}}'|head -n 1`

Local_IP=`/sbin/ifconfig|grep -B1 -C1 -w "${IN_Face}"|grep -w 'inet addr'|awk -F: '{print $2}'|awk '{print $1}'`

 

prefix='/usr/local/bind'

 

cd /usr/local/src/ && wget http://192.168.1.9/soft/dns/9.9/bind-9.9.7-P2.tar.gz && tar zxf bind-9.9.7-P2.tar.gz

if [ -d '/usr/local/src/bind-9.9.7-P2' ]

then

  cd /usr/local/src/bind-9.9.7-P2 && ./configure --prefix=/usr/local/bind --enable-threads --with-libtool && make && make install

  REAV=$?

  if [ ${REAV} != 0 ]

  then

    echo 'bind make faild!!!'

    exit 2

  fi

else

  echo 'bind src get filed!!!'

  exit 1

fi

  # ***config /etc/named.conf***

cat << shanks1  > ${prefix}/etc/named.conf

options {

  version "1.1.1";

  listen-on port 53 {any;};

  directory "${prefix}/etc/";

  pid-file "${prefix}/var/run/named.pid";

  allow-query { any; };

  Dump-file "${prefix}/var/binddump.db";

  Statistics-file "${prefix}/var/named_stats";

  zone-statistics yes;

  memstatistics-file "var/mem_stats";

  empty-zones-enable no;

  masterfile-format text;

#  allow-update {none;};

#  allow-recursion {any;};

#  serial-query-rate 100;

#  recursion no;

#  dnssec-enable yes;

};

 

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

controls {

       inet 127.0.0.1 port 953

               allow { 127.0.0.1; } keys { "rndc-key"; };

 };

 

logging {

  channel warning {

    file "${prefix}/var/dns_warning" versions 10 size 10m;

    #file "${prefix}/var/dns_warning";

    severity warning;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  channel general_dns {

    file "${prefix}/var/dns_log" versions 10 size 50m;

    #file "${prefix}/var/dns_log";

    severity info;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  category default {

    warning;

  };

  category queries {

    general_dns;

  };

};

 

include "${prefix}/etc/view.conf";

 

shanks1

# ***config /etc/rndc.key***

cat << shanks2  > /etc/rndc.key

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

shanks2

# ***config /etc/rndc.conf***

cat << shanks3  > ${prefix}/etc/rndc.conf

# Start of rndc.conf

key "rndc-key" {

        algorithm hmac-md5;

        secret "Eqw4hClGExUWeDkKBX/pBg==";

};

 

options {

        default-key "rndc-key";

        default-server 127.0.0.1;

        default-port 953;

};

shanks3

# ***config ${prefix}/etc/view.conf***

cat << shanks4  > ${prefix}/etc/view.conf

view "View" {

             allow-transfer {

                #dns-ip-list;

        };      

             notify  yes;

             also-notify {

                #dns-ip-list;

        };

       

#  ixfr-from-differences yes;

zone "com" {

        type    master;

        file    "com.zone";

        allow-transfer {

                10.255.253.211;

        };

        notify  yes;

        also-notify {

                10.255.253.211;

        };

  };

        zone "forward.com" {

             type    forward;

             forwarders { 10.255.253.220; };

        };

};

shanks4

# ***config  ${prefix}/etc/com.zone***

cat << shanks5  >  ${prefix}/etc/com.zone

\$ORIGIN .

\$TTL 3600       ; 1 hour

com                  IN SOA  op.shanks.com. dns.shanks.com. (

                                2000       ; serial

                                900        ; refresh (15 minutes)

                                600        ; retry (10 minutes)

                                86400      ; expire (1 day)

                                3600       ; minimum (1 hour)

                                )

                        NS      dns.shanks.com.

\$ORIGIN com.

shanks              A       1.2.3.4

shanks5

useradd named -s /sbin/nologin

cd /usr/local && chown -R named.named bind/

if [ -f /etc/init.d/named ]

then

  rm -rf /etc/init.d/named

fi

wget -q http://192.168.1.9/soft/dns/9.9/named -O /etc/init.d/named && chmod +x /etc/init.d/named

/etc/init.d/named start

ln -s ${prefix}/sbin/rndc /usr/bin/rndc

ln -s ${prefix}/bin/host /usr/bin/host

ln -s ${prefix}/bin/dig /usr/bin/dig

chkconfig named on

#check install status.

check_cmd=`host  -s -W 0.5 shanks.com 127.0.0.1|grep "1.2.3.4"`

if [ -z "${check_cmd}" ]

then

  echo "<ERROR!> hey,man.install bind --- ERROR!"

else

  echo "<OK> hey,man.install bind --- ok."

fi

 

if [ -f /tmp/Install_bind.sh ]

then

  rm -rf /tmp/Install_bind.sh

fi

dns自動化配置V1

https://github.com/shanks1127/dns 

相關文章
相關標籤/搜索