當前位置:
首頁 > 知識 > Linux DNS 伺服器安裝、配置和維護,一文看全~

Linux DNS 伺服器安裝、配置和維護,一文看全~


來自:開源中國


譯文:https://www.oschina.net/translate/linux-dns-server-installation-amp-configuration-am


原文鏈接 | http://t.cn/R3dSKnp




每個 IP 地址都可以有一個主機名,主機名由一個或多個字元串組成,字元串之間用小數點隔開。有了主機名,就不要死記硬背每台 IP 設備的 IP 地址,只要記住相對直觀有意義的主機名就行了。這就是 DNS 協議所要完成的功能。




今天我們將討論 DNS 伺服器,特別是 Linux DNS 伺服器,及其如何安裝、配置和維護它。


/etc/hosts 文件




在沒有 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 等。




頂級域名 (或稱作一級域名 TLDs)




我們已經見過頂級域名的組成部分,如 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 伺服器知道全部在它管轄範圍的主機和子域名的地址。



輔助 DNS 伺服器


這些伺服器作為主 DNS 伺服器的備份,也承擔一定負載。主伺服器知道輔助 DNS 伺服器的存在,並且會向他們推送更新。



緩存 DNS 伺服器




這些伺服器上不存放特定域名的配置文件。當客戶端請求緩存伺服器來解析域名時,該伺服器將首先檢查其本地緩存。如果找不到匹配項便會詢問主伺服器。接著這條響應將被緩存起來。您也可以輕鬆地將自己的系統用作緩存伺服器。



搭建 Linux 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



配置 BIND




這個服務使用 /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: 

Name Server Records(名稱伺服器記錄)




NS 記錄用於指定哪個名稱伺服器維護該域的記錄。




你可以這樣編寫的 NS 記錄:


IN      NS     ns1.example.com.


IN      NS     ns2.example.com.


   


並不需要有 2 個 NS 記錄,但是通常偏好有備份名稱伺服器。




A 和 AAAA:

 

Address Records(地址記錄)




A 記錄用於提供從主機名到 IP 地址的映射

 support IN A 192.168.1.5




如果你在地址為 192.168.1.5 上的 support.example.com 上有一個主機,你可以像上面的例子那樣輸入。




請注意,我們所寫的主機並沒有句號。




PTR: Pointer Records(指針記錄)




PTR 記錄用於執行反向名稱解析,允許某人指定 IP 地址然後找出對應的主機名。




這與 A 記錄的功能相反:192.168.1.5 IN PTR support.example.com.




在這裡,我們鍵入具有點號的完整主機名。




MX: 

Mail Exchange Records(郵件交換記錄)




MX 記錄告訴其他站點關於你所在域的郵件伺服器地址:example.com. IN MX 10 mail.




當然這個域以句號結束。數字 10 是郵件伺服器的重要性標誌,如果你擁有多個郵件伺服器,其中較小的數字不太重要。




CNAME: 

Canonical Name Records(權威名稱記錄)




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 記錄



您可以將任何信息存儲到 TXT 記錄中,例如你的聯繫方式或者你希望人們在查詢 DNS 伺服器時可獲得的任意其他信息。




你可以這樣保存 TXT 記錄:example.com. IN TXT 」 YOUR INFO GOES HERE」.




此外,RP 記錄被創建為對 host 聯繫信息的顯式容器:example.com.

 

IN RP mail.example.com. example.com。



DNS TTL 值



在 / 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 命令查看主機是否正確解析。




host 命令允許你將主機名解析為 IP 地址:$ host example.com。




此外,你可以執行反向查找:$ host 192.168.1.5。




你可以 this 在此篇文章

 https://likegeeks.com/linux-network-commands/

 中查看更多關於 host 和 dig 命令的信息。



Whois 命令




whois 命令用於確定域名的所有權及其擁有者的 e-mail 地址和聯繫電話:$ whois example.com.



Rndc 命令



rndc 工具可用於安全地管理名稱伺服器,因為與伺服器的所有通信均通過數字簽名進行身份驗證。




此工具用於控制名稱伺服器和調試問題。 你可以通過以下方式檢查 Linux DNS 伺服器的狀態:$ rndc status。




此外,如果你更改任何域 (zone) 文件,您可以重新載入服務,而無須重啟命名服務:$ rndc reload example.com。




在這裡,我們重新載入 example.com 域文件。 你可以重新載入所有域:$ rndc reload。




或者你可以添加新的域或更改服務的配置。 你可以重新載入配置,如下所示:$ rndc reconfig。


Linux DNS 解析器



我們已經知道 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 伺服器非常簡單。 我希望你發現這篇文章很有用,並且很容易理解。





●編號505,輸入編號直達本文



●輸入m獲取文章

目錄

推薦↓↓↓

 



運維


更多推薦

18個技術類微信公眾號


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux學習 的精彩文章:

關於 Linux 進程的睡眠和喚醒 ,來看這篇就夠了~
Nginx 使用札記

TAG:Linux學習 |