一、DNS是什麼?
DNS(Domain Name System),即域名系統。它使用層次結構的命名系統,將域名和IP地址相互對映,形成一個分散式資料庫系統。
DNS採用C-S架構,伺服器端工作在UDP協議埠53和TCP協議埠53上。FQDN(Fully Qualified Domain Name)完全限定域名,它是使用DNS的樹狀層級結構的完全路徑域名來表示一個準確位置對應的主機。DNS提供正向解析(FQDN-->IP)和反向解析(IP-->FQDN)的功能。
全球有13組DNS根伺服器、11臺在美國、一組在挪威、一組在日本、DNS服務重兵把守、他的安全性有多重要、一旦被攻擊全球都網際網路中斷、可想而知。
檢視全球13個根節點的服務:
# dig -t NS .
DNS正反向解析
DNS(Domain Name Service)域名服務、就是域名解析伺服器、所謂名稱解析的過程就是某個應用程式基於某個搜尋鍵在指定的資料庫中查詢、而後查詢到某些對應的鍵以後與之對應的鍵匯出來的過程。
NDS是網際網路的基礎設施類的服務、這是一種協議、協議最後是要實現的、協議實現的軟體很多。可以用BIND來實現DNS的、它執行時監聽在UDP的53號埠上、同時監聽TCP的53號埠、兩種協議的53號埠都被監聽了。
域名:如 http://www.wangshibo.com/ --> IP地址
一級域分為三類
組織域:.com、.org、.mil、.gov、.edu、.net、
國家域:.cn、.hk、.tw、.us、.jp、.ir、.uk
反向域:.in-addr.arpa
二、網際網路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伺服器多次重複查詢的方式,稱為迭代查詢。
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.
三、BIND實現DNS服務
BIND是什麼
1984年,加州大學伯克利分校的幾個學生完成了Unix名稱服務的實現,起名叫做Berkeley Internet Name Domain(BIND)。目前,它是網際網路上使用最為廣泛的DNS服務軟體。
bind的發行版一般包含三個部分:域名伺服器、域名解析器庫、軟體測試工具。
因為內網換了路由器,這個路由器不支援靜態域名解析服務。所以考慮自己建立一個內網DNS,也方便了開發同學在程式碼中使用域名,避免直接使用ip地址所帶來的不便和安全隱患。下面就記錄下使用BIND部署內網NDS環境(主從)操作流程:
一般來說,可以使用rpm包來安裝bind,但是rpm安裝可能不符合我們的要求、比如說想用named的執行緒模式、想禁用IPv6、想啟用某種特性,而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/
一、主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
二、從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 一、第一臺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 ------------------------------------------------------------------------------------ 一、第二臺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)建議做壓力測試的時候對目標主機做分散式壓力測試,效果更佳;