linux系統中的DNS服務器介紹

http://lq2419.blog.51cto.com/1365130/1172269
DNS:Domain Name Service,linux上的DNS服務是基於一種軟件BIND實現的。BIND: Berkeley Internet Name Domain。
那什麼是域名呢?舉個例子,先問個問題:www.baidu.com是否是域名?可能有人會說這個是域名,其實這是錯誤的,這個是主機名,不然你怎麼訪問到它呢。baidu.com纔是域名,com也是域名,由於其下面包含有baidu這個域。www.baidu.com是主機名,也叫FQDN,FQDN:Full Qualified Domain Name,徹底限定域名(可翻譯成其餘名字)
那DNS是用來作什麼的呢?DNS,即名稱解析,簡單來講就是名稱轉換,即Name Resolving,其背後有查詢過程,既然是查詢,確定須要依賴某些數據庫來實現。那既然是名稱解析,主要實現什麼解析呢?其實現的是從FQDN <--> IP,這是一種雙向轉換,或者說雙向解析,從FQDN可實現到IP的解析,一樣,從IP也能夠實現到FQDN的解析。但這種雙向轉換是經過不一樣的機制實現的。linux

要完成名稱解析的機制有不少,爲了有一個統一的框架,就出現了nsswitch,nsswitch實現爲多種須要提供名稱解析的機制提供一種名稱解析的平臺,它不負責真正的名稱解析,僅提供一種框架,或者說平臺。就像淘寶同樣,僅提供平臺,不負責真正的買賣。幫咱們實現可以將DNS轉換成IP地址的機制有兩個:libnss_files.so和libnss_dns.so庫文件。用戶提交查詢請求的時候,是經過nsswitch這個框架來去這兩個庫文件中查找的。
在nsswitch的配置文件/etc/nsswitch.conf中有這麼一行內容:
hosts: files dns
這裏的file指的就是經過libnss_files.so來找/etc/hosts文件,經過這個文件來完成主機名稱到IP地址的對應關係。這裏的dns指的就是DNS服務。當咱們去訪問一個主機名的時候,主機名是不能創建真正的聯繫的,它會調用一個庫文件來完成從主機名到IP地址的轉換,這個完成機制,在咱們主機上叫作stub resolver,可翻譯成名稱解析器,這是一個軟件也能夠理解爲程序。這個名稱解析器會經過某個庫來完成經過nsswitch的配置文件中指定的文件files來查找該文件中有沒有咱們查找的主機名對應的IP地址,若是有就能夠查找成功。如:當咱們去ping www.baidu.com的時候,這是個主機名,是無法創建直接聯繫的,須要轉換成IP地址才行,這時候ping命令會藉助於本地的stub resolver來完成名稱解析,stub resolver第一步先查找nsswitch的配置文件中指定的files文件查找有沒有對應的IP的地址,若是有就查找成功,沒有,就經過咱們的DNS服務器來解析。
在早期的時候,由於當時計算機不多,雖然當時也有IP地址,但咱們人記憶數字的能力遠沒有咱們記憶字符串的能力強,因此那個時候就是經過hosts文件來實現解析的過程。每一個主機上都有一個hosts文件,裏邊記錄有主機名和IP地址的對應關係。hosts文件的格式爲:IPADDR FQDN(即主機名) Ailases(別名),當用戶要解析某個主機名或別名的時候,系統經過本地的hosts文件來查找第二列有沒有匹配的,有就把第一列的IP地址返回給用戶,由此實現解析。但後來隨着主機的增多,這種方法顯然已經沒法知足咱們的須要。有點扯遠了,好了,咱們還回到咱們的DNS上來。想要了解更多關於該方面的信息,請查閱相關資料。數據庫

DNS,採用的是C/S架構,使用一種分佈式數據庫,有嚴格的上下級關係,上級僅知道其直接下級,而下級只知道根的位置。當咱們要解析某個主機名的時候,先從最上級進行查找,而後逐級往下查找,最終返回結果。
最上級的是根域,用.表示根域,根域下又有許多TLD。
TLD:Top Level Domain頂級域,頂級域又分爲三類:
- 組織域:如:.com,.org,.net,.cc等等
- 國家域:如:.cn,.hk,.iq,.ir,.jp,.us等等
- 反向域:IP-->FQDN(早期僅能實現該解析方式)
- 反向:IP-->FQDN
- 正向:FQDN-->IPvim

DNS域名解析查詢過程
DNS的查詢過程,按查詢方式的不一樣,分爲遞歸查詢和迭代查詢。
遞歸查詢:只發出一次請求,本地主機向本地域名服務器發出查詢請求,若是本地域名服務器可以解析,則返回查詢結果,不然,本地域名服務器向根請求查詢,若是根知道結果則返回給本地域名服務器結果,不然,就由根在向下移級域名查詢結果,這樣逐級查詢,最終逐級返回結果,最終返回到本地主機。
迭代查詢:發出屢次請求,本地主機先向本地域名與服務器發出查詢請求,若是本地域名服務器可以解析,則返回結果,不然,由本地主機向根查詢,一樣,若是根可以解析直接返回結果,不然返回負責該域名解析的下一級域名,讓本地主機找該域名繼續查詢,最終,找到結果。
在實際的網絡中,通常採用兩段式查詢過程,即先遞歸,後迭代。從本地主機到本地域名服務器採用遞歸查詢,而從本地域名服務器到最終結果則採用迭代方式查詢。
DNS的解析過程又可分爲正向解析和反向解析。由FQDN到IP是正向解析,而由IP到FQDN屬於反向解析。windows

DNS查詢實例緩存

咱們以查詢www.redhat.com爲例來了解DNS查詢的過程,如上圖
一、本地客戶端將www.redhat.com的查詢提交給本地DNS服務器,此時採用遞歸查詢方式。
二、本地DNS服務器檢查區域數據文件,因爲此服務器不負責redhat.com的解析,所以,本地DNS服務器將查詢傳遞到根服務器,請求解析主機名稱。根服務器把.com服務器IP返回給本地服務器,此時採用的是迭代查詢方式。
三、本地DNS服務器將請求發給.comDNS服務器,此服務器根據請求將redhat.com的DNS服務器IP地址返回給本地DNS服務器,此時依然是迭代查詢。
四、本地DNS服務器向redhat.com的DNS服務器發送請求,因爲此服務器負責該域名解析,所以將www.redhat.com的IP地址返回給本地DNS服務器。
五、本地DNS服務器最終將結果發給本地客戶端。服務器

DNS服務器類型
DNS服務器類型主要分爲如下幾種:
(1)主DNS服務器(primary name server):它是特定域全部信息的權威性信息源。它從域管理員構造的本地磁盤文件中加載域信息,該文件(區文件)包含着該服務器具備管理權的一部分域結構的最精確信息。主服務器是一種權威性服務器,由於它以絕對的權威去回答對其管轄域的任何查詢。
(2)輔助DNS服務器(secondary name server):它可從主服務器中複製一整套域信息。區文件是從主服務器中複製出來的,並做爲本地磁盤文件存儲在輔助服務器中。這種複製稱爲"區文件複製"。在輔助域名服務器中有一個全部域信息的完整拷貝,能夠有權威地回答對該域的查詢。所以,輔助域名服務器也稱做權威性服務器。配置輔助域名服務器不須要生成本地區文件,由於能夠從主服務器中下載該區文件。
(3)高速緩存服務器(caching-only server):可運行域名服務器軟件,可是沒有域名數據庫軟件。它從某個遠程服務器取得每次域名服務器查詢的結果,一旦取得一個,就將它放在高速緩存中,之後查詢相同的信息時就用它予以回答。高速緩存服務器不是權威性服務器,由於它提供的全部信息都是間接信息。對於高速緩存服務器只須要配置一個高速緩存文件,但最多見的配置還包括一個回送文件,這或許是最多見的域名服務器配置。網絡

DNS的資源記錄類型

數據庫中的每個條目稱做一個資源記錄(Resource Record,RR)

資源記錄的格式:
NAME [TTL] IN(關鍵字) RRT(資源記錄類型) VALUE
如:
www.hulunbeier.com. IN A 172.16.0.1
172.16.0.1 IN PTR www.hulunbeier.com架構

資源記錄類型:
SOA(Start OF Authority):起始受權記錄(第一條必須是此記錄)
ZONE NAME TTL IN SOA FQDN ADMINISTRATOR_MAILBOX (
serial number:可理解爲版本號
refresh:檢查時間週期
retry:重試時間
expire:過時時間
nagative answer TTL:否認答案緩存時間 )
時間單位:M(分鐘)、H(小時)、D(天)、W(周),默認爲秒
郵箱格式:admin@hulunbeier.com --寫爲--->admin.hulunbeier.com
如:
hulunbeier.com. 500 IN SOA ns1.hulunbeier.com. admin.hulunbeier.com. (
2013040101
1H
5M
1W
1D )
NS(Name Server):DOMAIN NAME-->FQDN :名稱服務器(任何一個NS記錄都有一個A記錄與其相隨)
如:
hulunbeier.com. 500 IN NS ns1.hulunbeier.com.
ns1.hulunbeier.com. 500 IN A 172.16.0.1
MX(Mail eXchanger):ZONE NAMA-->FQDN :郵件交換器
ZONE NAME TTL IN MX pri VALUE
優先級:0-99,數字越小級別越高
如:
hulunbeier.com. 500 IN MX 10 mail.hulunbeier.com.
mail.hulunbeier.com. 500 IN A 172.16.0.10
A(address):FQDN-->IPv4
AAAA:FQDN-->IPv6
PTR(pointer):IP-->FQDN :指針記錄
CNAME(Canonical NAME):Alias-->FQDN :別名記錄
www2.hulunbeier.com. IN CNAME www.hulunbeier.com.
ftp IN CANME www
TXT
CHAOS
SRV框架

區域文件,包括正向區域文件和反向區域文件。分佈式

正向區域文件格式爲:
hulunbeier.com. IN NS FQDN
www.hulunbeier.com. IN A 192.168.0.1
第二行可簡寫爲:
www IN A 192.168.0.1

反向區域文件:
0.168.192.in-arpa. IN SOA FQND
如:
1.0.168.192.in-arpa. IN PTR www.hulunbeier.com.
可簡寫爲:
1 IN PTR www.hulunbeier.com.

咱們主機上的DNS服務實際上是經過一種軟件BIND來實現的,要想使用須要先安裝而後才能使用。這裏再也不介紹如何安裝。下面咱們介紹下BIND。bind的版本咱們使用的是bind97版本。因此咱們主要介紹bind97。

bind97安裝後會生成以下幾個目錄:
/etc/named.conf #這是主配置文件,裏邊包含有BIND進程的工做屬性的定義和區域的定義。
/var/named/* #這個目錄下是全部區域數據文件存放的地方。在該目錄下包含這樣兩個文件:
/var/named/named.localhost
/var/named/named.loopback #這兩個文件是本地主機名的正反解析文件。
/etc/rc.d/init.d/named,這個是服務,咱們可以使用以下幾個命令來開啓、關閉服務等。
{start|stop|restart|status|reload}

bind安裝完成後,在修改配置文件及添加區域數據文件時,常使用以下兩個命令,對其進行檢查。
named-checkconf:檢查配置文件有沒有語法錯誤
named-checkzone:檢查區域文件有沒有錯誤

dig:Domain Information Gropher ,該命令必定要熟記,是查詢DNS的主要命令。下面使用時咱們跟邊使用邊介紹其用法。這裏先說兩個簡單命令。
dig -t NS . :可查看根域名服務器信息(前提是本機必須能夠上網)
dig -t NS . @host :表示經過host主機查看根域名服務器信息

區域的定義:/etc/named.conf配置文件
zone "ZONE NAME" IN { #定義區域名稱,其中IN是關鍵字
type [master|slave|hint|forward]; #指定區域類型
file "ZONE_DATA_FILENAME"; #指定區域數據文件保存地文件
masters { MASTER_IP; }; #指明主服務器地址,該定義只在從服務器上使用
};

一塊兒看一下其配置文件裏的內容:

options { #定義全局選項,在全部區域中均有效,若是區域中對某一項有定義,則使用區域中定義的,不然使用此處已定義好的
listen-on port 53 { 127.0.0.1; }; #指定BIND偵聽的DNS查詢請求的本機IP地址和端口
listen-on-v6 port 53 { ::1; }; #同上,但只用在IPv6版本中
directory "/var/named"; #指定區域配置文件所保存的路徑
dump-file "/var/named/data/cache_dump.db"; #當執行rndc dumpdb命令時,DNS服務器存放數據庫文件的路徑名
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; }; #指定接受DNS查詢請求的客戶端
recursion yes; #是否容許遞歸

dnssec-enable yes;                         
   dnssec-validation yes;  
   dnssec-lookaside auto;  

   bindkeys-file "/etc/named.iscdlv.key";

};

logging { #指定BIND服務的日誌參數
channel default_debug { #日誌通道,用於指定日誌發送目標,default_debug是通道名稱
file "data/named.run"; #記錄的日誌保存到指定路徑下的的文件中
severity dynamic; #指定日誌的級別
};
};

zone "." IN { #指定區域配置參數
type hint; #根
file "named.ca"; #指定保存數據文件的路徑,這裏是相對路徑,即相對上邊的/var/named
};

i nclude "/etc/named.rfc1912.zones"; #該配置文件中其餘區域定義在該文件中,這裏使用該命令將該配置文件包含進來

先介紹幾個命令,用於查詢:

dig -t RT(資源記錄類型) NAME [#IP] #當記錄類型不一樣時,其後所跟的名稱也不一樣
dig -t NS ZONE_NAME #經過區域名查詢
dig -x IP:根據IP查找FQDN
#在使用該命令時,系統會返回給咱們不少信息,咱們主要看ANSWER SECTION這個選項的信息,這纔是咱們想要的答案,其餘選項不作介紹
dig +norecurse -t A FQDN @HOST #經過host主機不遞歸查詢該FQDN,默認狀況使用遞歸查詢
dig +trace -t A FQDN @HOST #經過host主機追蹤查詢該FQDN的查詢過程
host -t RT NAME:查詢名稱的解析結果
如:# host -t RT www.mageedu.com
nslookup #交互式查詢界面,與windows下的該命令相似
nslookup>
server IP
seT q=RT
set q=A
NAME

在修改/etc/named.conf前請確保下面的值你已修改過,不然當你查詢時可能會對結果有影響。

臨時性關閉SELinux:
getenforce #表示查看SELinux是否啓用,輸入該命令若是顯示Enforcing,則須要關閉

setenforce 0 #關閉SELinux服務
setenforce 1 #開啓該服務

永久關閉,可編輯/etc/selinux/config文件修改SELinux=Permissive

如今咱們來配置本地緩存服務器。
可編輯/etc/named.conf配置文件,進行修改

options {
directory "/var/named" ;
};

zone "." IN {
type hint;
file "named.ca"; #默認狀況下該文件是存在的,可去/var/named目錄下查看
};

zone "localhost" IN { #該區域和下邊的區域定義可實現本機的正反向解析
type master; #指定主服務器
file "named.localhost"; #默認狀況下該文件是存在的,可去/var/named目錄下查看
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback"; #默認狀況下該文件是存在的,可去/var/named目錄下查看
};

配置好以上幾個,緩存服務器創建好

service named start #重啓服務便可生效

vim /etc/resolv.conf #編輯本機的dns服務器指向指定
search example.com
nameserver 172.16.32.100 #要換成本主機的域名服務器地址

要想下次開機啓動,可用以下命令:

chkconfig named on

緩存服務器就可使用了,就算是下次從新開機也可使用

相關文章
相關標籤/搜索