一、前言
Dns全稱domain name system,當我們訪問一個網站時,在網站輸入一個網址。但是網絡是靠ip地址這個邏輯地址來標識地址的。而一個網址是如何轉換為ip地址的?下面我們將簡單講解下dns的原理。
二、dns查詢過程
在了解dns查詢過程時,我們先了解一些有關dns的專業名詞
根域:用來管理互聯網的主目錄,全球共13臺。
一級域:根域下的子域,如com. cn. org. net. 等
二級域:眾多一級域下的子域,如baidu.com. google.com.等
子域:是相對與它的上級域而言,如根域下的com. org. 等
遞歸:dns查詢的一種方式,服務器會把查詢請求逐級傳遞。
迭代:dns查詢的一種方式,如主機A查詢一條dns資源記錄,那么如果服務器告訴主機A它在某一臺服務器上,那么將由A去找下一臺服務器,而非是
這臺服務器本身幫它去尋找
FQDN :完全合格域名
資源記錄:用于記錄解析的屬性。
SOA :起始授權記錄,一個區域文件只有一個
NS :name server
MX :郵件交換器
A :用于正向解析
PTR :用于反向解析
CNAME :正式名稱
Dns查詢過程,如下圖
解說:
1.當客戶端請求訪問www.baidu.com時,它向本地dns服務器發起請求詢問www.baidu.com的ip地址。
2.本地dns服務器不知道www.baidu.com的ip地址,那么它將向根域詢問。
3.根域說com.是它的子域,你可以問下com.域。
4.本地dns于是去詢問com.域,com.域說baidu.com.是它的一個子域。
5.于是本地dns去詢問baidu.com.域,baidu.com.說它負責解析這個域,知道www.baidu.com.的地址,于是返回ip地址給本地dns服務器
6.本地dns服務器取得結果,返回給client。
三、案例
拓撲圖
軟件版本:bind-9.10.3
簡要說明:master ip:192.168.19.128 , slave ip :192.168.19.129 , subdomain ip :192.168.19.131 ,client ip :192.168.19.132
master 與slave為主從dns,master與subdomain為父域和子域關系。
3.1、在所有服務器上部署bind并啟動之
所有的服務器中都需要安裝以下環境,這里不一一說明舉例。
安裝環境:
[root@localhost ~]# yum groupinstall "Development tools" "Server Platform" –y #安裝編譯軟件所需的工具
建立named用戶
[root@localhost bind-9.10.3]# groupadd -g 53 -r named #創建named用戶組 [root@localhost bind-9.10.3]# useradd -g 53 -r -u 53 -s /sbin/nologin named #創建named用戶,屬組named
安裝bind
[root@localhost bind-9.10.3]# mkdir /usr/local/bind-9.10.3 #創建bind-9.10.3的目錄 [root@localhost bind-9.10.3]# ./configure --prefix=/usr/local/bind-9.10.3 --disable-ipv6 --disable-chroot --enable-threads [root@localhost bind-9.10.3]# make && make install #編譯安裝 [root@localhost bind-9.10.3]# ln -s /usr/local/bind-9.10.3 /usr/local/bind #為bind做一個軟鏈接,方便以后版本升級
生成rndc.conf文件
[root@localhost etc]# /usr/local/bind/sbin/rndc-confgen -urandom > /usr/local/bind/etc/rndc.conf #生成rndc.conf文件
named.ca文件生成
[root@localhost etc]# dig -t NS . >/usr/local/bind/var/named.ca #生成根的信息
1.master配置
named.conf文件配置
options { directory "/usr/local/bind/var"; #設置named的工作目錄 allow-recursion { localnet; }; #允許使用遞歸查詢的客戶端 notify yes; #啟用通知功能,當masterzone問修改后,通知slave }; acl localnet { #定義一個localnet的acl 192.168.19.128; 192.168.19.129; 192.168.19.131; 127.0.0.1; }; acl order { #定義一個order的acl 192.168.19.132; 172.16.0.0/16; }; view orderview { #創建orderview視圖 match-clients { order; }; #允許訪問這個視圖的客戶端 zone "jack.com." IN { #定義一個zone文件 type master; #類型 file "jack.com.zone"; #存儲路徑,相對于directory目錄而言 allow-update { none; }; #不允許所有客戶端更新 allow-transfer { order; }; #允許被傳輸文件的客戶端 }; }; view localview { #定義一個localview視圖 match-clients { localnet; }; #允許訪問這個視圖的客戶端 zone "." IN { type hint; #設置類型 file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; allow-update { none; }; }; zone "leon.com." IN { #定義一個zone type master; #類型是master file "leon.com.zone"; allow-update { none; }; allow-transfer { localnet; }; #允許acl是localnet的客戶端傳輸文件 allow-query { localnet; }; #允許哪些客戶端查詢 }; zone "19.168.192.in-addr.arpa" { #定義一個反向zone type master; file "192.168.19.zone"; allow-update { none; }; allow-transfer { localnet; }; allow-query { localnet; }; }; }; key "rndc-key" { #指定rndc的key文件和控制信息,這部分內容來源于,rndc.conf文件中的后半段 algorithm hmac-md5; secret "wCtvv1ALOnb7Tv0d/o/qyw=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
編輯master的zone文件
[root@localhost var]# ll #查看需要哪些zone文件 total 28 -rw-r--r--. 1 root named 118 Sep 27 15:28 127.0.0.zone -rw-r--r--. 1 root named 223 Sep 29 05:07 192.168.19.zone -rw-r--r--. 1 root named 238 Sep 28 05:10 jack.com.zone -rw-r--r--. 1 root named 330 Sep 29 05:03 leon.com.zone -rw-r--r--. 1 root named 114 Sep 27 15:28 localhost.zone -rw-r--r--. 1 root named 890 Sep 27 14:57 named.ca drwxr-xr-x. 3 root root 4096 Sep 27 15:41 run [root@localhost var]# cat *.zone #zone文件內容如下,本處只給出結果,不給出內容 $TTL 86400 @ IN SOA localhost. admin.localhost.( 2015092801 #版本號 3H #刷新間隔 15M #重現刷新間隔 7D #失效日期 1D #否定答案的統一緩存時長 ) IN NS localhost. 1 IN PTR localhost. #此處為127.0.0.zone內容 $TTL 86400 #此處為192.168.19.zone的內容 @ IN SOA ns1.leon.com. admin.leon.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns1.leon.com. #NS記錄 IN NS ns2.leon.com. #slave服務器的NS記錄 128 IN PTR ns1.leon.com. #master的PTR記錄 129 IN PTR ns2.leon.com. #slave的PTR記錄 3 IN PTR www.leon.com. 4 IN PTR mail.leon.com. $TTL 86400 #此處為jack.com.zone的內容 @ IN SOA ns1.jack.com. admin.jack.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns1.jack.com. ns1 IN A 192.168.19.128 www IN A 192.168.19.3 smtp IN CNAME mail #正式名稱,類似于別名 mail IN A 192.168.19.4 @ IN MX 5 mail.jack.com. * IN A 192.168.19.5 $TTL 86400 #此處為leon.com.zone的內容 @ IN SOA ns1.leon.com. admin.leon.com. ( 2015092801 3H 15M 7D 1D ) @ IN NS ns1.leon.com. #master的NS記錄 @ IN NS ns2.leon.com. #slave的NS記錄 secret IN NS ns3.secret.leon.com. #子域授權NS記錄 ns3.secret IN A 192.168.19.131 #子域授權A記錄 ns2 IN A 192.168.19.129 ns1 IN A 192.168.19.128 www IN A 192.168.19.3 smtp IN CNAME mail mail IN A 192.168.19.4 @ IN MX 5 mail.leon.com. $TTL 86400 #此處為localhost.zone的內容 @ IN SOA localhost. admin.localhost.( 2015092801 3H 15M 7D 1D ) IN NS localhost. IN A 127.0.0.1
修改zone文件的屬組
[root@localhost sbin]# chown :named /usr/local/bind/etc/named.conf [root@localhost sbin]# chown :named named.ca localhost.zone 127.0.0.zone
修改rndc.conf的屬組
[root@localhost sbin]# chown :named /usr/local/bind/etc/rndc.con
2.部署slave
named.conf文件配置
[root@localhost etc]# cat named.conf #查看slave的named.conf文件配置,此處不給出過程 options { directory "/usr/local/bind/var"; #工作目錄 }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; }; zone "leon.com." IN { #定義zone文件 type slave; #定義其類型為slave masters { 192.168.19.128; }; #指明它的master地址 file "slaves/leon.com.zone"; #存放位置 }; zone "19.168.192.in-addr.arpa" IN { #定義zone文件 type slave; #定義其類型為slave masters { 192.168.19.128; }; file "slaves/192.168.19.zone"; }; key "rndc-key" { #此處內容和master來源類似 algorithm hmac-md5; secret "ywDZNig5qX0rHte7dIEK8Q=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
編輯zone文件
[root@localhost var]# cat *.zone #對于slave的zone文件,只需要設置localhost蒸發zone即可,對于leon.com的區域文件從master中傳輸過來 $TTL 86400 #定義localhost的反向區域 @ IN SOA localhost. admin.localhost. ( 2015092801 3H 15m 7D 1D ) IN NS localhost. 129 IN PTR localhost. $TTL 86400 #定義localhost的正向區域 @ IN SOA localhost. admin.localhost. ( 2015092801 3H 15m 7D 1D ) IN NS localhost. IN A 192.128.19.129 admin IN A 192.168.19.129
創建slaves文件
[root@localhost var]# mkdir -p /usr/local/bind/var/slaves #創建slaves文件,存儲master傳輸過來的zone文件 [root@localhost var]#chmod :named /usr/local/bind/var/slaves && chown +w /usr/local/bind/var/slaves #設置slaves的屬組,否則無法創建文件
3.子域設置
named.conf文件配置
[root@localhost etc]# cat named.conf options { directory "/usr/local/bind/var"; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; allow-update { none; }; }; zone "secret.leon.com." IN { type master; file "secret.leon.com.zone"; allow-update { none; }; }; zone "19.168.192.in-addr.arpa" { type master; file "192.168.19.zone"; allow-update { none; }; }; zone "leon.com." IN { #定義leon.com的zone區域 type forward; #類型是轉發,即當客戶端詢問這個區域是,把請求轉發到指定的服務器上 forward only; #only指無論轉發服務器是否返回有結果,這個服務器依然轉發到被轉發的服務器上 forwarders { 192.168.19.128; }; #轉發到指定的服務器上 }; key "rndc-key" { algorithm hmac-md5; secret "4qikE7ovgm5AA8rTY+fYLQ=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
zone文件配置
[root@localhost var]# cat *.zone $TTL 86400 #localhost的反向區域 @ IN SOA localhost. admin.localhost.( 2015092801 3H 15M 7D 1D ) IN NS localhost. 1 IN PTR localhost. $TTL 86400 #子域的反向區域 @ IN SOA ns1.secret.leon.com. admin.secret.leon.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns1.secret.leon.com. 131 IN PTR ns1.secret.leon.com. 30 IN PTR www.secret.leon.com. 40 IN PTR mail.secret.leon.com. $TTL 86400 #localhost的正向區域 @ IN SOA localhost. admin.localhost.( 2015092801 3H 15M 7D 1D ) IN NS localhost. IN A 127.0.0.1 $TTL 86400 #子域的正向區域 @ IN SOA ns3.secret.leon.com. admin.secret.leon.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns3.secret.leon.com. ns3 IN A 192.168.19.131 www IN A 192.168.19.30 mail IN A 192.168.19.40
檢查配置文件
[root@localhost var]# /usr/local/bind/sbin/named-checkconf #檢測配置文件是否有語法錯誤
啟動named(先檢測子域的配置文件正確后在啟動named服務,master和slave服務器named服務后面啟動)
[root@localhost var]# /usr/local/bind/sbin/named #使用絕對路徑啟動named服務,master和slave也一樣,這里不給出過程了
檢測配置文件是否正確
[root@localhost sbin]# /usr/local/bind/sbin/named-checkconf #檢測配置文件是否正確,無提示則正確,否則錯誤 [root@localhost sbin]# /usr/local/bind/sbin/named-checkzone localhost /usr/local/bind/var/localhost.zone zone localhost/IN: loaded serial 2015092801 #檢測localhost的zone文件是否正確 OK [root@localhost sbin]# /usr/local/bind/sbin/named-checkzone 0.0.127.in-addr-arpa /usr/local/bind/var/127.0.0.zone zone 0.0.127.in-addr-arpa/IN: loaded serial 2015092801 OK [root@localhost var]# /usr/local/bind/sbin/named-checkzone "leon.com." /usr/local/bind/var/leon.com.zone zone leon.com/IN: loaded serial 2015092801 #檢測leon.com的正向zone文件是否正確,子域也一使用這種方法檢測,這里就不給出檢測過程 OK [root@localhost var]# /usr/local/bind/sbin/named-checkzone "19.168.192.in-addr.arpa." /usr/local/bind/var/192.168.19.zone zone 19.168.192.in-addr.arpa/IN: loaded serial 2015092801 OK #檢測leon.com的反向zone文件是否正確,子域也一使用這種方法檢測,這里就不給出檢測過程
查看是否監聽端口
[root@localhost var]# lsof -i:53 #通過lsof命令查看是否監聽了53端口,如果沒有則返回狀態結果為1,也可以使用netstat或ss命令 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME named 2821 root 21u IPv4 24148 0t0 TCP localhost:domain (LISTEN) named 2821 root 22u IPv4 24150 0t0 TCP ns1.leon.com:domain (LISTEN) named 2821 root 512u IPv4 24147 0t0 UDP localhost:domain named 2821 root 513u IPv4 24147 0t0 UDP localhost:domain named 2821 root 514u IPv4 24149 0t0 UDP ns1.leon.com:domain named 2821 root 515u IPv4 24149 0t0 UDP ns1.leon.com:domain
查看日志
[root@localhost var]# tail -5 /var/log/messages #啟動master和slave時,查看master的日志信息 Sep 29 08:00:57 localhost rsyslogd-2177: imuxsock lost 30 messages from pid 2821 due to rate-limiting Sep 29 08:00:57 localhost named[2821]: client 192.168.19.129#41820 (leon.com): view localview: transfer of 'leon.com/IN': AXFR started (serial 2015092801) #開始傳輸serial為2015092801的zone文件,類型為AXFR Sep 29 08:00:57 localhost named[2821]: client 192.168.19.129#41820 (leon.com): view localview: transfer of 'leon.com/IN': AXFR ended #結束傳輸serial為2015092801的zone文件,類型為AXFR Sep 29 08:00:58 localhost named[2821]: client 192.168.19.129#49398 (19.168.192.in-addr.arpa): view localview: transfer of '19.168.192.in-addr.arpa/IN': AXFR started (serial 2015092801) Sep 29 08:00:58 localhost named[2821]: client 192.168.19.129#49398 (19.168.192.in-addr.arpa): view localview: transfer of '19.168.192.in-addr.arpa/IN': AXFR ended
測試主從
[root@localhost var]# dig -t A www.leon.com. @192.168.19.129 #可以在指定解析服務器為slave來解析,能解析可證明主從同步 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.leon.com. @192.168.19.129 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3597 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 #flags類型為aa則表示權威應答 ;; QUESTION SECTION: ;www.leon.com. IN A ;; ANSWER SECTION: #返回的解析結果 www.leon.com. 86400 IN A 192.168.19.3 ;; AUTHORITY SECTION: leon.com. 86400 IN NS ns2.leon.com. leon.com. 86400 IN NS ns1.leon.com. ;; ADDITIONAL SECTION: ns1.leon.com. 86400 IN A 192.168.19.128 ns2.leon.com. 86400 IN A 192.168.19.129 ;; Query time: 4 msec ;; SERVER: 192.168.19.129#53(192.168.19.129) ;; WHEN: Tue Sep 29 08:04:56 2015 ;; MSG SIZE rcvd: 114
測試子域,授權及轉發
[root@localhost var]# dig -t A www.leon.com. @192.168.19.131 #可以指定子域服務器解析父域負責解析的資源, ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.leon.com. @192.168.19.131 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4294 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 #可以看到flags無aa這個類型,則表示非權威應答,因為它不負責解析這個記錄,只是把請求轉發了出去,父域返回這條記錄,然后子域在返回該客戶端 ;; QUESTION SECTION: ;www.leon.com. IN A ;; ANSWER SECTION: www.leon.com. 86400 IN A 192.168.19.3 ;; Query time: 14 msec ;; SERVER: 192.168.19.131#53(192.168.19.131) ;; WHEN: Tue Sep 29 08:06:26 2015 ;; MSG SIZE rcvd: 46
測試acl (在192。168.19.132機器中,指定父域解析)
[root@localhost ~]# dig -t A www.leon.com. @192.168.19.128 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.leon.com. @192.168.19.128 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 54867 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available #ANSWER為0,沒有解析這條記錄,原因是父域做了acl限制 ;; QUESTION SECTION: ;www.leon.com. IN A ;; Query time: 4 msec ;; SERVER: 192.168.19.128#53(192.168.19.128) ;; WHEN: Tue Sep 29 08:09:38 2015 ;; MSG SIZE rcvd: 30
測試視圖(在192。168.19.132上指定父域解析)
[root@localhost ~]# dig -t A www.jack.com. @192.168.19.128 #在192.168.19.132上指定父域解析www.jack.com這條記錄。有返回結果,因為這個視圖上沒限制這個ip地址。 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.jack.com. @192.168.19.128 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45223 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;www.jack.com. IN A ;; ANSWER SECTION: www.jack.com. 86400 IN A 192.168.19.3 ;; AUTHORITY SECTION: jack.com. 86400 IN NS ns1.jack.com. ;; ADDITIONAL SECTION: ns1.jack.com. 86400 IN A 192.168.19.128 ;; Query time: 1 msec ;; SERVER: 192.168.19.128#53(192.168.19.128) ;; WHEN: Tue Sep 29 08:10:47 2015 ;; MSG SIZE rcvd: 80
四、總結
做此次實驗中,出現了較多錯誤,像zone文件一些忘記更改屬組,特別是zone文件內容格式很重要,盡量不要簡寫。幾臺服務器之前named啟動順序也比較重要,負責zone文件檢測時會出現錯誤,如先啟動子域,在啟動從域,最后主域。如果子域最后啟動,那么主域簡稱zone文件時會出錯。
原創文章,作者:成吉思汗,如若轉載,請注明出處:http://www.www58058.com/8513
排版好的博客更吸睛哦~