學習 DNS 基礎知識及 Linux DNS 服務器操作

本文包括理解 DNS 所需的基礎知識及 Linux DNS 服務器的安裝、配置和維護具體操作相關知識。

一、DNS 域名結構與域名服務器

域名系統 DNS(Domain Name System) 是因特網使用的命名系統,用來把便於人們使用的機器名字轉換成爲 IP 地址。域名系統其實就是名字系統。爲什麼不叫 “名字” 而叫 “域名” 呢?這是因爲在這種因特網的命名系統中使用了許多的 “域(domain)”,因此就出現了“域名” 這個名詞。“域名系統” 明確地指明這種系統是應用在因特網中。

1、域名結構

在瞭解 DNS 服務器之前,需要先了解因特網上的域名空間結構,具體如下圖所示:

頂級域名是域名的最後一個部分,即是域名最後一點之後的字母,例如在 http://example.com 這個域名中,頂級域是. com(或. COM),大小寫視爲相同。

二級域名是域名的倒數第二個部分,例如在 http://example.com 這個域名中,二級域名是 example。以此類推。

2、域名服務器

因特網上的 DNS 服務器按照層次安排,根據不同層次的域名服務器所起的作用,可以把域名服務器分爲 4 種不同的類型。

【根域名服務器】

最高層次的域名服務器 (就好像國家總理一樣),也是最重要的域名服務器。全球有 13 個根域名服務器名稱,分別是 (它們是按照字母排列命名的):

當然,並不是一個名字對應一臺物理服務器的地址,一個根服務器的名字可以作爲入口對應一組服務器集羣來提供域名解析服務。

【頂級域名服務器】

就好像國家總理下面的各個省長,管轄省級單位。在 DNS 中,它們負責管理在該頂級域名服務器註冊的下一級域名 (二級域名)。所有頂級域名服務器的名稱和 IP 地址是在根服務器註冊的,也就是說,根域名服務器知道所有的頂級域名服務器的名稱和 IP 地址。

【 權威域名服務器】

負責一個區的域名服務器,就好像省長以下的那些市長、鎮長、鄉長等行政官。頂級域名服務器也可以算作是權威域名服務器,只不過由於其特殊性,我們專門把它劃分爲一類。因此權威域名服務器通常是指頂級域名以下的管理二級、三級、四級等域名的服務器。

上面三種服務器的關係可以用這張圖表示:

【本地域名服務器】

這類服務器不屬於上面的層次結構,當一個主機 (個人電腦) 發出 DNS 請求時,查詢請求就被髮送到本地域名服務器,本地域名服務器負責回答這個查詢,或者代替主機向域名空間中不同層次的權威域名服務器查詢,再把查詢的結果返回給主機。

下面的圖示表示了一個域名的解析過程以及各個類型的域名服務器所處的位置。

3、爲什麼要使用 DNS 服務器

域名服務器提供了從域名到 IP 地址的解析服務,因特網上的域名數量極大,不可能所有的域名信息都保存在一個域名服務器中,也不能上述每個節點都採用一個域名服務器。在實際的公網 DNS 系統中,域名服務器採用劃分區的方式來管理。

一個服務器所負責管轄的範圍叫做區 (zone),如果我們把域名空間結構中的根比作國家,頂級域名比作省級行政單位,二級域名看作是市級單位、三級、四級看作是鎮和鄉,那麼自然地,我們會想到管轄國家的是總理,管轄省級單位的是省長,下面還有市長、鎮長等等。

假設一個域 http://abc.com 的層次結構如圖分佈。

如果採用 (a) 的方式,那麼整個從 abc 這個節點以下的子樹成爲一個區,它們由一個 (通常是 1 組) 域名服務器管理,就好像 http://abc.com 是一個北京市,下面所有事務都有北京市長說了算;

如果採用 (b) 的方式,那麼 abc 節點以下的字數分成了兩個區:x 節點以下的部分的子樹和 y 節點以下的子樹,這兩棵子樹分別有 x 和 y 對應的域名服務器管理,就好像 http://abc.com 是一個福建省,x 是福州市,y 是廈門市,福建省的省長只管理福州市和廈門市的市長,但不會直接管理福州市和廈門市以下的單位。福州市和廈門市以下的單位分別給福州市市長和廈門市市長來管轄。

像這種把一個域中的一部分子樹分給另一個域名服務器管轄,叫做 “授權委託”,做了“授權委託” 以後的域名服務器很顯然管理的範圍就小了,它的子節點由被委任的下一級域名服務器管理了。

因特網上的域名結構呈樹狀分佈,因此 DNS 服務器也是對應的樹形結構,每一個 DNS 服務器能夠提供部分域名 (它管轄的域名) 到 IP 地址的解析。

4、DNS 查詢

查詢方式

遞歸查詢: 客戶機向自己的 DNS 服務器請求解析的方式

迭代查詢: 服務器向服務器查詢的方式

主機向本地域名服務器的查詢一般都是採用遞歸查詢。所謂遞歸查詢就是:如果主機所詢問的本地域名服務器不知道被查詢的域名的 IP 地址,那麼本地域名服務器就以 DNS 客戶的身份,向其它根域名服務器繼續發出查詢請求報文 (即替主機繼續查詢),而不是讓主機自己進行下一步查詢。因此,遞歸查詢返回的查詢結果或者是所要查詢的 IP 地址,或者是報錯,表示無法查詢到所需的 IP 地址。

本地域名服務器向根域名服務器的查詢的迭代查詢。迭代查詢的特點:當根域名服務器收到本地域名服務器發出的迭代查詢請求報文時,要麼給出所要查詢的 IP 地址,要麼告訴本地服務器:“你下一步應當向哪一個域名服務器進行查詢”。然後讓本地服務器進行後續的查詢。根域名服務器通常是把自己知道的頂級域名服務器的 IP 地址告訴本地域名服務器,讓本地域名服務器再向頂級域名服務器查詢。頂級域名服務器在收到本地域名服務器的查詢請求後,要麼給出所要查詢的 IP 地址,要麼告訴本地服務器下一步應當向哪一個權限域名服務器進行查詢。最後,知道了所要解析的 IP 地址或報錯,然後把這個結果返回給發起查詢的主機。

下圖給出了這兩種查詢的差別

圖片

DNS 解析的順序:(由 / etc/nsswitch.conf 決定)

  1.  本機緩存

  2. 本機 / etc/hosts 文件

     a) 格式:IP  FQDN  Alais

  1. 指定的 DNS 服務器緩存

     a) 清空緩存:rhdc flush

  1. 指定的 DNS 服務器(/etc/resolv.conf)

     a) 格式:

           #     search      example.com

           #     nameserver 202.103.24.68

           #     nameserver 202.103.149.50

DNS 查詢命令

1.  gethostip

     a) 是 syslinux 包的組成部分

     b) 通過 hosts 文件和 DNS 解析主機名到 IP

     c) 把 IP 計算成 8 位的 16 進制在 PXE 中有特殊用途

2.  host

     a) 僅通過 DNS 查詢

     b) 查詢主機名到 IP 的解析

3.  nslookup

     a)windows 的解析工具, linux 中通用,目前較少使用

     b) 提供簡單的正反和反向解析查詢

4.  dig

     a)linux 中功能強大的查詢工具,可以查詢更加詳細的信息,使用最廣泛

     b) 可以追蹤到非權威的 DNS

5、DNS 服務器的類型

一共有三種 DNS 服務器。

主 DNS 服務器

這些服務器上存放了特定域名的配置文件,並且基於此權威地規定了特定域名的地址。主 DNS 服務器知道全部在它管轄範圍的主機和子域名的地址。

輔助 DNS 服務器

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

緩存 DNS 服務器

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

二、Linux DNS 服務器安裝、配置和維護

1、搭建 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

2、配置 BIND

這個服務使用 /etc/named.conf 作爲配置文件。

BIND 在那個文件中使用像下面這樣的一些語句:

在 options 語句中可以看到 BIND 的工作目錄在 /var/named。

zone 語句可用於定義 DNS 區域,比如域名 google.com,它包含子域名 mail.google.com 和 analytics.google.com。

上述三個域名 (主域名和子域名) 都有一個由 zone 語句定義的區域。

3、定義一個主域服務器

我們知道 DNS 服務器類型有主域名服務器、輔助域名服務器和緩存域名服務器。不同於緩存域名服務器,主域名服務器和輔助域名服務器在應答過程中是處於同等地位的。

在 /etc/named.conf 的配置文件中,你可以使用如下語法定義一個主域服務器:

zone    "likegeeks.com" {

type master;

file likegeeks.com.db

};

包含主要區域信息的文件存放在 /var/named 目錄下,從 options 可知,這是一個工作目錄。

注意:軟件服務器或者託管面板會根據你的域名自動爲你創建主域服務器信息的文件名,因此如果你的域名是 example.org,那麼你主域服務器信息的文件就爲 /var/named/example.org.db。

類型爲 master,也就是說這是一個主域服務器。

4、定義一個輔助域服務器

同定義一個主域服務器一樣,輔助域服務器的定義稍微有些變化:

zone    "likegeeks.com" {

type slave;

masters IP Address list; ;

file likegeeks.com.db

};

對於輔助域服務器來說,它的域名和主域服務器是一樣的。上述語法裏的的 slave 類型表示這是一個輔助域服務器,“masters IP Address list” 表示輔助域服務器中區域文件內的信息都是通過主域服務器中區域文件內的信息複製過來的。

5、定義一個緩存服務器

即使你已經配置了主域或者輔助域服務器,你仍有必要(不是必須)定義一個緩存服務器,因爲這樣你可以減少 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 記錄類型是什麼以及它們是如何寫的?

6、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。

7、DNS TTL 值

在 / etc/named.conf 文件的頂部,這裏有一個 $TTL 條目。

該條目告訴 BIND 每個單獨記錄的 TTL 值(time to live,生存時間值)。

它是以秒爲單位的數值,比如 14,400 秒(4 個小時),因此 DNS 服務器最多緩存你的域文件 4 個小時,之後就會向你的 DNS 服務器重新查詢。

你可以降低這個值,但是默認值通常是合理的。除非你知道你正在做什麼。

8、捕獲配置錯誤

當您寫入域文件時,也許您忘記了一個句號或空格或其他任意錯誤。

你可以從日誌診斷 Linux DNS 服務器錯誤。BIND 服務通過 / var/log/messages 上的錯誤,可以使用 tail 命令來查看實時錯誤日誌,須使用 - f 選項:$ tail -f /var /log/messages。

因此,當你編寫域文件或修改 / etc/named.config 並重新啓動服務時,顯示錯誤之後,你可以從日誌中輕鬆識別錯誤類型。

9、Host 命令

在你成功添加或修改記錄後,可以使用 host 命令查看主機是否正確解析。

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

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

你可以 this 在此篇文章 https://likegeeks.com/linux-network-commands/ 中查看更多關於 host 和 dig 命令的信息。

10、Whois 命令

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

11、Rndc 命令

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

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

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

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

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

12、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 服務器。

本內容由社區會員上傳分享,僅供讀者交流學習,版權歸原作者所有,若所引用的圖片、數據、文字等來源標註有誤或涉及侵權或內容不完整,請及時聯繫處理。

http://www.talkwithtrend.com/Topic/199

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/yi7mu6223o6xudSFgPztmg