一、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)建議做壓力測試的時候對目標主機做分布式壓力測試,效果更佳;
