1、DNS是什麼?
DNS(Domain Name System),即域名系統。它使用層次結構的命名系統,將域名和IP地址相互映射,造成一個分佈式數據庫系統。html
DNS採用C-S架構,服務器端工做在UDP協議端口53和TCP協議端口53上。FQDN(Fully Qualified Domain Name)徹底限定域名,它是使用DNS的樹狀層級結構的徹底路徑域名來表示一個準確位置對應的主機。DNS提供正向解析(FQDN-->IP)和反向解析(IP-->FQDN)的功能。ios
全球有13組DNS根服務器、11臺在美國、一組在挪威、一組在日本、DNS服務重兵把守、他的安全性有多重要、一旦被攻擊全球都互聯網中斷、可想而知。nginx
查看全球13個根節點的服務:
# dig -t NS .
DNS正反向解析
DNS(Domain Name Service)域名服務、就是域名解析服務器、所謂名稱解析的過程就是某個應用程序基於某個搜索鍵在指定的數據庫中查詢、然後查詢到某些對應的鍵之後與之對應的鍵導出來的過程。
NDS是互聯網的基礎設施類的服務、這是一種協議、協議最後是要實現的、協議實現的軟件不少。能夠用BIND來實現DNS的、它運行時監聽在UDP的53號端口上、同時監聽TCP的53號端口、兩種協議的53號端口都被監聽了。web
域名:如 http://www.wangshibo.com/ --> IP地址數據庫
一級域分爲三類
組織域:.com、.org、.mil、.gov、.edu、.net、
國家域:.cn、.hk、.tw、.us、.jp、.ir、.uk
反向域:.in-addr.arpavim
2、互聯網DNS訪問模型緩存
DNS服務器採用分佈式數據結構保存着海量的名稱,那麼用戶如何快速的在互聯網上訪問哪臺服務器或者哪些服務器就能找到待解析的數據呢?安全
客戶機發起對www.kernel.org的解析請求
1)客戶機首先查看查找本地hosts文件,若是有則返回,不然進行下一步
2)客戶機查看本地緩存,是否存在本條目的緩存,若是有則直接返回,再也不向外發出請求,不然進行下一步,轉發。
3)將請求轉發本地DNS服務器。
4)查看域名是否本地解析,是則本地解析返回,不然進行下一步。
5)本地DNS服務器首先在緩存中查找,有則返回,無則進行下一步。
6)向全球某一個根域服務器發起DNS請求,根域返回org域的地址列表。
7)使用某一個org域的IP地址,發起DNS請求,org域返回kernel域服務器地址列表。
8)使用某一個kernel域IP地址,發起DNS請求,kernel域返回www.kernel.org主機的IP地址,本地DNS服務收到後,返回給客戶機。
以上客戶機和本地DNS服務器直接的查詢方式,稱爲遞歸查詢。
本地DNS服務器屢次重複查詢的方式,稱爲迭代查詢。bash
1.1 DNS的分類:
主DNS服務器:就是一臺存儲着原始資料的DNS服務器。
從DNS服務器:使用自動更新方式從主DNS服務器同步數據的DNS服務器。也成輔助DNS服務器。
緩存服務器:不負責本地解析,採用遞歸方式轉發客戶機查詢請求,並返回結果給客戶機的DNS服務器。同時緩存查詢回來的結果,也叫遞歸服務器。
轉發器:這臺DNS發現非本機負責的查詢請求時,再也不向根域發起請求,而是直接轉發給指定的一臺或者多臺服務器。自身並不緩存查詢結果。服務器
1.2 RR(Resource Record)資源記錄
DNS層級結構中,無論是節點仍是葉子節點都是資源,對這些資源中的某一個的標識使用必定格式的多字段的一條記錄來表示,這條記錄就是資源記錄RR。RR的標準記錄在RFC 1034中。
1.3 RR的組成
1.4 RR中IN類(class)常見類型(type)
1.5 經常使用指令
1)$TTL
TTL 能夠在SOA以前使用該指令,給出TTL秒數的32位整數值。
2)$ORIGIN
設定域名,它必須出如今任何一行省略書寫的RR記錄前。當一個區域文件第一次被讀取時,隱含這個命令的值爲<zone_name>.(必須是跟着一個半角句號),若是不設置它,就必須在區域文件中書寫FQDN。
例如
$ORIGIN kernel.org.
www CNAME web-server
就等同於
www.kernel.org. CNAME web-server.kernel.org.
3)@符號
@符號等價於$ORIGIN。
1.6 SOA的RDATA格式
百度的SOA
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 )
1.7 NS的RDATA格式
NSDName:DNS的FQDN
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.
1.8 MX的RDATA格式
PREFERENCE:優先級,越小越高
EXCHANGE:郵件服務器FQDN
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.
1.9 CNAME的RDATA格式
CNAME:權威名稱,FQDN
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com是正式名稱,而www.baidu.com是別名
2.0 A的RDATA格式
ADDRESS:IP V4地址
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com. 36 IN A 111.13.100.92
www.a.shifen.com. 36 IN A 111.13.100.91
2.1 PTR的RDATA格式
7.100.in-addr.arpa. IN PTR www.example.com.
3、BIND實現DNS服務
BIND是什麼
1984年,加州大學伯克利分校的幾個學生完成了Unix名稱服務的實現,起名叫作Berkeley Internet Name Domain(BIND)。目前,它是互聯網上使用最爲普遍的DNS服務軟件。
bind的發行版通常包含三個部分:域名服務器、域名解析器庫、軟件測試工具。
由於內網換了路由器,這個路由器不支持靜態域名解析服務。因此考慮本身創建一個內網DNS,也方便了開發同窗在代碼中使用域名,避免直接使用ip地址所帶來的不便和安全隱患。下面就記錄下使用BIND部署內網NDS環境(主從)操做流程:
通常來講,可使用rpm包來安裝bind,可是rpm安裝可能不符合咱們的要求、好比說想用named的線程模式、想禁用IPv六、想啓用某種特性,而rpm在編譯時沒有提供、那這時只能去手動編譯安裝了。
編譯安裝named有一個麻煩之處、全部的配置文件都得本身去創建,像/var/named/這個目錄、編譯安裝時連這個目錄都不會存在、得本身去建立這個目錄、裏面的各類配置文件、區域文件、像根的、甚至連
service啓動腳本都沒、因此不到萬不得以最好別去編譯它。最好的辦法就是yum自動安裝,這樣配置文件就會自動建立的。下面我選擇bind-9.10.5版本進行編譯安裝:
192.168.1.27 主DNS服務器
192.168.1.28 從DNS服務器
bind版本: bind-9.10.5-P3.tar.gz http://www.isc.org/downloads/bind/
1、主DNS服務器的操做
首先同步下時間 [root@DNS-Master ~]# ntpdate ntp1.aliyun.com 檢查一下安裝環境所須要的開發包組、確保所依賴的開發包組都裝有了 [root@DNS-Master ~]# yum -y groupinstall "Development Tools" [root@DNS-Master ~]# yum -y groupinstall "Server Platform Development" [root@DNS-Master ~]# yum grouplist 裝好後查看一下、最主要兩項:Development tools和Server Platform Development 這裏注意一下,咱們要去編譯安裝一個服務、首先要去看他的README、而後看他的INSTALL、大致瞭解一下有沒有咱們所須要的信息、固然咱們這裏就很少說了、直接往下走: [root@DNS-Master ~]# tar -zvxf bind-9.10.5-P3.tar.gz [root@DNS-Master ~]# cd bind-9.10.5-P3 [root@DNS-Master bind-9.10.5-P3]# ./configure --prefix=/data/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot [root@DNS-Master bind-9.10.5-P3]# make && make install --prefix=/data/bind9:指定編譯存放的路徑 --sysconfdir=/etc/named:指定配置文件存放路徑 --enable-threads:啓用了多線程的功能 前面說過、編譯安裝named什麼都得本身建立、用戶也沒有的、因此咱們得給他建立一個用戶先、並且用戶是系統用戶、要加-r、系統用戶不會給他建立家目錄的: 先建立用戶組: [root@DNS-Master ~]# groupadd -g 53 -r named [root@DNS-Master ~]# useradd -g named -r named 先去建立named的工做目錄、而後建立named.ca這個文件: [root@DNS-Master ~]# mkdir /var/named 這裏@後面的IP是能訪問互聯網的服務器、生成的數據存在到/var/named/named.ca中去(使用"yum -y install bind-utils"命令安裝dig命令) [root@DNS-Master ~]# dig -t NS . @8.8.8.8 > /var/named/named.ca //這一步很關鍵,必定要保證能解析,不然沒法forward轉發那些NS(223.5.5.5或者8.8.8.8等)的解析,好比最後沒法ping通www.baidu.com [root@DNS-Master ~]# cat /var/named/named.ca //確保named.ca文件裏有"...IN NS"解析記錄 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.2 <<>> -t NS . @8.8.8.8 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36220 ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;. IN NS ....... ....... 而後再去編輯/etc/named/named.conf的配置文件、這個文件也沒有、須要本身去編寫的: [root@DNS-Master ~]# vim /etc/named/named.conf options { listen-on port 53 { any; }; //默認是any,表示容許全部網段的主機。能夠改爲本身所在的內網網段 listen-on-v6 port 53 { ::1; }; directory "/var/named"; //定義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; }; //表示接收全部網段 recursion yes; forward first; //下面這兩行配置很重要,這個配置後,當客戶端採用咱們本身配置的內網DNS的NS服務器後,當訪問別的網站,內網NS解析不了的就轉發給8.8.8.8的DS服務器解析,保證能正常上網。 forwarders { 223.5.5.5; //阿里雲的DNS服務器 223.6.6.6; 8.8.8.8; 8.8.4.4; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." { type hint; file "named.ca"; }; zone "wangshibo.cn" { //定義一個統一的域名後綴。正向解析的區域。此處能夠加後面IN,也能夠不加IN type master; //類型屬於master、屬於本身的 file "wangshibo.cn_zone"; //指定正向解析的文件 allow-transfer {192.168.1.28;}; //容許192.168.1.28(從DNS服務器)傳送 }; zone "1.168.192.in-addr.arpa" { //定義反向解析的區域,注意寫法。此處能夠在後面加IN,也能夠不加IN type master; file "192.168.1.zone"; //指定正向解析的文件 allow-transfer {192.168.1.28;}; zone "33.168.192.in-addr.arpa" { type master; file "192.168.33.zone"; allow-transfer {192.168.1.28;}; }; zone "34.168.192.in-addr.arpa" { type master; file "192.168.34.zone"; allow-transfer {192.168.1.28;}; }; zone "64.168.192.in-addr.arpa" { type master; file "192.168.64.zone"; allow-transfer {192.168.1.28;}; }; 這裏注意一下: 若是是多個網段的反向解析,這裏就定義多個反向解析區域。 ---------------------------------------------------------------------------------------------------------- 舒適提示: DNS BIND之forwarder轉發:就是說,當本身內網NS服務器解析不了的域名,轉發到別的NS如8.8.8.8的域名服務器上進行解析。 轉發功能能夠用來在一些服務器上產生一個大的緩存,從而減小到外部服務器鏈路上的流量。它可使用在和internet沒有直接鏈接的內部域名服務器上,用來提供對外部域名的查詢。 只有當服務器是非受權的,而且緩存中沒有相關記錄時,纔會進行轉發。 1)轉發機制 當你設置了轉發器後,全部非本域的和在緩存中沒法找到的域名查詢都將轉發到設置的DNS轉發器上,由這臺DNS來完成解析工做並作緩存,所以這臺轉發器的緩存中記錄了豐富的域名信息。 於是對非本域的查詢,極可能轉發器就能夠在緩存中找到答案,避免了再次向外部發送查詢,減小了流量。 2)配置參數 1.forward 此選項只有當forwarders列表中有內容的時候纔有意義。當值是First,默認狀況下,使服務器先查詢設置的forwarders,若是它沒有獲得回答,服務器就會本身尋找答案。若是設定的是only, 服務器就只會把請求轉發到其它服務器上去。 2.forwarders 設定轉發使用的ip地址。默認的列表是空的(不轉發)。轉發也能夠設置在每一個域上,這樣全局選項中的轉發設置就不會起做用了。用戶能夠將不一樣的域轉發到服務器上,或者對不一樣的域能夠實現 forward only或first的不一樣方式,也能夠根本就不轉發。 注:轉發服務器的查詢模式必須容許遞歸查詢(即,recursion yes;),默認遞歸查詢是開啓的。 3)轉發器的配置格式 options { forward first; forwarders{ 8.8.8.8; 1.8.8.8; }; }; 注意:轉發器自己不用作任何設置,而是對須要轉發器的其餘DNS server作以上配置。還有,若是該 DNS Server 沒法聯繫到轉發器,那麼BIND會本身嘗試解析。 若是要禁止BIND在沒法聯繫到轉發器時不作任何操做,那麼你還可使用 forward only 命令,這樣BIND只能使用區的權威數據和緩存來響應查詢了( 在鏈接不到轉發器的狀況下 )。 options { forward only; forwarders{ 8.8.8.8; 1.8.8.8; }; }; 在 BIND 8.2 之後引入了一個新的特性:轉發區( forward zone ),它容許你把 DNS 配置成只有查找特定域名的時候才使用轉發器。( BIND 9 從9.1.0 纔開始有轉發區功能) 例如,你可使你的服務器將全部對test.com結尾的域名查詢都轉發給test.com的兩臺名字服務器: zone "test.com" { type forward; forwarders{ 8.8.8.8; 1.8.8.8; }; }; 還有一種轉發區設置和剛纔的設置恰好相反,它容許你設置什麼樣的查詢將不被轉發,固然這隻適用於在options語句中指定了轉發器的 DNS 。配置以下: options { forwarders{ 8.8.8.8; 1.8.8.8; }; }; zone "test.com" { type master; file "zone.test.com"; forwarders {}; }; 在test.com這個區中,你受權了幾個子域,例如:zx.test.com、lab.test.com等,那麼在test.com的權威服務器上設置轉發後,由於對 zx.test.com、lab.test.com這幾個子域不是權威, 那麼若是有對 www.zx.test.com這樣的子域的域名查詢,服務器也將轉發。這徹底是沒有必要的,由於服務器上就有zx.test.org 子域的 NS 記錄,何必再轉發。 --------------------------------------------------------------------------------------------------------------- 若是想用rndc遠程登陸能夠生成一個/etc/named/rndc.conf的配置文件: [root@DNS-Master ~]# /data/bind9/sbin/rndc-confgen -r /dev/urandom > /etc/named/rndc.conf 到這裏別忘了給named.conf和rndc.conf修改屬主屬組和權限: [root@DNS-Master ~]# chown -R root.named /data/bind9 [root@DNS-Master ~]# chown -R root.named /etc/named [root@DNS-Master ~]# chown -R root.named /var/named #另外注意:必定要保證/var/named/data的權限是named.named,這個目錄下存放的是named.run,即named解析日誌 [root@DNS-Master ~]# chmod 640 /etc/named/named.conf [root@DNS-Master ~]# chmod 640 /etc/named/rndc.conf [root@DNS-Master ~]# chmod 640 /var/named/* 爲了方便、咱們在PATH下加個的路徑、/etc/profile.d/named.sh: [root@DNS-Master ~]# cat /etc/profile.d/named.sh export PATH=/data/bind9/bin:/data/bind9/sbin:$PATH [root@DNS-Master ~]# source /etc/profile.d/named.sh 由於是一個服務、因此咱們要爲他提供一個服務腳本、之後能夠利用腳本啓動、編輯/etc/rc.d/init.d/named: [root@DNS-Master ~]# vim /etc/rc.d/init.d/named #!/bin/bash # # description: named daemon # chkconfig: - 25 88 pidFile=/data/bind9/var/run/named.pid lockFile=/var/lock/subsys/named confFile=/etc/named/named.conf [ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions start() { if [ -e $lockFile ]; then echo "named is already running..." exit 0 fi echo -n "Starting named:" daemon --pidfile "$pidFile" /data/bind9/sbin/named -u named -c "$confFile" RETVAL=$? echo if [ $RETVAL -eq 0 ]; then touch $lockFile return $RETVAL else rm -f $lockFile $pidFile return 1 fi } stop() { if [ ! -e $lockFile ]; then echo "named is stopped." fi echo -n "Stopping named:" killproc named RETVAL=$? echo if [ $RETVAL -eq 0 ];then rm -f $lockFile $pidFile return 0 else echo "Cannot stop named." failure return 1 fi } restart() { stop sleep 2 start } reload() { echo -n "Reloading named: " killproc named -HUP RETVAL=$? echo return $RETVAL } status() { if pidof named &> /dev/null; then echo -n "named is running..." success echo else echo -n "named is stopped..." success echo fi } usage() { echo "Usage: named {start|stop|restart|status|reload}" } case $1 in start) start ;; stop) stop ;; restart) restart ;; status) status ;; reload) reload ;; *) usage exit 4 ;; esac [root@DNS-Master ~]# chmod 755 /etc/rc.d/init.d/named [root@DNS-Master ~]# chkconfig named on [root@DNS-Master ~]# chkconfig --list named 下面開始配置正向解析配置: [root@DNS-Master ~]# vim /var/named/wangshibo.cn_zone //這個文件是在上面named.conf裏面定義的 $TTL 1D //定義宏,通用變量,單位爲秒(S)、小時(H),天數(D) @ IN SOA ns1.wangshibo.cn. root. ( //此處通常是寫NS域名,郵件域名,或root. 2017071111 //序列號。這個參數很重要,要特別注意!!當主DNS修改解析文件時,必需要修改這個序列號,而後重啓named服務後,從DNS才能正常同步過去!! 2H //刷新時間 10M //失敗重試時間 7D //過時時間 1D ) //否認答案時間 @ IN NS ns1.wangshibo.cn. @ IN NS ns2.wangshibo.cn. //注意域名後面的.不能忘掉! ns1 IN A 192.168.1.27 ns2 IN A 192.168.1.28 www IN A 192.168.4.21 //因爲已經定義了根域名是wangshibo.cn,因此這裏能夠直接寫域名前面的名稱,也能夠所有寫出來。好比www或者寫成www.wangshibo.cn. nginx-web01 IN A 192.168.4.21 //若是寫域名前的名稱,就不須要帶.符號,但若是是寫域名全稱,則須要帶.符號,如nginx-web01.wangshibo.cn. nginx-web02 IN A 192.168.4.22 athena-web02 IN A 192.168.33.31 www-web01 IN A 192.168.34.29 www-web02 IN A 192.168.34.30 zabbix IN A 192.168.1.21 zrx-web01 IN A 192.168.34.33 zrx-web02 IN A 192.168.34.32 athena-matrix02 IN A 192.168.33.36 lx-db126 IN A 192.168.8.126 lx-db127 IN A 192.168.8.127 反向解析的配置(這裏只列舉一個): [root@DNS-Master ~]# cat 192.168.1.zone $TTL 600 @ IN SOA ns1.wangshibo.cn. root. ( 2017071101 2H 10M 7D 1D ) @ IN NS ns1.wangshibo.cn. @ IN NS ns2.wangshibo.cn. 27 IN PTR ns1.wangshibo.cn. 28 IN PTR ns2.wangshibo.cn. 21 IN PTR www.wangshibo.cn. 21 IN PTR zp.wangshibo.cn. 29 IN PTR puppet01.wangshibo.cn. 30 IN PTR puppet02.wangshibo.cn. ------------------------------------------------------------------------------------------------------- 舒適提示1: 對於主DNS的正反向解析文件中的序列號,每當作一次修改後,必需要同時修改這個序列號,這樣才能觸發主從同步機制!而後重啓named服務,從DNS服務器那邊才能同步過去,不然不能完成主從同步! ------------------------------------------------------------------------------------------------------- 而後修改一下權限和屬主屬組: [root@DNS-Master ~]# chown root:named /var/named/wangshibo.cn_zone [root@DNS-Master ~]# chmod 640 /var/named/wangshibo.cn_zone 檢查主配置文件和區域數據文件有沒有語法錯誤: [root@DNS-Master ~]# named-checkconf //這個是檢查主配置文件語法的 [root@DNS-Master ~]# 這個是檢查區域數據文件語法的、指定區域和指定文件 [root@DNS-Master ~]# named-checkzone "wangshibo.cn" /var/named/wangshibo.cn_zone zone wangshibo.cn/IN: loaded serial 2017071111 OK 啓動服務後、解析域名 [root@DNS-Master ~]# /etc/init.d/named start [root@DNS-Master ~]# /etc/init.d/named status [root@DNS-Master ~]# /etc/init.d/named restart 而後修改本身的DNS,進行正反向解析 [root@DNS-Master ~]# cat /etc/resolv.conf domain wangshibo.cn //域名和查詢都要寫成內網DNS的主域名 search wangshibo.cn nameserver 192.168.1.27 [root@DNS-Master ~]# ping zrx-web02 PING zrx-web02.wangshibo.cn (192.168.34.32) 56(84) bytes of data. 64 bytes from 192.168.34.32: icmp_seq=1 ttl=62 time=1.11 ms 64 bytes from 192.168.34.32: icmp_seq=2 ttl=62 time=0.542 ms [root@BJLX_16_27_V named]# dig -t A www.wangshibo.cn @192.168.1.27 ; <<>> DiG 9.10.5-P3 <<>> -t A www.wangshibo.cn @192.168.1.27 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32976 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.wangshibo.cn. IN A ;; ANSWER SECTION: www.wangshibo.cn. 86400 IN A 192.168.4.21 ;; AUTHORITY SECTION: wangshibo.cn. 86400 IN NS ns2.wangshibo.cn. wangshibo.cn. 86400 IN NS ns1.wangshibo.cn. ;; ADDITIONAL SECTION: ns1.wangshibo.cn. 86400 IN A 192.168.1.27 ns2.wangshibo.cn. 86400 IN A 192.168.1.28 ;; Query time: 0 msec ;; SERVER: 192.168.1.27#53(192.168.1.27) ;; WHEN: Thu Jul 20 10:45:15 CST 2017 ;; MSG SIZE rcvd: 124 [root@BJLX_16_27_V named]# nslookup > set q=A > www Server: 192.168.1.27 Address: 192.168.1.27#53 Name: www.wangshibo.cn Address: 192.168.4.21 > zabbix Server: 192.168.1.27 Address: 192.168.1.27#53 Name: zabbix.wangshibo.cn Address: 192.168.1.21 > lx-db126 Server: 192.168.1.27 Address: 192.168.1.27#53 Name: lx-db126.wangshibo.cn Address: 192.168.8.126 > 192.168.1.27 Server: 192.168.1.27 Address: 192.168.1.27#53 27.16.192.168.in-addr.arpa name = ns1.wangshibo.cn. > 192.168.1.21 Server: 192.168.1.27 Address: 192.168.1.27#53 21.16.192.168.in-addr.arpa name = www.wangshibo.cn. 21.16.192.168.in-addr.arpa name = zp.wangshibo.cn. > 最後,客戶機就能夠修改本身的/etc/resolv.conf文件,而後使用這個內網DNS了 [root@Nginx-web1 ~]# cat /etc/resolv.conf domain wangshibo.cn //域名和查詢都要寫成內網DNS的主域名 search wangshibo.cn nameserver 192.168.1.27 [root@Nginx-web1 ~]# ping zabbix PING zabbix.wangshibo.cn (192.168.1.21) 56(84) bytes of data. 64 bytes from www.wangshibo.cn (192.168.1.21): icmp_seq=1 ttl=64 time=0.282 ms 64 bytes from www.wangshibo.cn (192.168.1.21): icmp_seq=2 ttl=64 time=0.223 ms 64 bytes from www.wangshibo.cn (192.168.1.21): icmp_seq=3 ttl=64 time=0.177 ms
named服務啓動可能會出現下面兩個錯誤
1)報錯: open: /etc/named/rndc.key: file not found 解決辦法: [root@DNS-Master ~]# rndc-confgen -r /dev/urandom -a wrote key file "/etc/named/rndc.key" [root@DNS-Master ~]# chown named.named /etc/named/rndc.key 2)報錯 isc_stdio_open 'data/named.run' failed: file not found 解決辦法: [root@DNS-Master ~]# cd /var/named/ [root@DNS-Master named]# mkdir data [root@DNS-Master named]# chown -R named.named data
2、從DNS服務器的操做
[root@DNS-Slave ~]# hwclock -s [root@DNS-Slave ~]# yum -y groupinstall "Development Tools" [root@DNS-Slave ~]# yum -y groupinstall "Server Platform Development" [root@DNS-Slave ~]# yum grouplist [root@DNS-Slave ~]# tar -zvxf bind-9.10.5-P3.tar.gz [root@DNS-Slave ~]# cd bind-9.10.5-P3 [root@DNS-Slave bind-9.10.5-P3]# ./configure --prefix=/data/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot [root@DNS-Slave bind-9.10.5-P3]# make && make install [root@DNS-Slave ~]# groupadd -g 53 -r named [root@DNS-Slave ~]# useradd -g named -r named [root@DNS-Slave ~]# mkdir /var/named [root@DNS-Slave ~]# dig -t NS . @8.8.8.8 > /var/named/named.ca [root@DNS-Slave ~]# vim /etc/named/named.conf options { listen-on port 53 { 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"; allow-query { any; }; recursion yes; forward first; forwarders { 8.8.8.8; 8.8.4.4; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; zone "wangshibo.cn" IN { type slave; file "wangshibo.cn_zone"; masters {172.168.1.27;}; }; zone "16.29.172.in-addr.arpa" IN { type slave; file "172.168.1.zone"; masters {172.168.1.27;}; }; 將主DNS的/etc/init.d/named啓動腳本拷貝到從DNS服務器上。 [root@DNS-Slave ~]# cat /etc/init.d/named #!/bin/bash # # description: named daemon # chkconfig: - 25 88 pidFile=/data/bind9/var/run/named.pid lockFile=/var/lock/subsys/named confFile=/etc/named/named.conf [ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions start() { if [ -e $lockFile ]; then echo "named is already running..." exit 0 fi echo -n "Starting named:" daemon --pidfile "$pidFile" /data/bind9/sbin/named -u named -c "$confFile" RETVAL=$? echo if [ $RETVAL -eq 0 ]; then touch $lockFile return $RETVAL else rm -f $lockFile $pidFile return 1 fi } stop() { if [ ! -e $lockFile ]; then echo "named is stopped." fi echo -n "Stopping named:" killproc named RETVAL=$? echo if [ $RETVAL -eq 0 ];then rm -f $lockFile $pidFile return 0 else echo "Cannot stop named." failure return 1 fi } restart() { stop sleep 2 start } reload() { echo -n "Reloading named: " killproc named -HUP RETVAL=$? echo return $RETVAL } status() { if pidof named &> /dev/null; then echo -n "named is running..." success echo else echo -n "named is stopped..." success echo fi } usage() { echo "Usage: named {start|stop|restart|status|reload}" } case $1 in start) start ;; stop) stop ;; restart) restart ;; status) status ;; reload) reload ;; *) usage exit 4 ;; esac 啓動named服務 [root@DNS-Slave ~]# /etc/init.d/named start/status/restart 啓動後,就會發如今從DNS的/var/named目錄下自動產生了wangshibo.cn_zone和192.168.1.zone的正反向解析文件 注意:當主DNS修改解析配置時,只須要將解析配置文件中的序列號改動下,就會自動觸發主從同步機制! [root@DNS-Slave ~]# ls 192.168.1.zone wangshibo.cn_zone data db-9TWfGmpO db-kHbKJg9L named.ca 而後修改從的本身的DNS [root@DNS-Slave ~]# cat /etc/resolv.conf search wangshibo.cn nameserver 192.168.1.28 而後測試正反向解析: [root@DNS-Slave ~]# ping athena-web02 PING athena-web02.wangshibo.cn (192.168.33.31) 56(84) bytes of data. 64 bytes from 192.168.33.31: icmp_seq=1 ttl=62 time=0.712 ms 64 bytes from 192.168.33.31: icmp_seq=2 ttl=62 time=0.442 ms [root@DNS-Slave ~]# nslookup > lx-db127 Server: 192.168.1.28 Address: 192.168.1.28#53 Name: lx-db127.wangshibo.cn Address: 172.29.8.127 > 192.168.1.28 Server: 192.168.1.28 Address: 192.168.1.28#53 28.16.29.172.in-addr.arpa name = ns2.wangshibo.cn. 這樣,客戶機能夠將本身的DNS修改成上面配置的內網主從DNS地址 [root@test ~]# cat /etc/resolv.conf #domain wangshibo.cn search wangshibo.cn nameserver 172.168.1.27 nameserver 172.168.1.28
也能夠同時在兩臺主機上部署同樣的配置(不須要如上配置主從同步),而後經過腳本進行正反向解析配置的同步!
=====以下是曾經管理過的一個內網DNS配置(兩臺DNS)實例=====
兩臺DNS服務器的信息以下 dns01.kevin.cn 10.0.11.21 dns02.kevin.cn 10.0.11.22 1、第一臺DNS服務器(10.0.11.21)========================================== [root@dns01 ~]# hostname dns01.kevin.cn [root@dns01 ~]# cd /etc/named/ [root@dns01 named]# ls bind.keys named.conf rndc.conf rndc.key [root@dns01 named]# cat named.conf options { listen-on port 53 { 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"; allow-query { any; }; recursion yes; forward first; forwarders { 223.5.5.5; 223.6.6.6; 8.8.8.8; 8.8.4.4; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." { type hint; file "named.ca"; }; zone "kevin.cn" { type master; file "kevin.cn_zone"; }; zone "11.0.10.in-addr.arpa" { type master; file "10.0.11.zone"; }; zone "52.0.10.in-addr.arpa" { type master; file "10.0.52.zone"; }; zone "40.0.10.in-addr.arpa" { type master; file "10.0.40.zone"; }; [root@dns01 named]# cd /var/named/ [root@dns01 named]# ls 10.0.11.zone 10.0.40.zone named.ca 10.0.52.zone data kevin.cn_zone [root@dns01 named]# cat kevin.cn_zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. ns1 IN A 10.0.11.21 ns2 IN A 10.0.11.22 dns01 IN A 10.0.11.21 dns02 IN A 10.0.11.22 inner-lb01 IN A 10.0.11.23 inner-lb02 IN A 10.0.11.24 bl-db01 IN A 10.0.40.80 bl-db02 IN A 10.0.40.81 bl-db82 IN A 10.0.40.82 nc-ftp01 IN A 10.0.52.23 nc-ftp02 IN A 10.0.52.24 nc-ftp IN A 10.0.52.25 nc-db20 IN A 10.0.40.20 nc-db121 IN A 10.0.40.121 nc-db122 IN A 10.0.40.122 lvs01 IN A 10.0.52.200 lvs02 IN A 10.0.52.201 ........ ........ [root@dns01 named]# cat 10.0.40.zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. 80 IN PTR bl-db01.kevin.cn. 81 IN PTR bl-db02.kevin.cn. 82 IN PTR bl-db82.kevin.cn. 20 IN PTR nc-db20.kevin.cn. 121 IN PTR nc-db121.kevin.cn. 122 IN PTR nc-db122.kevin.cn. [root@dns01 named]# cat 10.0.11.zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. 21 IN PTR ns1.kevin.cn. 22 IN PTR ns2.kevin.cn. 21 IN PTR dns01.kevin.cn. 22 IN PTR dns02.kevin.cn. 23 IN PTR inner-lb01.kevin.cn. 24 IN PTR inner-lb02.kevin.cn. [root@dns01 named]# cat 10.0.52.zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. 21 IN PTR nc-app01.kevin.cn. 22 IN PTR nc-app02.kevin.cn. 23 IN PTR nc-ftp01.kevin.cn. 24 IN PTR nc-ftp02.kevin.cn. 25 IN PTR nc-ftp.kevin.cn. 200 IN PTR lvs01.kevin.cn. 201 IN PTR lvs02.kevin.cn. --------------------------------------------------------------------------------------------- 在10.0.11.21服務器上編寫腳本,實現: 1)正向解析的A記錄添加後,自動生成反向解析的PTR記錄 2)10.0.11.21服務器上的DNS正反向解析配置同步到10.0.11.22服務器的DNS配置中 3)作10.0.11.21到10.0.11.22的ssh無密碼信任關係 [root@dns01 ~]# cd /data/dns_rsync/ [root@dns01 dns_rsync]# ls build_ptr.sh dns_rsync.sh ptr.zone [root@dns01 dns_rsync]# cat ptr.zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. [root@dns01 dns_rsync]# cat dns_rsync.sh #!/bin/bash rsync -e "ssh -p6666" -avpgolr /var/named/kevin.cn_zone root@10.0.11.22:/var/named rsync -e "ssh -p6666" -avpgolr /var/named/10.0.* root@10.0.11.22:/var/named rsync -e "ssh -p6666" -avpgolr /etc/named/named.conf root@10.0.11.22:/etc/named/ /usr/bin/ssh -p6666 root@10.0.11.22 "/etc/init.d/named restart" [root@dns01 dns_rsync]# cat build_ptr.sh #!/bin/bash cd /var/named for ipp in 11 40 52; do echo $ippp cat /data/dns_rsync/ptr.zone > 10.0.$ipp.zone cat /var/named/kevin.cn_zone |grep "10.0.$ipp"|awk '{print $4,"\t\tIN","\tPTR","\t"$1".kevin.cn."}'|sed "s#10.0.$ipp.##" >> 10.0.$ipp.zone done /etc/init.d/named restart /bin/bash -x /data/dns_rsync/dns_rsync.sh 當10.0.11.21服務器上的DNS正向解析配置後,執行"sh -x /data/dns_rsync/build_ptr.sh"命令後,就會自動生成DNS反向解析配置,並自動同步到10.0.11.22機器上。 --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- 另外,對於新增的服務器,管理方式以下: 1)在10.0.11.21的DNS正向解析裏添加域名配置,做爲其主機域名。 2) 在10.0.11.21服務器上經過expect方式跟新服務器作批量信任。expect的部署參考:http://www.cnblogs.com/kevingrace/p/5900303.html 3)在10.0.11.21服務器上經過腳本批量配置新服務器的DNS和主機名。將新服務的DNS地址設置爲10.0.11.21和10.0.11.22後,主機域名就能夠直接解析了。 4)信任服務器的密碼默認爲123456 [root@dns01 mnt]# ls hostname.sh ip.list noscp.exp set_dns.sh sshkey.exp sshkey.sh [root@dns01 mnt]# cat sshkey.sh #!/bin/bash for ip in `cat /mnt/ip.list` do /mnt/sshkey.exp $ip root 123456 |grep ssh-rsa >> ~/.ssh/authorized_keys /mnt/noscp.exp ~/.ssh/authorized_keys $ip:~/.ssh root 123456 done [root@dns01 mnt]# cat sshkey.exp #!/usr/bin/expect #sshkey.exp if {$argc<3} { puts stderr "Usage: $argv0 host user passwd " exit 1 } set host [ lindex $argv 0 ] set user [ lindex $argv 1 ] set pwd [ lindex $argv 2 ] set timeout 30 #spawn ssh ${user}@${host} "rm -rf ~/.ssh/id_rsa*" # #expect { # "*yes/no" { send "yes\r"; exp_continue } # "*password:" { send "$pwd\r"; exp_continue } #} spawn ssh ${user}@${host} "ssh-keygen -t rsa" expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$pwd\r"; exp_continue } "Enter file in which to save the key*" { send "\n\r"; exp_continue } "Overwrite*" { send "y\n"; exp_continue } "Enter passphrase (empty for no passphrase):" { send "\n\r"; exp_continue } "Enter same passphrase again:" { send "\n\r" } } spawn ssh ${user}@${host} "cat ~/.ssh/id_rsa.pub" expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$pwd\r" } } expect eof [root@dns01 mnt]# cat ip.list 10.0.11.23 10.0.11.24 10.0.11.25 10.0.40.81 10.0.40.82 10.0.52.200 10.0.52.201 [root@dns01 mnt]# cat set_dns.sh #!/bin/bash for i in `cat /mnt/ip.list` do ssh ${i} '>/etc/resolv.conf && echo "domain kevin.cn" >> /etc/resolv.conf && echo "search kevin.cn" >> /etc/resolv.conf && echo "nameserver 10.0.11.21" >> /etc/resolv.conf && echo "nameserver 10.0.11.22" >> /etc/resolv.conf && chattr +ai /etc/resolv.conf' done [root@dns01 mnt]# cat hostname.sh #!/bin/bash for i in `cat /mnt/ip.list` do domain=$(cat /var/named/kevin.cn_zone|grep -w ${i}|awk '{print $1}').kevin.cn ssh $i "hostname $domain" ssh $i "/bin/sed -i "/HOSTNAME/d" /etc/sysconfig/network" ssh $i "echo HOSTNAME=$domain >>/etc/sysconfig/network" ssh $i "echo "$i $domain" >> /etc/hosts" done ------------------------------------------------------------------------------------ 待經過上面腳本修改新服務器的主機名和DNS地址後,可使用下面的命令修改密碼和ssh配置 echo '4GF2a5mr!GkU$njS' |passwd --stdin root sed -i 's/#Port 22/Port 6666/g' /etc/ssh/sshd_config sed -i 's/# Port 22/Port 6666/g' /etc/ssh/ssh_config /etc/init.d/sshd restart ------------------------------------------------------------------------------------ 1、第二臺DNS服務器(10.0.11.22)========================================== [root@dns02 named]# ls bind.keys named.conf rndc.conf rndc.key [root@dns02 named]# cat named.conf options { listen-on port 53 { 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"; allow-query { any; }; recursion yes; forward first; forwarders { 223.5.5.5; 223.6.6.6; 8.8.8.8; 8.8.4.4; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." { type hint; file "named.ca"; }; zone "kevin.cn" { type master; file "kevin.cn_zone"; }; zone "11.0.10.in-addr.arpa" { type master; file "10.0.11.zone"; }; zone "52.0.10.in-addr.arpa" { type master; file "10.0.52.zone"; }; zone "40.0.10.in-addr.arpa" { type master; file "10.0.40.zone"; }; [root@dns02 named]# cd /var/named/ [root@dns02 named]# ls 10.0.11.zone 10.0.40.zone named.ca 10.0.52.zone data kevin.cn_zone [root@dns02 named]# cat kevin.cn_zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. ns1 IN A 10.0.11.21 ns2 IN A 10.0.11.22 dns01 IN A 10.0.11.21 dns02 IN A 10.0.11.22 inner-lb01 IN A 10.0.11.23 inner-lb02 IN A 10.0.11.24 bl-db01 IN A 10.0.40.80 bl-db02 IN A 10.0.40.81 bl-db82 IN A 10.0.40.82 nc-ftp01 IN A 10.0.52.23 nc-ftp02 IN A 10.0.52.24 nc-ftp IN A 10.0.52.25 nc-db20 IN A 10.0.40.20 nc-db121 IN A 10.0.40.121 nc-db122 IN A 10.0.40.122 lvs01 IN A 10.0.52.200 lvs02 IN A 10.0.52.201 ........ ........ [root@dns02 named]# cat 10.0.40.zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. 80 IN PTR bl-db01.kevin.cn. 81 IN PTR bl-db02.kevin.cn. 82 IN PTR bl-db82.kevin.cn. 20 IN PTR nc-db20.kevin.cn. 121 IN PTR nc-db121.kevin.cn. 122 IN PTR nc-db122.kevin.cn. [root@dns02 named]# cat 10.0.11.zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. 21 IN PTR ns1.kevin.cn. 22 IN PTR ns2.kevin.cn. 21 IN PTR dns01.kevin.cn. 22 IN PTR dns02.kevin.cn. 23 IN PTR inner-lb01.kevin.cn. 24 IN PTR inner-lb02.kevin.cn. [root@dns02 named]# cat 10.0.52.zone $TTL 600 @ IN SOA ns.kevin.cn. root. ( 2017071114 2H 10M 7D 1D ) @ IN NS ns1.kevin.cn. @ IN NS ns2.kevin.cn. 21 IN PTR nc-app01.kevin.cn. 22 IN PTR nc-app02.kevin.cn. 23 IN PTR nc-ftp01.kevin.cn. 24 IN PTR nc-ftp02.kevin.cn. 25 IN PTR nc-ftp.kevin.cn. 200 IN PTR lvs01.kevin.cn. 201 IN PTR lvs02.kevin.cn.
===========踩過的一個坑===============
在dns的正向解析配置文件裏添加一個解析,以下: [root@dns01 named]# vim kevin.cn_zone ...... uatfastdfs_tracker01 IN A 10.0.52.86 uatfastdfs_storage01 IN A 10.0.52.87 而後成功重啓了named服務 [root@dns01 named]# /etc/init.d/named start 最後,發現上面記錄添加以後,全部機器解析都除了問題,都不能正常解析kevin.cn的域名了!!! 最後排查日誌發現(最好在重啓named服務的時候觀察日誌)錯誤以下: [root@dns01 named]# tail -f /var/log/messages ...... Mar 1 21:39:50 localhost named[11111]: zone 50.16.172.in-addr.arpa/IN: loading from master file 192.168.10.zone failed: bad name (check-names) Mar 1 21:39:50 localhost named[11111]: zone 50.16.172.in-addr.arpa/IN: not loaded due to errors. Mar 1 21:39:50 localhost named[11111]: veredholdings.cn_zone:87: uatfastdfs_storage01.veredholdings.cn: bad owner name (check-names) Mar 1 21:39:50 localhost named[11111]: zone veredholdings.cn/IN: loading from master file veredholdings.cn_zone failed: bad owner name (check-names) 產生緣由: 在添加正反向解決記錄的時候,域名不能使用_等特殊字符,可使用-,可是毫不能使用_,由於DNS服務不能識別特殊字符命名的域名。 解決辦法:修改域名便可 [root@dns01 named]# vim kevin.cn_zone ...... uatfastdfs-tracker01 IN A 10.0.52.86 uatfastdfs-storage01 IN A 10.0.52.87 [root@dns01 named]# /etc/init.d/named start
=============DNS壓力測試(queryperf)==================
bind有專門的工具能夠將配置文件的數據放入到數據庫中,對於bind來說,最多見的壓力測試軟件是querypery。此工具是bind源碼包自帶的一個工具,但安裝完bind以後頗有可能官方的包並無提供,這就須要咱們本身去手動安裝了。
# wget https://www.isc.org/downloads/file/bind-9-9-4-p1-tar-gz/?version=tar.gz # cd bind-9.9.4-P1/contrib/queryperf/ # make gcc -DHAVE_CONFIG_H -c queryperf.c gcc -DHAVE_CONFIG_H queryperf.o -lnsl -lresolv -lm -o queryperf #不用直接make install 將queryperf 拷貝至/bin/目錄便可 # cp queryperf /bin/ 使用queryperf 首先建立文件,指定須要測試的域名和記錄類型: [root@dns01 ~]# cat /root/test www.test.com A a.test.com A b.test.com A c.test.com A d.test.com A aa.test.com A bb.test.com A cc.test.com A test.com NS 192.168.7.9 PTR 192.168.7.19 PTR 192.168.7.29 PTR 192.168.7.39 PTR 使用-d指定數據文件,作壓力測試的時候,要對其解析哪些記錄爲基準型測試,-s 指定須要壓測的服務器IP [root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127 DNS Query Performance Testing Tool Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $ [Status] Processing input data #正在讀取數據 [Status] Sending queries (beginning with 192.29.16.127) #發送查詢請求 [Status] Testing complete Statistics: Parse input file: once Ended due to: reaching end of file Queries sent: 3 queries #共發起了多少請求 Queries completed: 3 queries #完成了多少請求 Queries lost: 0 queries #丟失多少請求 Queries delayed(?): 0 queries RTT max: 0.054551 sec #將請求發出去響應回過來最大的一次耗時多少 RTT min: 0.000263 sec #最短一次 RTT average: 0.018360 sec #平均多久 RTT std deviation: 0.025597 sec RTT out of range: 0 queries Percentage completed: 100.00% #完成的比例 Percentage lost: 0.00% #丟失的比例 Started at: Tue Jul 25 11:59:15 2017 Finished at: Tue Jul 25 11:59:15 2017 Ran for: 0.054570 seconds Queries per second: 54.975261 qps #每秒鐘平均能完成多少個請求 上面測試的數量太少,能夠將/root/test文件的信息填滿: [root@dns01 ~]# cat /root/test www.test.com A a.test.com A b.test.com A c.test.com A d.test.com A aa.test.com A bb.test.com A cc.test.com A mail.test.com A wang.test.com A #這個域名不存在 ..... test.com NS 192.168.7.9 PTR 192.168.7.19 PTR 192.168.7.29 PTR 192.168.7.39 PTR 192.168.7.3 PTR 192.168.7.13 PTR 192.168.7.23 PTR 192.168.7.33 PTR ...... [root@dns01 ~]# wc -l /root/test 9877764 /root/test [root@dns01 ~]# du -sh /root/test 104M /root/test 再次進行壓力測試 [root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127 DNS Query Performance Testing Tool Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $ [Status] Processing input data [Status] Sending queries (beginning with 192.29.16.127) [Status] Testing complete Statistics: Parse input file: once Ended due to: reaching end of file [Timeout]Query timed out: msg id 62 [Timeout]Query timed out: msg id 64 [Timeout]Query timed out: msg id 71 [Timeout]Query timed out: msg id 73 [Timeout]Query timed out: msg id 80 [Timeout]Query timed out: msg id 82 [Timeout]Query timed out: msg id 89 [Timeout]Query timed out: msg id 91 [Timeout]Query timed out: msg id 98 [Timeout]Query timed out: msg id 100 [Status]Testing complete Statistics: Parse input file: once Ended due to: reaching end of file Queries sent: 2364 queries Queries completed: 2364 queries Queries lost: 0 queries Queries delayed(?): 0 queries RTT max: 0.347522sec RTT min: 0.000083 sec RTT average: 0.002009 sec RTT std deviation: 0.022389 sec RTT out of range: 0 queries Percentage completed: 100.00% Percentage lost: 0.00% Started at: Wed Dec 18 20:40:35 2013 Finished at: Wed Dec 18 20:40:40 2013 Ran for: 5.024620 seconds Queries per second: 470.483340 qps #能夠看到如下有不少包處於丟失狀態 [Status]Processing input data [Status]Sending queries (beginning with 10.0.10.60) [Timeout]Query timed out: msg id 62 [Timeout]Query timed out: msg id 64 [Timeout]Query timed out: msg id 71 [Timeout]Query timed out: msg id 73 [Timeout]Query timed out: msg id 80 #----------略------------------ [Status]Testing complete 可是在本地測試不用考慮服務器端的帶寬,查看本地服務器負載狀況: [root@dns01 ~]# uptime 20:51:07 up 2:27, 2 users, load average: 2.20, 0.00, 0.00 發現利用率也不高,使用vmstat查看實時負載狀況,能夠看到,阻塞隊列正常,bi 和 bo量偶爾會有因此中斷和上下文切換量也很小,因此這些都不是問題,但是響應速度依然很是的慢 [root@dns01 ~]# vmstat 1 procs-----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 68720 53988 214796 0 0 26 15 25 23 0 0 96 3 0 0 0 0 68712 53988 214800 0 0 0 0 18 20 0 0 100 0 0 0 0 0 68712 53988 214800 0 0 0 0 19 13 0 0 100 0 0 0 0 0 68712 53988 214800 0 0 0 0 15 14 0 1 99 0 0 技術壓力測試,切換到其它服務器對其進行壓力測試 [root@nginx-web1 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127 依舊如此有一堆的timeout Warning:RTT is out of range: 29.990839 [query=192.29.16.127/12, rcode=2] Warning:RTT is out of range: 24.962086 [query=192.29.16.127/12, rcode=2] Warning:RTT is out of range: 24.962383 [query=192.29.16.127/12, rcode=2] [Timeout]Query timed out: msg id 223 [Timeout]Query timed out: msg id 224 [Timeout]Query timed out: msg id 212 [Timeout]Query timed out: msg id 193 接下來在被測試的服務器上使用rndcstatus查看named服務器的運行情況 [root@dns01 ~]# rndc status version:9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 CPUsfound: 1 workerthreads: 1 numberof zones: 21 debuglevel: 0 xfersrunning: 0 xfersdeferred: 0 soaqueries in progress: 0 querylogging is OFF #query log是關閉的 recursiveclients: 20/0/1000 #收到20個遞歸請求 tcp clien沒有 tcpclients: 0/100 serveris up and running 懷疑是不是反向解析的問題,將/root/test包含反向解析的行所有使用sed刪除 [root@dns01 ~]# sed -i '/^10/d' /root/test [root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127 DNSQuery Performance Testing Tool Version:$Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $ [Status]Processing input data [Status]Sending queries (beginning with 192.29.16.127) [Timeout]Query timed out: msg id 1 [Timeout]Query timed out: msg id 2 [Timeout]Query timed out: msg id 3 [Timeout]Query timed out: msg id 4 [Timeout]Query timed out: msg id 5 [Timeout]Query timed out: msg id 6 [Timeout]Query timed out: msg id 7 [Timeout]Query timed out: msg id 8 [Timeout]Query timed out: msg id 9 Statistics: Parse input file: once Ended due to: reaching end of file Queries sent: 4548 queries Queries completed: 4548 queries Queries lost: 0 queries Queries delayed(?): 0queries RTT max: 0.004176sec RTT min: 0.000126 sec RTT average: 0.001663 sec RTT std deviation: 0.000515 sec RTT out of range: 0 queries Percentage completed: 100.00% Percentage lost: 0.00% Started at: Wed Dec 18 20:59:48 2013 Finished at: Wed Dec 18 20:59:48 2013 Ran for: 0.405095 seconds Queries per second: 11226.996137 qps #總共每秒能夠承受11226個查詢請求 進一步壓力測試: 能夠看到,此服務器負載比剛纔高出了一些 [root@dns01 ~]# wc -l /root/test 13633842/root/test [root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127 [root@test2~]# vmstat 1 procs-----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 314332 12800 60260 0 0 2 0 7686 59 25 95 0 0 0 1 0 0 314332 12800 60260 0 0 0 0 7731 36 30 89 1 0 0 1 0 0 314332 12800 60260 0 0 0 0 7494 40 36 84 0 0 0 得出結果: DNSQuery Performance Testing Tool Version:$Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $ [Status]Processing input data [Status]Sending queries (beginning with 192.29.16.127) [Status]Testing complete Statistics: Parse input file: once Ended due to: reaching end of file Queries sent: 3774840 queries Queries completed: 3774840 queries Queries lost: 0 queries Queries delayed(?): 0 queries RTT max: 0.041022sec RTT min: 0.000037 sec RTT average: 0.001813 sec RTT std deviation: 0.000452 sec RTT out of range: 0 queries Percentage completed: 100.00% Percentage lost: 0.00% Started at: Wed Dec 18 21:04:24 2013 Finished at: Wed Dec 18 21:10:16 2013 Ran for: 351.908312 seconds Queries per second: 8726.771353 qps 能夠將查詢日誌打開,再次進行壓力測試,這裏就不作演示了,打開後能夠經過iostat 來查看負載狀況,每秒讀寫的數據量多少,頗有可能在某個磁盤上不停的寫入數據,因此正是由於io子系統比較慢
=================dnstop工具=================
除了queryperf以外,還可使用dnstop工具監視bind服務性能狀態。使用dnstop能夠用來實現觀測dns響應請求查詢時候的性能,用來監控DNS流量狀況。
在維護DNS服務器時,用戶每每但願知道究竟是哪些用戶在使用DNS服務器,同時也但願能對DNS狀態查詢作一個統計,以及時地知道DNS的工做狀況和狀態。
在傳統的方式下,用戶一般使用的是tcpdump等開源工具來進行抓包並經過查看53端口的流量來查看DNS數據包。因爲tcpdump並無針對DNS流量進行特殊定製,
所以使用起來可能不是很是方便。所以,用戶可使用專用於DNS的dnstop工具查詢DNS服務器狀態。
dnstop是一種很是優秀的開源軟件,用戶能夠到網站http://dns.measurement-factory.com/tools/dnstop/src/上進行下載使用。
因爲該軟件依賴tcpdump和pcap抓包庫(libpcap)對網絡上傳輸的數據包進行截獲和過濾,因此用戶須要確保系統安裝相應軟件後才能正常安裝和使用dnstop。
一般狀況下,這兩種必須的庫都已經在系統中預裝好了,使用下面的命令安裝dnstop便可:
安裝dnstop [root@dns01 ~]# wget http://dns.measurement-factory.com/tools/dnstop/src/dnstop-20140915.tar.gz [root@dns01 ~]# tar -zvxf dnstop-20140915.tar.gz [root@dns01 ~]# cd dnstop-20140915 [root@dns01 dnstop-20140915]# ./configure [root@dns01 dnstop-20140915]# make && makeinstall 安裝成功後,能夠查看經過相應的網絡接口來監控DNS網絡流量。以下所示,開始抓包分析,對eth0接口的請求進行分析: [root@dns01 ~]# dnstop -4 -Q eth0 #回車出現下面信息。 Queries: 0 new, 1 total Tue Jul 25 13:21:47 2017 Sources Count % cum% 而後在另外一個終端上使用queryperf進行壓力測試,觀察下面狀況 [root@dns01 ~]# /data/bind9/bin/queryperf -s 192.29.16.127 -d /root/test 或者對其作dig查詢 [root@dns01 ~]# dig -t A www.test.com @192.29.16.127 ; <<>> DiG 9.10.5-P3 <<>> -t A www.test.com @192.29.16.127 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18840 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.test.com. IN A ;; ANSWER SECTION: www.test.com. 600 IN A 23.22.28.187 ;; Query time: 54 msec ;; SERVER: 192.29.16.127#53(192.29.16.127) ;; WHEN: Tue Jul 25 13:24:42 CST 2017 ;; MSG SIZE rcvd: 57 再次查看dnstop監測狀態: [root@dns01 ~]# dnstop -4 -Q eth0 Queries: 0 new, 16 total Tue Jul 25 13:25:43 2017 Sources Count % cum% ------------ --------- ------ ------ 192.29.34.27 10 62.5 62.5 192.29.16.27 5 31.2 93.8 192.29.16.21 1 6.2 100.0 在運行dnstop的過程當中,能夠鍵入<S>、<D>、<T>、<1>、<2>、<Ctr+R>、<Ctr+X>等方式以交互方式來顯示不一樣的信息: S:記錄發送DNS查詢的客戶端IP地址列表 D:記錄DNS查詢的目的服務器的IP地址表 T:記錄查詢詳細類型 1:記錄查詢的頂級域名 2:記錄查詢的二級域名 Ctr+R:從新紀錄 Ctr+X:退出 總結: 1)抓包時能夠在NS服務器上對測試機進行壓力測試觀測效果); 2)建議作壓力測試的時候對目標主機作分佈式壓力測試,效果更佳;