1、DNS 概述
1.1、DNS的出現及演化
網絡出現的早期是使用IP位址通訊的,那時就幾台主機通訊。但是随着接入網絡主機的增多,這種數字辨別的位址非常不便于記憶,UNIX上就出現了建立一個叫做hosts的檔案(Linux和Windows也繼承保留了這個檔案)。這個檔案中記錄着主機名稱和IP位址的對應表。這樣隻要輸入主機名稱,系統就會去加載hosts檔案并查找對應關系,找到對應的IP,就可以通路這個IP的主機了。
但是後來主機太多了,無法保證所有人都能拿到統一的最新的hosts檔案,就出現了在檔案伺服器上集中存放hosts檔案,以供下載下傳使用。網際網路規模進一步擴大,這種方式也不堪重負,而且把所有位址解析記錄形成的檔案都同步到所有的客戶機似乎也不是一個好辦法。這時DNS系統出現了,随着解析規模的繼續擴大,DNS系統也在不斷的演化,直到現今的多層架構體系。
1.2、DNS是什麼
DNS(Domain Name System),即域名系統。它使用層次結構的命名系統,将域名和IP位址互相映射,形成一個分布式資料庫系統。
DNS采用CS架構,伺服器端工作在UDP協定端口53和TCP協定端口53上。
FQDN(Fully Qualified Domain Name)完全限定域名,它是使用DNS的樹狀層級結構的完全路徑域名來表示一個準确位置對應的主機。
提供正向解析(FQDN-->IP)和反向解析(IP-->FQDN)的功能。
目前DNS已經成為了網際網路通訊的基礎服務。
1.3、網際網路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.4、DNS的分類:
主DNS伺服器:就是一台存儲着原始資料的DNS伺服器。
從DNS伺服器:使用自動更新方式從主DNS伺服器同步資料的DNS伺服器。也成輔助DNS伺服器。
緩存伺服器:不負責本地解析,采用遞歸方式轉發客戶機查詢請求,并傳回結果給客戶機的DNS伺服器。同時緩存查詢回來的結果,也叫遞歸伺服器。
轉發器:這台DNS發現非本機負責的查詢請求時,不再向根域發起請求,而是直接轉發給指定的一台或者多台伺服器。自身并不緩存查詢結果。
1.5、一些術語和概念
權威DNS伺服器:它是負責對某區域能夠進行解析,并在父區域中存儲着NS記錄的主或者從伺服器。
權威應答AA(Authoritative Answer):權威伺服器給出的最終答案是就是權威答案,并用協定中的某個标志位表示。
授權:就是上一級将它的子域的管理授權給某一個特定的組織和機構,子域的記錄資訊就直接由該組織或機構管理的權威伺服器進行存儲和解析。在上一級中需要保留指向子域的記錄,這種記錄就稱為膠水記錄(Glue Record)。
1.6、RR(Resource Record)資源記錄
DNS層級結構中,不管是節點還是葉子節點都是資源,對這些資源中的某一個的辨別使用一定格式的多字段的一條記錄來表示,這條記錄就是資源記錄RR。RR的标準記錄在RFC 1034中。
1.6.1、RR的組成:
owner name | 所屬名稱 |
type | RR的類型 |
TTL | 緩存RR的秒數(time-to-live) |
class | 表示一個協定或者一族協定,常用IN表示Internet |
RDATA | 記錄資料 |
1.6.2、RR中IN類(class)常見類型(type)
SOA | 區域授權起始記錄,區域檔案第一條記錄,而且一個區域檔案隻能有一條 |
NS | 域的授權名稱伺服器 |
MX | 域的郵件交換器,要跟着一個優先級值,越小越高 |
A | IPV4主機位址 |
AAAA | IPV6主機位址 |
PTR | 解析IP的指針 |
CNAME | 權威(正式)名稱,定義别名記錄 |
1.6.3、常用指令
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.4、SOA的RDATA格式
MNAME | 授權主機FQDN或者目前區域的名稱 |
RNAME | 郵箱位址,@用.替代 |
SERIAL | 區域傳送使用的版本号,格式為yyyymmddnn |
REFRESH | 從伺服器去同步主伺服器時間間隔 |
RETRY | 重新整理失敗重試時間間隔 |
EXPIRE | 從伺服器過期時長 |
MINIMUM | 否定答案過期時長 |
百度的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.6.5、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.6.6、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.6.7、CNAME的RDATA格式
CNAME:權威名稱,FQDN
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com是正式名稱,而www.baidu.com是别名
1.6.8、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
1.6.9、PTR的RDATA格式
7.100.in-addr.arpa. IN PTR www.example.com.
2、BIND實作DNS服務
2.1、BIND是什麼
1984年,加州大學伯克利分校的幾個學生完成了Unix名稱服務的實作,起名叫做Berkeley Internet Name Domain(BIND)。目前,它是網際網路上使用最為廣泛的DNS服務軟體。
bind的發行版一般包含三個部分:域名伺服器、域名解析器庫、軟體測試工具。
2.2、DNS實驗
下面就安裝bind來完成整個DNS的實驗
2.2.1、前提:時間同步
在生産環境中,所有的伺服器需要使用同一的時鐘,一般會指向同一個時間源。時間源采用某種方式取得可靠準确的時間。
客戶機可以使用ntp服務或者在crontab中配置ntpdate完成來完成時間同步。
2.2.2、環境準備
本文介紹了2種安裝方式,源代碼編譯安裝需要依賴衆多開發庫,請使用yum安裝。将CentOSCD光牒挂載到/media/cdrom,配置本地yum源備用。配置yun請參看部落客博文 《Linux的程式安裝和包管理》,此類博文很多,這裡不再贅述。使用下面的語句安裝開發環境。
兩台伺服器分别安裝了CentOS 6.5,位址分别為192.168.60.133(源碼安裝)、192.168.60.134、192.168.60.171。
# yum groupinstall "Development tools" "Server Platform Development"
2.2.3、安裝BIND
2.2.3.1、rpm安裝bind(192.168.60.171和192.168.60.134)
預設bind的庫和工具已經安裝,但是伺服器軟體沒有安裝,可以使用yum -y install bind 。
安裝成功生成一下目錄和檔案:
服務腳本:/etc/rc.d/init.d/named
主配置檔案:/etc/named.conf
區域解析庫檔案:/etc/named.rfc1912.zones
服務根目錄:/var/named/
從伺服器使用的區域解析庫目錄:/var/named/slaves,權限特殊
服務腳本使用的檔案:
pid目錄:/var/run/named/,在其下建立named.pid檔案,使用時建立符号連結到其父目錄中,即/var/run/named.pid,由服務腳本産生。
鎖檔案:/var/lock/subsys/named,由服務腳本産生。
以上這些目錄和檔案,是rpm安裝的時候建立的,而且對這些檔案和目錄的權限做了很好的限定。對于配置檔案的配置,下面将逐一執行個體介紹,部分解釋在上面。
2.2.3.2、源代碼安裝(192.168.60.133上)
下載下傳bind的源碼,官網下載下傳位址http://www.isc.org/downloads/bind/,本次使用版本為bin-9.10.0-P2.tar.gz。
(1)安裝
configure的一些變量
--prefix :預設在/usr/local
--sysconfdir:預設在--prefix指定的目錄下,如果--prefix為空,就為/etc
--localstatedir:預設在--prefix指定的目錄下,如果--prefix為空,就為/var
--enable-threads:啟用多線程
--disable-chroot:不支援chroot
1 2 3 | |
安裝完成
(2)配置
編輯主配置檔案/etc/named/named.conf
1 2 3 4 5 6 7 8 9 | |
生成/etc/named/named.rfc1912.zones檔案,内容如下:
注意,此配置檔案中,file中定義的是路徑都是相對于上文中directory的路徑 /var/named 的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
建立運作根目錄/var/named,準備基本的Zone檔案,根、localhost正反向解析
1 2 3 | |
在/var/named目錄中準備好這4個檔案
named.ca,可以使用dig -t NS . @a.root-servers.net > named.ca 生成。但是要注意的是,dig指令是安裝了bind之後才有的,而且某些情況下,查詢根的NS記錄的指令傳回結果可能沒有A記錄和AAAA記錄,有可能被攔截。 named.ca内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
named.localhost 内容如下:
1 2 3 4 5 6 7 8 9 10 | |
named.loopback 内容如下:
1 2 3 4 5 6 7 8 9 10 | |
named.empty 内容如下:
1 2 3 4 5 6 7 8 9 10 | |
檢查配置檔案
1 2 3 4 5 6 7 8 9 10 11 12 | |
可以開始測試運作named了,由于是編譯安裝,并沒有提供服務腳本,不能使用service啟動named。
(3)工作環境配置
1)導出環境變量
在/etc/profile.d下建立檔案named9.10.sh
1 2 | |
重新開機會話連接配接,echo $PATH,傳回如下:
1 | |
這樣就把bind提供的衆多指令加入到了搜尋路徑中了,友善使用
2)幫助檔案導出
編輯/etc/man.config,添加下面的語句。
1 | |
3)增加系統使用者群組
1 2 | |
(4)第一次啟動
使用-g選項,讓服務運作于前台,便于查錯
1 | |
發現幾個問題
1 2 3 4 5 6 7 | |
權限問題,執行下面語句
1 2 3 4 5 6 | |
開始測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
服務啟動成功。
以上配置好之後,基本達到了和rpm安裝同樣的狀态,可以開始試驗内容
3、實驗
3.1、實驗的内容
主從複制(區域傳送)、子域授權、轉發器、視圖
3.2、主從複制(區域傳送)
(1)建立主DNS伺服器
修改named.rfc1912.zone檔案,在尾部添加
1 2 3 4 5 6 | |
提供正向解析檔案
在/var/named/下建立檔案example.org.zfile,屬主數組為named,權限640
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 | |
提供反向解析檔案
在主配置檔案中,追加以下内容
1 2 3 4 5 6 | |
1 | |
1 2 3 4 5 6 7 8 9 10 | |
(2)RNDC
使用rndc(remote name domain controller)對named進行控制操作。預設工作TCP的953号端口,不安全,建議本地使用。
常用指令 :
reload 線上重新裝載配置檔案和zone檔案
reload zone 重新加載指定的zone
stop [-p] 安全停止named。使用-p傳回pid
flush 清除DNS緩存
status 顯示伺服器狀态
1 2 3 | |
打開rndc.conf,将下面部分追加到/etc/named/named.conf尾部(要去除前面的#,即注釋)
1 2 3 4 5 6 7 8 | |
(3)啟動DNS服務
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
使用以下指令測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
(4)建立從DNS伺服器(rpm安裝的,192.168.60.171)
從伺服器的主配置檔案中,将這兩句改為如下,或者注釋掉。
1 2 3 4 5 6 7 8 9 10 11 | |
啟動服務
1 | |
檢視/var/named/slaves/,已經存在檔案example.org.zone了,内容為:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
檢查是否能夠解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
3.3、子域授權及轉發器
假設子域為tech.example.org
在父域172.168.60.133中的example.org.zfile添加膠水記錄
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
子域172.168.60.134中的/etc/named.rfc1912.zones中追加
1 2 3 4 | |
在/var/named下建立zone檔案tech.example.org.zone
1 2 3 4 5 6 7 | |
啟動子域(rpm安裝的)
1 | |
重新裝載父域配置檔案
1 | |
測試成功,解析有子域提供,傳回非權威答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
3.4、轉發器配置
見子域授權圖
3.4.1、完全轉發
這裡有一個問題,使用子域的DNS服務,無法知曉父域,所有的非本域解析統統要去找根域。
為了解決這個問題,可以将子域配置成為轉發器,除了子域本身以外的解析,全部轉發父域伺服器。
在/etc/named.conf中添加forward和forwarders。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
開始測試,本地轉發www.example.org的解析請求給父域,傳回非權威答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
3.4.2、區域轉發
當然這裡還可以配置區域轉發,對example.org定義為一個區域,裡面配置forward和forwarders。
在/etc/named.conf中移除forward和forwarders兩句。
在/etc/named.rfc1912.zones中追加
1 2 3 4 5 | |
使用rndc reload重新裝載配置檔案
1 | |
測試成功。
3.5、view視圖
不同IP段的用戶端,DNS分析判斷後傳回不同的結果。
将來自172.168.60.133的請求通路是intra_view,其他的IP的請求都通路inter_view。
這次使用acl通路控制清單,在192.168.60.133上/etc/named/named.conf中,在起始行添加
1 | |
重新修改/etc/named/named.rfc1912.zones,定義2個視圖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | |
新增/var/named/test.com.zone檔案
1 2 3 4 5 6 7 8 9 | |
開始測試
本機192.168.60.133上測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
在192.168.60.134上測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
綜上,DNS是一個非常重要的基礎性服務,有很多的概念,标準内容也非常多。不僅用于網際網路解析,也可以用在企業内建網絡中。常用的就有主從複制、子域授權、轉發和視圖幾種模式。要熟悉這些基礎概念和應用場景,就能利用它對整個區域網路乃至網際網路的通路進行優化。