您好,登錄后才能下訂單哦!
最近和朋友討論起了當時注冊的域名,又想起來了DNS服務器,剛剛好當時學習的時候也不是很精通,就趁著這個時間段再一次回顧了以下。讓我們一起看一下DNS服務器吧
這篇文章的目錄結構如下:
- 什么是 DNS 服務器?
- 什么時候要用 DNS 服務器
- 為什么要用 DNS 服務器?
- 誰會用 DNS 服務器?
- 怎么使用 DNS 服務器?
DNS(Domain Name Server ,域名服務器)是將域名(Domain name)和對應的IP地址(IP address)進行轉換的服務器。那么什么又是域名尼?
域名:
通俗點說就是每次上網的時候輸入的網址也可以理解為域名,而百度給的定義是域名是由一串用點分隔的名字組成的,通常包含組織名,而且始終包括兩到三個字母的后綴,以指明組織的類型或該域所在的國家或地區。
因為我們記憶的原因,現在當我們要去上網的時候,總會記住幾個域名,然而并不會去記住一個個服務器對應的IP。因此當我們在用域名訪問別人主機的時候,DNS 服務器就已經默默的起到了作用,DNS 服務器會將我們輸入的域名一 一的轉換為對應的IP然后再去訪問別人的主機。
因此當在一個企業的內部,要想在企業內部讓諸多個主機通過主機名訪問彼此,就要構建自己的 DNS 服務器了。
在剛剛開始擁有網絡的時候,全球僅僅只有幾個大學的實驗室加入網絡,因此大家可以憑借記住很少的IP地址來進行彼此之間的聯系,并且在當時的每個主機上都會擁有一個為hosts的文件用來本地解析,如今依舊擁有這個文件來進行本地的域名解析。在這兩個系統下其文件所在的地方。
linux系統:/etc/hosts
Windows:%windir%\System32\drivers\etc\hosts
但是隨著信息化的發展,越來越多的用戶加入到網絡中,大家的記憶并不能全部都記住彼此之間的ip地址,并且如果繼續使用原來的辦法(使用hosts文件)的話,hosts文件的條目越來越多,每一次的查詢越來越繁瑣,因此就出現了一個組織 IANA(The Internet Assigned Numbers Authority,互聯網數字分配機構),IANA 來保存每一個用戶的主機名與IP條目的關系。因此大家就不用再紛紛寫入自己的hosts文件,僅僅需要定下一個計劃任務(crontab)讓其隔一段的時間就從 IANA 的服務器去下載hosts文件到本地,雖然這樣擁有一定的可行性,但是互聯網的發展是爆炸性,用戶的增長是幾何的倍數增加,因此當用戶數量再一次增加的時候,就是 IANA 的策略也已經行不通了,因此就開發出了 BIND(Berkeley Internet Name Domain,伯克利Internet名字域)使用BIND軟件來構建域名服務器。而其構建的方法和Linux的目錄結構非常的相似,使用一種倒置的樹狀結構,如下圖:
當然頂級域還有很多我就不一 一列舉了,因此現在使用 BIND 就對每一個的域名劃分到了不同的分支下面了,這樣不僅減輕了根服務器的壓力而且非常的容易尋找并且管理,并且根(.)依舊會能夠管理到每一個域名,但是其僅僅管理一級域就可以了,這樣可以極大的減輕根服務器的壓力。然后通過不斷的逐個查找就能夠找尋到我們所需要的信息。并且 IANA 也不再提供原本的 hosts文件了,變為一個全球范圍的域名供應商,管理 DNS 域名根和.int,.arpa等資源。相關的13個根服務器,1個為主根服務器在美國。其余12個均為輔根服務器,其中9個在美國,歐洲2個,位于英國和瑞典,亞洲1個位于日本。
對于這個問題,很不好回答,但是我覺得如果大家感興趣,或者想要了解的都可以去接觸 DNS 服務器。
要開始真正深入了解并配置 DNS 服務器了。
對于如何使用 DNS服務器來說是一個比較復雜的問題,因此我們通過下面一些步驟來慢慢進一步的了解DNS服務器
首先我們需要知道,DNS 服務器所使用的端口是(53/UDP,53/TCP;)使用BIND軟件來進行使用的并且是在應用層的一個協議,使用 C/S 架構。并且當我們安裝 BIND 之后就能通過 named 服務來進行啟動 DNS 服務了,當然對于真正的了解到 DNS 服務器還是需要首先知道一些名詞的,隨后遇到的再慢慢說起來。
FQDN:Fully Qualified Domain Name,也就是上文所說的域名。
正向解析:FQDN ==> IP 表示通過DNS服務器FQDN解析為IP的過程
反向解析:IP==>FQDN 表示通過DNS服務器由IP查詢到FQDN
domain:邏輯概念,域
zone:物理概念,區域
DNS的服務器類型:1主 DNS服務器(master)2輔助DNS服務器(slave)3緩存服務器4轉發器(forward)
下面這個圖能夠幫助我們知道什么是 domain 與 zone。
可以看到每一個zone下面都會有很多的資源,當我們訪問其下面的資源時,其對應的主機就給我們回答,并且每個區都有自己的授權服務器,當我們要在DNS服務器查詢FQDN的時候會給我們返回兩種類型的答案,即權威答案(Authority Answer,AA)和非權威答案。
一、安裝 BIND 軟件
BIND軟件可以運行在大部分的Linux主機上,并且在RHEL6.5及以后,在系統的光盤自帶了BIND服務的安裝文件。
而我們首先使用簡單的方法進行安裝(yum),首先查看與 bind相關的軟件包。
$ yum list | grep bind
一些主要軟件的作用如下:
bind :提供了 DNS 服務的主要程序及相關文件
bind-libs :提供了bind、bind-utils需要使用的函數庫
bind-utils :提供了對 DNS 服務器的測試工具,如 nslookup等
接下來我們就安裝bind
$ yum install -y bind
二、配置 BIND 軟件
bind軟件的安裝之后會出現兩個很重要的路徑,一個是主配置文件/etc/named.conf 另一個是工作目錄/var/named ,我們分別來進行一 一探索。
1.簡單DNS服務器的主要配置
這是用于啟動 named 服務的主要配置文件,對于簡單的DNS服務器來講其中主要分為兩個部分的定義,全局定義和區域定義。
對于全局定義的段使用如下的定義。
options {
directory "/var/named";
};
注:named.conf 配置文件要求每一行的結束都需要一個分號結束
配置的含義就是將每個區域的資源記錄(Resource Record,簡稱RR)文件放在了/var/named/的目錄之下。
那么RR到底什么東西尼?
懵。。。,先記住向下看看
三.配置文件
在/etc/named.conf配置文件中除了剛剛定義的全局定義之外,就是各個區域(zone)的定義了。
通常對于每一個區域(zone)的簡單定義就是如下的格式。
zone "ZONE_NAME" IN {
type master|slave|hint|forward;
file "ZONE_NAME.zone"
};
注:type 就表明了區域的 DNS服務器類型。
file就是將這個區域的RR放在什么地方,相對路徑。
比較特別的是下面這個區域的定義,表示這是一個根域的dns服務器。
zone "." IN {
type hint;
file "named.ca"
};
當然,DNS的配置文件也支持使用acl來自定義,訪問控制列表。并且默認就存在這樣四個列表,none,any(任何主機),local(本機),以及localnet(本地網絡)。定義就如下:
acl acl_name{
statement;
};
如果安裝時候在/var/named/目錄下并沒有named.ca 的文件話可以使用dig 命令來生成named.ca文件,需要能夠訪問互聯網,否則查詢不到根服務器。
[root@rs1 named]# dig -t NS . >/var/naemd/named.ca
首先構建一個最簡單的 DNS服務器,也就是緩存 DNS 服務器。任何一個復雜的 DNS 服務器都是由簡單的緩存服務器一步步變難的,覺得學習也是這個道理哈。
緩存 DNS 服務器:不負責解析任何區域(除了(本機)localhost)
/etc/named.conf 配置如下
options {
directory "/var/named";
};
//正向解析本機
zone "localhost" IN{
type master;
file "named.localhost";
};
//反向解析本機
zone "0.0.127.in-addr.arpa" IN{
type master;
file "named.local";
};
反向解析比正相解析要復雜許多,區域名是比較特殊,為網斷名+in-addr.arpa
接下來的就是上面都提到過的各個區域的 RR 文件了,在里面會有下面幾個特殊的定義 。
TTL:Time-To-Live 每一個記錄的生存時間
SOA:Start Of Authority,起始授權記錄
A:Address IPV4的地址記錄
AAAA:IPV6的地址記錄
PTR:Pointer反向解析記錄,一般不能和A記錄出現在一起
NS:Name Server dns服務器的定義
MX:Mail eXchange 郵件的定義
CNAME:規范名字
對每一個資源記錄文件來說,首先定義的都應該是這樣的一行
ZONE_NAME [TTL] IN SOA localhost.(ZONE_NAME的 DNS服務器名) admin.localhost.(管理員的郵箱)
(
2018091501 ; (版本號)serial
1H ; (刷新時間)refresh
5M ; (重試時間,應當小于刷新時間)retry
1D ; (超時時間,設置嘗試幾天之后認為主 DNS 服務器宕機了)expire
1H ; (否定回答,對方緩存多長時間)minimum
)
如果一開始在/var/named/下有一些文件,則可以看到有以下相應的符號
$TTL 600 :設置全局的TTL時間,定義后可以不再使用TTL
$ORIGIN :默認補充的字段,如果在一些地方使用的并非完整的FQDN則在后面補充上ORIGIN定義的字段,默認就是/etc/named.conf中定義的區域名字(ZONE_NAME)
@:本文件在/etc/named.conf 配置文件中定義的區域
因此/var/named/named.localhost 的定義如下:
$TTL 600
@ IN SOA localhost. admin.localhost. (
20180913
1H
5M
1D
1H )
IN NS localhost.
localhost. IN A 127.0.0.1
對于每一行的定義如果和上一行的第一列相同,則可以省略
相應的反向解析的配置文件
$TTL 600
@ IN SOA localhost. admin.localhost. (
20180913
1H
5M
1D
1H )
IN NS localhost.
1 IN PTR localhost.
注:1 表示的主機名,如上面我們所說的如果沒有寫全就會默認補充上ORIGIN,所以其的全部就是1.0.0.127.in-addr.arpa
至此我們就構建了一個最簡單的緩存 DNS 服務器。可以使用bind帶有的命令來查看配置文件是否有錯。
named-checkconf
named-checkzone zone zone_file
然后我們使用 dig 命令來測試一下
@后面指定為我本地的服務器ip,因此對于不同的host 指定不同的ip,其他詳細的介紹查詢幫助文檔。
接下來我們就討論一個較為復雜的問題,一個 FQDN==> IP 到底發生了什么?
迭代查詢:和普通的迭代算法一樣,就是一次次不斷的去請求。
遞歸查詢:僅發出一次請求,一次應答
對于發起查詢請求的客戶端,僅觸發了一次查詢并獲得了一次結果這就是遞歸查詢,而對于當前域內的dns服務器,通過一次次不斷的迭代查找才獲得結果,因此就是迭代查詢。
這樣是一個能夠查詢到的一個過程,如果dns查詢不到我們要查詢的記錄會發什么?
對于這樣,就在SOA記錄的minimum給出了解釋,例如我們查詢ftp.a.com,但是當dns再一次從根查詢到a.com的域內發現并沒有ftp.a.com的這個子域,因此a.com.域就會給dns服務器一個否定回答,然后再由dns服務器將否定回答給客戶端。
以下就是一個dns服務接受到請求然后進行查詢的主要流程。
dns 服務器查詢的詳細介紹
1.如果查詢請求是本機所負責的區域中的數據的話,要通過查詢區域數據文件返回結果
2.如果查詢請求不是本機所負責區域中的數據的話,就查詢緩存
3.如果緩存中沒有答案,則向根發起查詢請求,并不斷迭代
那么讓我們更深一步的去探索dns的功能吧
在上面我們搭建了一個簡單的 DNS緩存服務器,現在讓我們來將他變成一個主DNS服務器,步驟很簡單,
1.將主配置文件中,加入我們的正向解析域名以及反向解析域名。
2.在工作目錄下,添加相應的數據文件。
3.重啟服務,重新載入也可以的。
是不是很簡單,首先是主配置文件,我的dns服務器的網絡是192.168.159.143.
zone "athlete.run" IN {
type master;
file "athlete.run.zone";
};
zone "159.168.192.in-addr.arpa" IN {
type master;
file "athlete.reverse";
};
然后是工作目錄文件,我定義的是athlete.run.zone和athlete.reverse所以編輯兩個文件。
這個是athlete.run.zone文件
$TTL 60
@ IN SOA ns1 admin (
2018091401
1M
5S
1H
1D )
IN NS ns1
IN NS ns2
IN MX 10 mail
ns1 IN A 192.168.159.143
ns2 IN A 192.168.159.146
www IN A 192.168.159.143
mail IN A 192.168.159.143
剩下這個就是athlete.reverse文件了
$TTL 600
@ IN SOA ns1.athlete.run admin.athlete.run (
2018091403
1D
5M
7D
1D )
IN NS ns1.athlete.run.
143 IN PTR ns1.athlete.run.
143 IN PTR www.athlete.run.
最后
# systemctl reload named 或者 # systemctl restart named
最后用dig工具測試一下就可以了,當然我這兩個文件可能寫的比較簡單,但是能使用的。
介紹了這么多 DNS的配置,讓我們換個話題發現一下。
如果是通過YUM安裝bind的話,會默認給你安裝另一個工具叫做:rndc。
rndc:remote name domain controller,遠程名稱域控制器
通過名字就可以了解到,這個工作的特性了,所以為了安全使用的是tcp的953端口953/TCP,接下來讓我們使用這個工件吧。
首先rndc的使用也是有配置文件的,在哪里尼?
# rpm -ql bind | grep rndc
但是,一開始/etc/rndc.conf這個目錄的文件是不存在,所以需要我們手動通過rndc 命令來實現
值得一提的就是如果兩文件都存在的話,每次執行命令就會給你警告,挺煩的,所以自己把握。
需要一提的是,這個文件里面的后幾行是需要拷貝的/etc/named.conf中的,因此,相應的 vim 操作自己查詢一下吧。如果一切都完成的話,就可以通過一下命令來重新讀取了,當然也可以重啟,但是在大型工作中,服務器某個應用重啟會造成太多的損失,因此就需要我們通過重讀配置文件來重新應用。
# rndc reload
出現這個標志就是成功了,如果失敗了,那么就詳細的查看日志文件查看把!
# cat /var/log/message
對于rndc的其他主要使用的命令,我也總結在下面:
stop :停止 DNS服務器
reload:重新載入配置文件和區域文件
reload zone:重新載入某區域文件
reconfig:重新載入配置文件和發生過更新的區域文件
status:查看dns的詳細情況
querylog:使用查詢日志(不推薦使用)
flush:清空緩存
還有一些其他使用幫助文檔,查看把。
到這里對一個DNS服務器應該就有了一個中級的認識了,接下了討論就是我們的更深一步的話題了。
子域授權,我們可以通過自己來申請一個子域,例如 a.org 那么對這個子域來說我們可以添加至多127個子域,也就是說這個樹的深度最多到127層。而在每一個不同深層次的域,其的授權都是在上一級子域中授權的。比如上面圖片的例子,d.org 的子域www.d.org和ftp.d.org分別就是d.org的子域,并且www.d.org 子域的dns服務器授權是由d.org進行。 在下一步的話就是edu.www.d.org 也可以使www.d.org授權的子域。 相應授權的子域的dns配置文件就是在子域自己的區域中定義。
轉發 DNS服務器
這個的理解也比較簡單,就是在主配置文件中加入 forwarders { IP; };,比較特殊的就是分號的左右兩邊均需要空格,分號內可以寫多項,不過需要分號隔開。這樣就能實現在本地的查詢請求,本機會轉發至指定IP的DNS服務器去查詢。值得一提的就是對于轉發也是有類別的。
first:如果DNS1去找DNS2請求解析,DNS2并未響應,則DNS1自己去解析
only:如果DNS1去找DNS2請求解析,DNS2未響應,則無查詢結果(希望全給了別人。。。)
所以我們定義轉發的話再加入一行轉發類型,結果就是這樣,就能實現轉發。
forward first|only;
forwarders { IP };
當然如果放在全局option段就是全局轉發,特定的區域就是在查詢到這個區域的時候再轉發。
主從DNS服務器
對于每一個時常在線服務器來說,都應該做出相應的冗余,以免突然時刻主服務器宕機了,或者是數據丟失了,但是DNS服務器比較奇特的就是,當主DNS服務器宕機之后,輔助的DNS服務器多次嘗試重連主DNS服務器如果沒有響應的話,從DNS服務器會跟著主DNS服務器一起宕機。(雙宿雙飛。。。)
因此我們就要做好輔助的DNS服務器時刻保存主DNS服務器的數據文件,以免主DNS服務器宕機造成數據丟失。
因此說到傳送,對于DNS服務器來說有著兩種區域傳送:
完全增量傳送:axfr 一開始進行傳送的文件
增量傳送:ixfr 當從服務器有了區域傳送文件后,以后的傳送都將是增量傳送
因此我們可以使用dig命令來查看我定義的區域的信息
可以看到這么多比較重要的信息,肯定不能白白的暴露給其他人,因此我們只能給特定的主機進行區域傳送,這樣就需要在主配置文件中加入
allow-transfer { IP; };
要定義一個主從的DNS,主的服務器就是剛剛我們一直使用,從服務器的配置很簡單,就另外啟動一臺電腦或虛擬機,然后使用yum安裝bind,并在配置文件中增加這樣一個區域。
zone "athlete.run" IN {
type slave;
masters { IP; };
file "slaves/athlete.run.zone";
當然slaves是安裝bind的時候自動給我們創建的,因此我們可以它,當然也可以自己定義地方,不過需要注意的是,DNS服務器啟動的進程屬主屬組均是named所以我們創建的文件也應該均是named并且權限為640。對于這樣的文件可以一開始不存在,然后啟動從服務器,就可以看到相應的文件生成。當然在我做實驗的時候,遇到了好多次這樣的現象,從主服務器傳送來的文件在從服務器看到的格式是data,然而其本身是一個ASCII TEXT的文件,所以我們就需要在從服務器的主配置文件中加入這樣一個定義
masterfile-format text;
這樣就一切完成了,當我們更改了主DNS服務器的數據文件,并增加了版本號之后,主DNS服務器就會主動的提醒從DNS服務器來更新文件。當然這樣還是需要一些額外配置的。
主從同步:
主服務器:授權允許同步,有從DNS服務器的NS記錄,并且授權允許區域傳送
從服務器:定義區域
這樣就能完成主從復制了。
最后一個也就是DNS服務器至今最流行的一個應用,CDN
CDN:Content Delivery Network ,內容分發網絡
簡單的說CDN就是將各個大型的域名進行解析到不同的IP,使不同的人來訪問就進入到不同的網段,但是網頁的頁面卻完全是一樣的
就像這樣,本來是一個DNS服務器,但是強行將其拆分成為兩個不同的DNS服務器域,左邊的人訪問這個DNS服務器,會根據一些判斷然后讓其訪問左邊的DNS服務器,而右邊的人是相同的,因此這也能夠叫做智能DNS,也稱之為DNS的腦裂。這樣到底有什么用尼?
這個圖就介紹了,當不同區域的用戶去請求同一個頁面的時候,DNS服務器就會根據客戶端的地理位置進行檢測,然后將其本地的數據文件存放的IP地址返回,這樣就減少了訪問延遲,并且相當與將數據推送到了每一個互聯網用戶的家門口。
介紹了這么多,那么到底怎么定義不同的區域尼?
其實定義很簡單,就是除了全局段之外,再使用view來定義每一個視圖。
view VIEW_NAEM {
match-clients {I網段/掩碼;};
//一些區域的定義
}
那么匹配到的客戶端就會進入到相應的視圖之中進行解析。
使用了視圖也有需要注意的地方:
1多個view內可能需要對同一個區域進行解析,但使用不同的區域解析庫文件。
2.一旦使用了視圖,所有的zone都只能定義在view中
3.僅有必要在匹配到允許遞歸請求的客戶端所在view中定義根區域
4.客戶端請求到達后,自上而下檢查每個view所服務的客戶端列表
最后的最后 - -,這其實和一般使用的DNS作用不大,但是還是有一些相關關系的,編譯安裝BIND
首先就去bind的官網下載bind的軟件包
將其解壓到我們本地,然后進入和普通的應用軟件一樣,configure make && make install
主要是我們手動安裝的話什么都不會給我們提供,遠遠沒有yum簡潔,但是可以使用自己的定制軟件,主要需要我們做到以下這些步驟
1.修改PATH環境變量,輸出二進制程序的搜索路徑新路徑
2.導出庫文件搜索路徑
3.導出頭文件搜索路徑
4.導出幫助文件手冊搜索路徑
5.創建配置文件
到此我們終于聊完了DNS服務器相關的東西,不過還是相信自己知道的僅僅是一點點,望自己能夠了解到更多的知識。
不忘初心,砥礪前行。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。