每一個 IP 地址均可以有一個主機名,主機名由一個或多個字符串組成,字符串之間用小數點隔開。有了主機名,就不要死記硬背每臺 IP 設備的 IP 地址,只要記住相對直觀有意義的主機名就好了。這就是 DNS 協議所要完成的功能。linux
今天咱們將討論DNS服務器,特別是Linux DNS服務器,及其如何安裝、配置和維護它。數據庫
在沒有DNS服務器的狀況下,每一個系統在本地網絡上保留其主機名和相應IP地址列表的副本是合理的——特別是在沒有互聯網鏈接的小型站點上。瀏覽器
在Linux系統中,這個列表就是/etc/hosts文件。 即便你沒有DNS服務器或DNS服務器不可用,該文件也可使用/etc/hosts文件將IP地址轉換爲名稱。緩存
也許你已經有DNS服務器了,但你也會由於其它緣由而想保留這個文件。例如,系統可能須要在向外部查詢以前在本地查找DNS服務器的IP地址;這意味着系統在查詢DNS服務器以前先檢索該文件,若是查找到對應的域則無須查詢任何DNS服務器直接將其轉換爲IP地址。安全
試試編輯下/etc/hosts文件,並添加如下信息:127.0.0.1 google.com.服務器
而後,返回你的瀏覽器,輸入google.com,看看結果如何。若是你的系統上安裝了Apache而且本地主機正在運行,瀏覽器會顯示localhost的索引頁,而不是Google頁面。網絡
做爲確認,你能夠將google.com映射到任何網站的任何其餘IP地址並查看結果。架構
所以這個文件所作的是將IP地址轉換成名字,但這僅僅是在同一互相鏈接的網絡下。 那麼外部網絡和衆多系統的全部記錄是如何維護的呢?工具
每一個人都須要維護本身的/etc/hosts文件並本身更新嗎?網站
更爲穩健的域名服務是DNS服務器。
當你訪問網站時,你能夠輸入FQDN(Fully Qualified Domain Name,徹底限定域名)或相似likegeeks.com或www.google.com的域名。在域名中從右到左的兩個點之間的每一個文本依次是頂級域組件、二級域組件和三級域組件。
因此,com是頂級域名組件; google是二級域組件; 而www是三級域名組件。
實際上,當你訪問任何網站時,瀏覽器會默認在域的末尾添加一個不可見的點,所以該域將像www.google.com.同樣。 該點被稱爲根域。
該點是由一大堆稱爲根域名服務器的特殊服務器管理的。截止這篇文章發表前,世界上有13個根域名服務器。 你能夠把他們當成互聯網的大腦 – 若是他們失效了,世界上就沒有互聯網了。
爲何是13呢? 由於若是世界的某處地震可能會破壞一個根服務器,因此其餘的服務器能夠繼續提供服務直到受影響的服務器從新上線。
這些根名稱服務器按字母順序命名,名稱如a.root-server.net、b.root-server.net等。
咱們已經見過頂級域名的組成部分,如 com。能夠認爲,頂級域名爲 DNS 命名空間提供分類組織。
頂級域名(TLD)根據地理或功能方面分爲幾類。
截止本文撰寫時,網上有 800 多個頂級域名。
頂級域名類別有:
通用的頂級域名如:org, .com, .net, .gov, .edu 等等
國家代碼頂級域名如:.us, .ca 等,分別對應美國和加拿大的國家代碼
新的品牌頂級域名,容許組織建立最多 64 個字符的TLD,如:.linux, .microsoft, .companyname 等
基礎架構頂級域名如: .arpa
當你訪問一個相似 mail.google.com 這樣的網站, 這裏的mail 就是 google.com的子域名.
只有mail.google.com 的名稱服務器知道他下面存在的全部主機,因此Google會回覆是否有一個叫mail 的子域名。根名稱服務器對此並不知情。
一共有三種DNS服務器。
這些服務器上存放了特定域名的配置文件,而且基於此權威地規定了特定域名的地址。主DNS服務器知道所有在它管轄範圍的主機和子域名的地址。
這些服務器做爲主DNS服務器的備份,也承擔必定負載。主服務器知道輔助DNS服務器的存在,而且會向他們推送更新。
這些服務器上不存放特定域名的配置文件。當客戶端請求緩存服務器來解析域名時,該服務器將首先檢查其本地緩存。若是找不到匹配項便會詢問主服務器。接着這條響應將被緩存起來。您也能夠輕鬆地將本身的系統用做緩存服務器。
Linux 下有不少實現了 DNS 功能的包,不過咱們只關注 BIND DNS 服務器。它用於世界上大多數 DNS 服務器。
若是你在使用基於 Red Hat 發行版的 Linux,好比 CentOS,能夠像這樣安裝:$ dnf -y install bind
若是你使用基於 Debian 的操做系統,好比 Ubuntu:$ apt-get install bind9
安裝完成以後就能夠啓動它並讓它在計算機啓動的時候一併啓動起來。
$ systemctl start named
$ systemctl enable named
這個服務使用 /etc/named.conf 做爲配置文件。
BIND 在那個文件中使用像下面這樣的一些語句:
options: 用於全局 BIND 配置。
logging: 配置哪些須要記錄,哪些須要忽略。我推薦你看看 Linux syslog server。
zone: 定義 DNS 區域。
include: 在 named.conf 中包含另外一個文件。
在 options 語句中能夠看到 BIND 的工做目錄在 /var/named。
zone 語句可用於定義 DNS 區域,好比域名 google.com,它包含子域名 mail.google.com 和 analytics.google.com。
上述三個域名(主域名和子域名) 都有一個由 zone 語句定義的區域。
咱們知道 DNS 服務器類型有主域名服務器、輔助域名服務器和緩存域名服務器。不一樣於緩存域名服務器,主域名服務器和輔助域名服務器在應答過程當中是處於同等地位的。
在 /etc/named.conf 的配置文件中,你可使用以下語法定義一個主域服務器:
zone "likegeeks.com" {
type master;
file likegeeks.com.db
};
包含主要區域信息的文件存放在 /var/named 目錄下,從 options 可知,這是一個工做目錄。
注意:軟件服務器或者託管面板會根據你的域名自動爲你建立主域服務器信息的文件名,所以若是你的域名是 example.org,那麼你主域服務器信息的文件就爲 /var/named/example.org.db。
類型爲 master,也就是說這是一個主域服務器。
同定義一個主域服務器同樣,輔助域服務器的定義稍微有些變化:
zone "likegeeks.com" {
type slave;
masters IP Address list; ;
file likegeeks.com.db
};
對於輔助域服務器來講,它的域名和主域服務器是同樣的。上述語法裏的的slave類型表示這是一個輔助域服務器,「masters IP Address list」表示輔助域服務器中區域文件內的信息都是經過主域服務器中區域文件內的信息複製過來的。
即便你已經配置了主域或者輔助域服務器,你仍有必要(不是必須)定義一個緩存服務器,由於這樣你能夠減小DNS服務器的查詢次數。
在定義緩存服務器以前,你須要先定義三個區域選擇器,第一個:
zone "." IN {
type hint;
file "root.hint";
};
zone "." IN {
type hint;
file "root.hint";
};
zone "." IN {
type hint;
file "root.hint";
};
zone "localhost" IN {
type master;
file "localhost.db";
};
定義第三個區域是爲了反向查找到本地主機。這種反向查找是把本地的IP地址執向本地主機。
zone "0.0.127.in-addr.arpa" IN {
type master;
file "127.0.0.rev";
};
把這三個區域信息放到/etc/named.conf文件裏,你的系統就能夠以緩存服務器來工做了。可是如何引用相似likegeeks.com.db, localhost.db, 和 127.0.0.rev這些文件中的內容呢?
這些文件包含具備某些選項的每一個區域的DNS記錄類型。 那麼,這些DNS記錄類型是什麼以及它們是如何寫的?
DNS記錄類型
數據庫文件包含諸如SOA、NS、A、PTR、MX、CNAME和TXT在內的記錄類型。
咱們看看每一種類型都是如何記錄的吧。
SOA:起始受權機構記錄
SOA記錄按以下形式開始描述一個站點的DNS條目:
example.com. 86400 IN SOA ns1.example.com. mail.example.com. (
2017012604 ;serial
86400 ;refresh, seconds
7200 ;retry, seconds
3600000 ;expire, seconds
86400 ;minimum, seconds
)
第一行以域名example.com開始,以句號結束——該語句和/etc/named.conf文件中的區域定義是一致的。咱們要始終記得,DNS配置文件是極其挑剔的。
IN 告訴域名服務器:這是一條網絡記錄。
SOA 告訴域名服務器:這是一條起始受權機構記錄。
ns1.example.com. 是該文件所在域的域名服務器的徹底合格域名(FQDN: Fully Qualified Domain Name)。
mail.host.com. 是域管理員的郵箱地址。你會發現這個郵箱地址沒有「@」標誌,而是被句號所取代,而且末尾還有一個句號。
第2行是一個序列碼,它被用來告訴域名服務器文件是何時升級的。所以,若是你對區域碼作了變動,你必須對這個序列碼進行遞增。這個序列碼的格式是 YYYYMMDDxx ,其中的 xx 是從 00 開始的。
第3行是每秒刷新率。這個值被用來告訴第二個域名服務器查詢主服務器中的記錄是否已經被更新的頻率。
第4行是每秒重試的頻率。若是第二個服務器屢次嘗試鏈接主域名服務器來進行更新檢測,但沒法鏈接上的時候,第二個服務器就會在每秒內重試指定的數值次數。
第5行是超時指示。其目的是爲了第二個服務器能將區域數據緩存下來。這個值告訴這些服務器若是它們不能鏈接到主服務器來進行更新,那麼它們就會在這個指定數值秒數以後拋棄這個值。
第6行告訴緩存服務器,若是它們不能鏈接到主域名服務器時,它們應該在超時前等待多久。
NS記錄用於指定哪一個名稱服務器維護該域的記錄。
你能夠這樣編寫的NS記錄:
IN NS ns1.example.com.
IN NS ns2.example.com.
並不須要有2個NS記錄,可是一般偏好有備份名稱服務器。
A記錄用於提供從主機名到IP地址的映射support IN A 192.168.1.5。
若是你在地址爲192.168.1.5上的support.example.com上有一個主機,你能夠像上面的例子那樣輸入。
請注意,咱們所寫的主機並無句號。
PTR記錄用於執行反向名稱解析,容許某人指定IP地址而後找出對應的主機名。
這與A記錄的功能相反:192.168.1.5 IN PTR support.example.com.
在這裏,咱們鍵入具備點號的完整主機名。
MX記錄告訴其餘站點關於你所在域的郵件服務器地址:example.com. IN MX 10 mail.
固然這個域以句號結束。數字10是郵件服務器的重要性標誌,若是你擁有多個郵件服務器,其中較小的數字不過重要。
CNAME記錄容許你爲主機名建立別名。當你想提供一個易於記住的名稱時,這頗有用。
假設某個站點具備一個主機名爲whatever-bignameis.example.com的Web服務器,而且因爲系統是Web服務器,所以能夠爲主機建立一個名爲www的CNAME記錄或者別名。
你能夠建立名爲www.example.com的域名建立CNAME記錄:
whatever-bignameis IN A 192.168.1.5
www IN CNAME whatever-bignameis
第一行通知DNS服務器關於別名的位置。第二行建立一個指向www的別名。
您能夠將任何信息存儲到TXT記錄中,例如你的聯繫方式或者你但願人們在查詢DNS服務器時可得到的任意其餘信息。
你能夠這樣保存TXT記錄:example.com. IN TXT 」 YOUR INFO GOES HERE」.
此外,RP記錄被建立爲對host聯繫信息的顯式容器:example.com. IN RP mail.example.com. example.com。
在/etc/named.conf文件的頂部,這裏有一個$TTL條目。
該條目告訴BIND每一個單獨記錄的TTL值(time to live,生存時間值)。
它是以秒爲單位的數值,好比14,400秒(4個小時),所以DNS服務器最多緩存你的域文件4個小時,以後就會向你的DNS服務器從新查詢。
你能夠下降這個值,可是默認值一般是合理的。除非你知道你正在作什麼。
當您寫入域文件時,也許您忘記了一個句號或空格或其餘任意錯誤。
你能夠從日誌診斷Linux DNS服務器錯誤。BIND服務經過/var/log/messages上的錯誤,可使用tail命令來查看實時錯誤日誌,須使用-f選項:$ tail -f /var /log/messages。
所以,當你編寫域文件或修改/etc/named.config並從新啓動服務時,顯示錯誤以後,你能夠從日誌中輕鬆識別錯誤類型。
在你成功添加或修改記錄後,可使用host命令查看主機是否正確解析。
host命令容許你將主機名解析爲IP地址:$ host example.com。
此外,你能夠執行反向查找:$ host 192.168.1.5。
你能夠this在此篇文章中查看更多關於host和dig命令的信息。
whois命令用於肯定域名的全部權及其擁有者的e-mail地址和聯繫電話:$ whois example.com.
rndc工具可用於安全地管理名稱服務器,由於與服務器的全部通訊均經過數字簽名進行身份驗證。
此工具用於控制名稱服務器和調試問題。 你能夠經過如下方式檢查Linux DNS服務器的狀態:$ rndc status。
此外,若是你更改任何域(zone)文件,您能夠從新加載服務,而無須重啓命名服務:$ rndc reload example.com。
在這裏,咱們從新加載example.com域文件。 你能夠從新加載全部域:$ rndc reload。
或者你能夠添加新的域或更改服務的配置。 你能夠從新加載配置,以下所示:
$ rndc reconfig。
咱們已經知道Linux DNS服務器的工做原理以及如何配置它。另外一部分固然是與DNS服務器交互的(正在與DNS服務器通訊以將主機名解析爲IP地址的)客戶端。
在Linux上,解析器位於DNS的客戶端。要配置解析器,能夠檢查/etc/resolv.conf這個配置文件。
在基於Debian的發行版上,能夠查看/etc/resolvconf/resolv.conf.d/目錄。
/etc/resolv.conf文件中包含客戶端用於獲取其本地DNS服務器地址所需的信息。
第一個表示默認搜索域,第二個表示主機名稱服務器(nameserver)的IP地址。
名稱服務器行告訴解析器哪一個名稱服務器可以使用。 只要你的BIND服務正在運行,你就可使用本身的DNS服務器。
使用Linux DNS服務器很是簡單。 我但願你發現這篇文章頗有用,而且很容易理解。