1、DNS的基礎概念
2、DNS域名解析查詢過程
3、DNS基本服務的實現
4、DNS主從同步的實現
5、DNS的高級視圖功能
本機的相關信息:
[root@stu113 ~]#uname –r //查看當前系統的內核版本 2.6.32-504.el6.x86_64 [root@stu113 ~]#cat /etc/redhat-release //查看當前系統的發行版本 CentOS release6.6 (Final) [root@stu113 ~]# ip addr | awk -F '[ /]+''/inet\>/&&!/127.0.0.1/ {print $3}' //當前主機的ip地址 172.16.113.14
1、DNS的基礎概念
DNS,域名解析服務,全名(Domain Name Server),他的工作機制是完成互聯網上的主機名到指定IP地址的轉換。
早期的域名解析的實現是使用hosts文件實現的,在客戶端的hosts文件(Windows該文件在C:\Windows\System32\drivers\etc下;Linux系統,該文件在/etc/hosts)中定義主機名與IP地址的對應關係,當主機在訪問某臺主機的時候,會自動查詢hosts文件中定義的對應關係,將主機名自動轉換成對應的IP地址進行訪問。
2、DNS域名解析的過程詳解:
客戶端訪問互聯網上的某臺主機(www.magedu.com)的流程大致如下:
首先,客戶端查詢本地是否有該主機名與ip地址的對應關係緩存,如果有就直接以此將主機名轉換成ip地址進行訪問;如果沒有緩存,則會查詢hosts文件;如果都沒有的話,便會根據本機所設置的DNS服務器(Linux中在/etc/resolve.conf中定義的。一般爲當地最近的一個節點的DNS服務器IP地址)查詢本地DNS服務器。
本地DNS服務器也是首先需要查看緩存中是否有該條目,如果有的話,便直接返回主機名所對應的IP地址給客戶端,客戶端以此IP地址與www.magedu.com進行通信。
如果本地DNS上面沒有緩存,本地DNS便會去查詢根服務器,去詢問根服務器是否有該主機名,根服務器接收到查詢請求,便會告訴本地DNS服務器:“我不知道,我只知道.com在哪,你去問.com吧。”,接着本地DNS便會根據根服務器傳遞過來的.com服務器的地址,到.com服務器上去查詢。.com服務器回答本地DNS服務器:“我不知道,我只知道magedu.com在哪,你去問magedu.com吧。” ;最後,本地DNS又向magedu.com發起查詢請求,magedu.com發現www是本域中的一臺主機,便將www主機所對應的ip地址返回給本地DNS服務器。
最終,本地dns服務器將ip地址記錄緩存,反饋給客戶端,客戶端以此IP地址進行後續的通信,若後續再有其他客戶端請求此主機名的主機名解析,本地DNS便可直接從緩存中讀取相應的數據反饋給客戶端。我們將上述的查詢過程可分解爲遞歸查詢和迭代查詢兩種。所謂遞歸查詢便是A向B發起查詢請求,B將最終結果返回給A;迭代查詢便是A向B發起查詢請求,B返回給A的不是最終結果,而是其他的查詢路徑C,而後A再向C發起查詢,由C返回給A最終的查詢結果。因此上圖中,客戶端向本地DNS發起解析請求,本地DNS將最終結果返回給客戶端的過程便是遞歸查詢過程;本地DNS向根服務器發起解析,根服務器返回.com等,最終由magedu.com. 返回給本地DNS服務器最終結果的過程便是迭代查詢的過程。
上述所描述客戶端訪問互聯網一臺主機的過程中所提到的”根服務器”,全球共13臺,並且每臺都有固定的IP地址,所以本地DNS可以知道其位置,並向其發起查詢請求。
根據上述的描述,我們大體可以知道,DNS的解析過程是分層進行的,並且是從最頂層(根)開始,每一層都僅記錄其直屬下層的位置,因此,我們稱其是個倒置的樹狀結構,並且查詢只能是自上而下,下層不能查詢上層:
上圖中,根”.”被稱爲“頂級域”, com、 cn 、 us 等被稱爲“一級域”,baidu 、qq等被稱爲是“二級域名”,而 www 、mail 、blog 便是二級域內的主機名。
我們常見的www.magedu.com或者www.baidu.com若是按照標準寫法需在其最後添加根域,例如”www.baidu.com.“,只不過通常我們都會把根域給省略掉,這種主機名+域名的組合被稱爲是 “FQDN”(Fully Qualified Domain Name).
需要在此提一下的就是,互聯網上的DNS服務並不是隨便拿來就用的,需要向一些服務提供商註冊使用(付費),(代理商:萬網, 新網;godaddy),若你的主機數量較小,則在服務提供商所提供的後臺自行映射IP與主機名對應關係即可;若主機數量較大,需呀自行搭建DNS服務的話,那麼需在服務提供商所提供的後臺中對你自己所搭建的DNS服務器進行授權即可。
3、DNS的基礎服務實現
相關術語:
區域數據文件:由多條資源記錄(ResourceRecord, RR)所構成。
正向解析 :將主機名解析成IP地址
反向解析 :將IP地址解析成主機名
資源記錄的類型及格式:
格式:name [TTL] INRR_type value
注:
(1) TTL值可定義在區域數據文件的開頭,全局繼承
(2) name可以使用@代替來引用當前區域的名字(bind的配置文件中的zone名)
(3) 同一個name可定義多個不同的值,此時DNS會以輪詢的方式進行解析,這也是早期負載均衡的實現模型。
(4) 多個name也可以定義同一個值
SOA記錄:起始授權記錄,每個區域數據文件的第一條
NS記錄:用於標明本域的DNS服務器的位置,必須有一條與之對應的A記錄
A記錄:FQDN與IPv4地址的對應
AAAA記錄:FQDN與IPv4地址的對應
MX記錄:郵件交換記錄,必須有一條與之對應的A記錄
PTR記錄:將IPv4地址解析成FQDN
CNAME:CanonicalName,別名記錄,將一個主機名映射到另一個主機名
使用的軟件:bind
使用端口(默認):
tcp53:用於主從間同步區域數據文件
udp53:用於客戶端查詢解析
==================================================================
安裝bind,實現基本的dns服務:
bind的安裝有兩種方式,使用rpm包安裝或是使用源碼包編譯安裝。源碼編譯安裝相對與rpm來講,功能更加豐富一些,但是一般的dns應用使用rpm包安裝足以應付,因此,接下來我就以rpm安裝來完成以下實驗----(a、基本dns服務;b、主從同步;c、子域授權)
a安裝
[root@stu113 ~]# yum install -y bind //確保實現配置好了yum源 [root@stu113 ~]# rpm -qa bind* //查詢安裝到關於bind的所有包 bind-libs-9.8.2-0.30.rc1.el6.x86_64 //bind程序所依賴的庫文件 bind-utils-9.8.2-0.30.rc1.el6.x86_64 //bind所提供的工具包(如dig等) bind-9.8.2-0.30.rc1.el6.x86_64 //bind主程序包
b配置
bind程序在linux系統上的服務腳本文件爲/etc/init.d/named,其主配置文件爲/etc/named.conf
配置文件主要分爲3大塊,每一項都用一對花括號”{}”括起來,並且每一行的末尾都需要跟上一個”;”
options---全局配置項,對全局生效
logging---日誌的配置
zone------域的配置
zone的種類:
master:主服務器的區域
slave:從服務器的區域
forward:轉發區域
hint:根區域
各區域的重要參數:
options { listen-onport 53 { IP; }; //定義監聽的端口及IP地址,ip地址一般爲外網地址 listen-on-v6port 53 { IP; }; //IPv6的監聽端口及IP directory "/var/named";//定義工作目錄 allow-query { IP; }; //定義允許從此服務器查詢解析的主機地址或範圍 recursionyes; //是否開啓遞歸查詢功能 allow-recursion{ IP; }; //允許遞歸的主機; forward { only|first; }; //定義是否全局轉發,若此項定義在zone中,則表示只對指定的區域轉發 }; zone "." IN { //雙引號內的”.”表示根區域,若查詢的解析在配置文件中沒有定義相應的zone,則會向根服務器請求解析,IN爲關鍵字,固定格式 typehint; //定義此zone的類型,hint爲根區域 file"named.ca"; //定義區域數據文件的位置,此處使用的是相對路徑,相對於options中定義的directory }; //區域結束標示 logging { channel default_debug {//定義日誌級別 file"data/named.run"; //定義日誌文件路徑及日誌文件名 severity dynamic; }; };
由此,我們自建一個bind的配置文件:
[root@stu113 ~]# mv /etc/named.conf /etc/named.conf.bak //將原配置文件改名 [root@stu113 ~]# vim /etc/named.conf //創建bind的配置文件並編輯 options { listen-on port 53 { 172.16.113.14; }; directory "/var/named" ; allow-query { any; }; recursion no; }; logging { channel default_debug { file"data/named.log"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; zone "su.com" IN { //此處定義了一個su.com的域 type master; file "su/su.com.zone"; };
編輯完成後。保存退出,並執行
[root@stu113 ~]# named-checkconf //檢查bind的配置文件是否有誤,若有錯誤,此命令執行後會返回錯誤信息
創建編輯區域數據文件-----
此處需要注意的是,區域數據文件中的所有域名書寫都必須帶上根”.”
區域數據中的SOA記錄中幾個參數:
1)序列號:用於表示此區域數據文件的的版本,老版本的bind從服務器是根據刷新時間週期探測主服務器區域數據文件的序列號與本地的序列號對比,若大於本地區域數據文件的序列號,則表明主服務器區域數據文件更新了,便會發送同步請求給主服務器;新版本的bind新增了更新通知機制,主服務器一旦更新區域數據文件,便會通知從服務器。
2)刷新時間:從服務器多久查詢一次此數據文件是否更新
3)重試時間:若從服務器查詢主服務器上區域數據文件是否更新時,訪問不到主服務器,則在重試時間週期過去後再聯繫主服務器
4)過期時間: 若主服務器故障宕機,則從服務器在過期時間週期後,便也會“殉情”
5)否定答案的TTL值:如果客戶端請求的解析不在本服務器上,則告知客戶端一定時間內別再向本服務器查詢了
[root@stu113 ~]# vim/var/named/su/su.com.zone $TTL 1d @ IN SOA su.com. admin.su.com. ( //此處的admin.su.com爲管理員郵箱,因爲”@”對此文件有特殊意義,所以郵箱名使用.代替 2015091601 ;序列號;不能超過10位 2H ;刷新時間 15M ;重試時間 1W ;過期時間 12H) ;否定答案的TTL值 IN NS ns1.su.com. ns1 IN A 172.16.113.14 www IN A 172.16.113.51
編輯完成後,保存退出,執行
[root@stu113 ~]# named-checkzone"su.com" /var/named/su/su.com.zone //檢查區域數據文件 zone su.com/IN: loaded serial 2015091601 OK //若有問題,此處會提示錯誤信息 啓動bind程序:———系統上的服務管理腳本名爲named,進程也爲named [root@stu113 ~]# /etc/init.d/named start Generating /etc/rndc.key: [ OK ] Starting named: [ OK ]
c、啓動成功,找一臺可以與本機通信的主機測試一下:
通信正常;對www.su.com進行解析一下:
客戶端尋找www.su.com,被解析成了區域數據文件中定義的地址;基本的dns服務已定義成功。
定義一個反向解析區域:
第一步:
在/etc/named.conf中添加如下配置:
zone "113.16.172.in-addr.arpa" IN{ type master; file "su/113.16.172.in-addr-arpa.zone"; };
第二步:
在/var/named/su目錄下創建對應的反向區域數據文件:
[root@stu113 ~]# vim/var/named/su/113.16.172.in-addr-arpa.zone //此處的文件名必須和named.conf中的file後面文件名完全一致 $TTL 1D @ IN SOA su.com. admin.su.com. ( 2015091601 1D 15m 1W 12H) IN NS ns1.su.com. 14 IN PTR ns1.su.com. 51 IN PTR www.su.com.
保存退出並檢查:
[root@stu113 ~]# named-checkzone"113.16.172.in-addr.arpa" /var/named/su/113.16.172.in-addr-arpa.zone zone 113.16.172.in-addr.arpa/IN: loadedserial 2015091601 OK
第三步:
[root@stu113 ~]# /etc/init.d/named reload //重新加載配置文件 [root@stu113 ~]# dig -x [email protected] //使用dig命令查詢測試,結果正常如下: ; <<>> DiG9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -x [email protected] ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY,status: NOERROR, id: 56864 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1,AUTHORITY: 1, ADDITIONAL: 1 ;; WARNING: recursion requested but notavailable ;; QUESTION SECTION: ;51.113.16.172.in-addr.arpa. IN PTR ;; ANSWER SECTION: 51.113.16.172.in-addr.arpa. 86400 IN PTR www.su.com. ;; AUTHORITY SECTION: 113.16.172.in-addr.arpa. 86400 IN NS ns1.su.com. ;; ADDITIONAL SECTION: ns1.su.com. 86400 IN A 172.16.113.14 ;; Query time: 0 msec ;; SERVER: 172.16.113.14#53(172.16.113.14) ;; WHEN: Tue Sep 15 14:16:54 2015 ;; MSG SIZE rcvd: 102
==================================================
4、實現DNS的主從數據文件同步:
其實實現DNS的主從同步並不複雜,配置如下:
1)在主服務器上的配置文件的zone內,添加allow-transfer,指定從服務器:
zone"su.com" IN { type master; file "su/su.com.zone"; allow-transfer { 172.16.113.15; }; }; zone "113.16.172.in-addr.arpa" IN{ type master; file "su/113.16.172.in-addr-arpa.zone"; allow-transfer { 172.16.113.15; }; };
2)將區域數據文件的權限以及屬主數組統一至directory下的其他目錄和文件的權限及屬主數組
[root@stu113named]# chmod --reference=/var/named/slaves/ /var/named/su/ [root@stu113named]# chmwon --reference=/var/named/slaves/ /var/named/su/ [root@stu113named]# chown --reference=/var/named/slaves/ /var/named/su/ [root@stu113named]# chown --reference=/var/named/named.ca /var/named/su/* [root@stu113 named]# chmod --reference=/var/named/named.ca/var/named/su/*
3)重新加載主服務器上的配置文件:
[root@stu113named]# /etc/init.d/named reload Reloading named: [ OK ] 4)在從服務器(IP:172.16.113.15)安裝bind,注意版本最好匹配: [root@localhost ~]# yum install -y bind [[email protected]]# mv /etc/named.conf /etc/named.conf.bak //將現有的配置文件改名 [root@localhost yum.repos.d]# [email protected]:/etc/named.conf /etc/named.conf //遠程copy主服務器的配置文件到從服務器 [root@localhost yum.repos.d]# vim /etc/named.conf //編輯配置文件 options { listen-on port 53 { 172.16.113.15; };//將監聽的端口改爲本機 directory "/var/named" ; allow-query { any; }; recursion no; }; logging { channel default_debug { file"data/named.log"; severity dynamic; }; }; zone"." IN { type hint; file "named.ca"; }; zone"su.com" IN { type slave; //將區域類型改爲slave file "slaves/su.com.zone"; //主從同步時,會將區域數據文件同步到slaves下,所以將路徑改爲slaves下 masters { 172.16.113.14; }; //指明主服務器的位置 }; zone"113.16.172.in-addr.arpa" IN { type slave; file"slaves/113.16.172.in-addr-arpa.zone"; //主從同步時,會將區域數據文件同步到slaves下,所以將路徑改爲slaves下 masters{ 172.16.113.14; }; //指定主服務器的位置 }; 保存退出並驗證配置文件是否有誤: [root@localhost yum.repos.d]# named-checkconf
5)啓動從服務器的bind程序:
[root@localhost ~]# /etc/init.d/named start [root@localhost~]# ls /var/named/slaves/ //區域數據文件已同步成功 113.16.172.in-addr-arpa.zone su.com.zone
5、DNS的高級視圖功能
由於IP地址有地域的劃分概念,每個地區都有不同網段的IP地址,就像手機號碼一樣,每個網段都有其對應的地區;DNS的高級視圖所實現的功能是將來自不同地區的用戶解析請求,返回不同的解析結果:比如說:
www.su.com.這臺主機對應兩個ip地址,一個是北京(1.1.1.1);一個是江蘇(2.2.2.2);根據服務器所定義的匹配原則,來自北京的用戶解析請求服務器會返回ip爲1.1.1.1 ,來自江蘇的用戶請求,服務器會返回其2.2.2.2.
下面,我將以172.168.1.51 模擬北京的用戶,以172.16.113.100模擬江蘇用戶:
用一臺服務器(172.16.113.14)來實現高級視圖功能,若想實現主從同步,從服務器的設置一樣。
具體實驗步驟如下:
1)在named.conf中定義view:即將所有的zone都劃在view之下。
2)定義區域數據文件:
[root@stu113 su]# vim su.com.zone.bj
[root@stu113 su]# vim su.com.zone.js
*****注意這兩個區域數據文件的權限:數組爲named ,屬主爲root ,權限爲640
重載bind的配置文件:
[root@stu113 su]# /etc/init.d/named reload
下面用172.16.113.51進行解析測試:
[root@centos7-51 ~]# ip addr | awk -F '[ /]+''/inet\>/&&!/127.0.0.1/ {print $3}' 172.16.113.51 [root@centos7-51 ~]# dig -t A [email protected] ///視圖生效
用172.16.113.100進行解析測試:
解析成功。