一張圖看懂 DNS 域名解析全過程

相信大家在平時工作中都離不開 DNS 解析,DNS 解析是互聯網訪問的第一步,無論是使用筆記本瀏覽器訪問網絡還是打開手機 APP 的時候,訪問網絡資源的第一步必然要經過 DNS 解析流程。

下面這張圖,詳細說明了一個 DNS 域名解析的全過程:

一、什麼是 DNS

DNS,全稱 Domain Name System,域名系統,是一個記錄域名和 Ip 地址相互映射的一個系統,能夠將用戶訪問互聯網時使用的域名地址轉換成對應的 IP 地址,而不用使用者去記住數量衆多的 IP 地址。通過域名得到域名對應的 IP 地址的過程被稱爲域名解析。DNS 運行於 UDP 協議之上,使用的端口爲 53。

1.1 域名結構解析

如上圖所示,域名結構是樹狀結構,樹的最頂端代表根服務器,根的下一層就是由我們所熟知的. com、.net、.cn 等通用域和. cn、.uk 等國家域組成,稱爲頂級域。網上註冊的域名基本都是二級域名,比如 http://baidu.com、http://taobao.com 等等二級域名,它們基本上是歸企業和運維人員管理。接下來是三級或者四級域名,這裏不多贅述。總體概括來說域名是由整體到局部的機制結構。

1.2DNS 解析流程

如上圖所示,我們將詳細闡述 DNS 解析流程:

1、首先客戶端位置是一臺電腦或手機,在打開瀏覽器以後,比如輸入 http://www.zdns.cn 的域名,它首先是由瀏覽器發起一個 DNS 解析請求,如果本地緩存服務器中找不到結果,則首先會向根服務器查詢,根服務器裏面記錄的都是各個頂級域所在的服務器的位置,當向根請求 http://www.zdns.cn 的時候,根服務器就會返回. cn 服務器的位置信息。

2、遞歸服務器拿到. cn 的權威服務器地址以後,就會尋問 cn 的權威服務器,知不知道 http://www.zdns.cn 的位置。這個時候 cn 權威服務器查找並返回 http://zdns.cn 服務器的地址。

3、繼續向 http://zdns.cn 的權威服務器去查詢這個地址,由 http://zdns.cn 的服務器給出了地址:202.173.11.10

4、最終才能進行 http 的鏈接,順利訪問網站。

5、這裏補充說明,一旦遞歸服務器拿到解析記錄以後,就會在本地進行緩存,如果下次客戶端再請求本地的遞歸域名服務器相同域名的時候,就不會再這樣一層一層查了,因爲本地服務器裏面已經有緩存了,這個時候就直接把 http://www.zdns.cn 的 A 記錄返回給客戶端就可以了。

(1)DNS 資源記錄

記錄一條域名信息映射關係,稱之爲資源記錄(RR)。

當我們查詢域名 http://www.zdns.cn 的時候,查詢結果得到的資源記錄結構體中有如下數據:

小知識:

下面我們列出幾條常用的資源記錄類型:

(2)DNS 服務器的分類

常見的 DNS 服務器就是兩種:權威解析服務器和遞歸解析服務器。遞歸解析服務器也可以叫做 localDNS。

(3)權威解析服務器

DNS 權威服務器保存着域名空間中部分區域的數據。如果 DNS 服務器負責管轄一個或多個區域時,稱此 DNS 服務器爲這些區域的權威服務器。

根權威 DNS 或者二級權威服務器中的資源記錄標記被指定爲區域權威服務器的 DNS 服務器。通過資源記錄中列出服務器,其他服務器就認爲它是該區域的權威服務器。這意味着在 NS 資源記錄中指定的任何服務器都被其他服務器當作權威的來源,並且能肯定應答區域內所含名稱的查詢。

(4)遞歸服務器

遞歸服務器在正常情況下,初始的時候裏面沒有任何域名解析數據,裏面所有的域名解析數據都來自於它到權威解析服務器的查詢結果,一旦查詢完畢,遞歸服務器就會根據 TTL 時間在本地形成一條緩存記錄,併爲用戶提供 DNS 解析的查詢服務,這是遞歸服務器的功能。

二、DNS 實現原理

2.1DNS 域名

DNS 在網絡中存在着數量衆多的域名,如. com、.org 等,而域名系統中是以層級樹狀結構劃分域名的,類似於下圖:

位於域名系統的頂端爲根域名,而後爲一級域名. net、.com、.org 等,再往下則爲二級域名,如. qq、.ibm 等。而位於域名系統最底層的爲主機名,如 www,finance 等。一個合法的域名格式,應遵循 FQDN(Full Qualified Domain Name)格式,以域名系統的級別從低到高,從左往右編寫,如:www.qq.net.、www.sina.org.。

2.2DNS 的查詢方式

DNS 的查詢方式有兩種,分別爲遞歸查詢(recursion)和迭代查詢(iteration)。

遞歸查詢:客戶端發起一個 DNS 解析請求,若本地 DNS 服務器若不能爲客戶端直接解析域名,則域名服務器會代替客戶端(下級服務器)向域名系統中的各分支的上下級服務器進行遞歸查詢,直到有服務器響應回答了該請求後,將該請求結果返回客戶端。在此期間,客戶端將一直處於等待狀態。
迭代查詢:客戶端(下級服務器)發起一個 DNS 解析請求後,若上級 DNS 服務器並不能直接提供該 DNS 的解析結果,則該上級 DNS 服務器會告知客戶端(下級服務器)另一個可能查詢到該 DNS 解析結果的 DNS 服務器 IP,客戶端(下級服務器)再次向這個 DNS 服務器發起解析請求,如此類推,直到查詢到對應的結果爲止。
通常遞歸查詢這種方式用於 PC 機與本地 DNS 服務器之間的查詢,而遞歸查詢則多用於 DNS 服務器之間的查詢,如下圖:

2.3DNS 服務器的類型

DNS 服務器的類型可以分爲:主名稱服務器、輔助名稱服務器和緩存名稱服務器。主名稱服務器至少負責解析一個域內的域名,維護所負責解析的域的數據庫,可對該域數據庫進行讀寫操作;輔助名稱服務器則負責從主名稱服務器或其他輔助名稱服務器中複製相關解析庫,爲主名稱服務器緩解解析壓力;而緩存名稱服務器則不負責域名解析,僅僅作爲緩存,加快解析速度。

2.4DNS 的正向解析與反向解析

在 DNS 服務器中邏輯上存在着兩個區域,一個是正向解析區域,另一個是反向解析區域。正向解析區域即我們通常所說的域名解析,而反向解析指的是 IP 反向解析,即通過查詢 IP 地址的 PTR 記錄來得到該 IP 地址所指向的域名記錄。而 PTR 記錄爲郵件交換記錄的一種,另一種爲 A 記錄。A 記錄解析域名到 IP 地址,而 PTR 記錄則負責解析 IP 地址到域名。

三、DNS 服務的配置文件

在開始部署搭建 DNS 主從服務器前,我們先來學習下與 DNS 配置相關的配置文件。在 Centos 系統中與 DNS 服務相關的配置文件包括:/etc/named.conf 主配置文件、/etc/named.rfc1912.zones 區域管理文件和 / var/named / 目錄下的區域數據庫文件。主配置文件 / etc/named.conf 和 / etc/named.rfc1912.zones 設置了 DNS 服務器能夠管理哪些區域並且指定了這些區域對應的區域數據文件的存放路徑和名稱。

3.1/etc/named.conf

主配置文件包含着三個段落,分別爲全局配置段、日誌配置段和區域配置段。如下示例:

options {
        listen-on port 53 { 127.0.0.1; }; #設置監控能與外部主機通信的IP地址
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";  #指定區域數據文件的存放目錄
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; };  #限制查詢的來源爲本地
        recursion yes;  #是否開啓遞歸查詢
        dnssec-enable yes;  #學習時建議關閉
        dnssec-validation yes;  #學習時建議關閉
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {  #根區域,包含着多個DNS頂級域信息
        type hint; 
        file "named.ca";
};
include "/etc/named.rfc1912.zones";  #把區域管理文件的內容包含進此文件
include "/etc/named.root.key";

在編輯完成主配置文件後,可使用命令 named-checkconf [/etc/named.conf] 對主配置文件進行語法檢查。

3.2/etc/named.rfc1912.zones

此文件爲區域管理文件,用以保存主機負責解析或轉發的區域,爲 / etc/named.conf 所調用。其常見內容如下:

zone "localhost.localdomain" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "0.in-addr.arpa" IN {
        type master;
        file "named.empty";
        allow-update { none; };
};
zone "magedu.com" IN {
        type master;
        file "magedu.zone";
        allow-update { none; };
};

其中 zone 名稱以 in-addr.apra 結尾的爲反向解析區域,其命名格式爲 IP 網段的反寫. in-addr.apra,剩下的 zone 則爲正向解析區域。其中區域內的可設置選項包括:

type:設置此區域的類型,包括 master(主名稱服務器)、slave(輔助名稱服務器)、forward(轉發域)、hint(根域名服務器);

ile FILENAME:指定區域數據文件的相對路徑,目錄路徑由主配置文件 / etc/named.conf 所指定;
allow-update:是否允許客戶主機或服務器自行更新 DNS 記錄,上述爲不允許更新 DNS 記錄;

3.3 區域數據文件

區域數據文件存放在 / var/named 目錄下,文件大體分爲正向解析區域文件和反向解析區域文件,通常該文件內容如下:

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
        PTR     localhost.

第一行爲設定 TTL 的值,定義區域數據文件裏面的各項記錄的宏;第二行爲 SOA 起始授權記錄,一個區域解析庫有且只能有一個 SOA 記錄,而且必須放在第一條;上述 @表示當前區域的名稱;往下第三到第七行定義了服務器同步信息的相關設置,其含義如下:

serial:表示配置版本的序列號,通常情況下,序列號sn遵循“年+月+日+編號”的格式,在修改了區域文件後需要手動修改序列號;
refresh:設置DNS服務器進行同步的間隔時間,只針對本區域文件總定義的NS記錄的所有主機;
retry:表示同步更新失敗之後,進行重試的間隔時間;
expire:表示同步更新失敗之後,多長時間清楚對應的記錄,又稱過期時間;
minimum:指高速緩存否定回答的存活時間;

往下就是針對域名解析的設置,按照類型可劃分爲以下幾類:

NS 記錄:表示當前區域中的某個 DNS 服務器的名字,一個區域可有多個 NS 記錄,如:

magedu.com. 86400 IN NS ns1.magedue.com.
magedu.com. 86400 IN NS ns2.magedue.com.

MX 記錄:表示當前區域的某個郵件交換器的主機名;MX 記錄可以有多個,但每個 MX 記錄之間應有一個數字表示其優先級,如:

magedu.com. IN  MX  10  mx1.magedu.com.
magedu.com. IN  MX  20  mx1.magedu.com.

A 記錄:表示主機名對應的 IP 地址,一個主機名可對應多個 IP 地址,如:

www.magedu.com IN   A   1.1.1.1
www.magedu.com IN   A   1.1.1.2
bbs.magedu.com IN   A   1.1.1.1

AAAA 記錄:ipv6 的 A 記錄;(暫不常用)

PTR 記錄:反向地址解析記錄,用於將 IP 地址反解析成域名,常見於反向解析區域文件中,如:

80      IN      PTR     www.magedu.com.
70      IN      PTR     www.magedu..com.

CNAME 記錄:域名的別名記錄,用於記錄某個主機域名的別名,如:

web.magedu.com IN CNAME www.magedu.com.

在編輯完成相應的區域數據文件後,可使用named-checkzone DOMAIN ZONE_FILE命令檢查相應的區域數據文件。

四、使用實例

4.1 創建正向解析區域文件

首先編輯主配置文件 / etc/named.conf 中的全局配置,設置監聽服務器 IP 地址及允許 DNS 查詢請求等設置:

[root@localhost named]# vim /etc/named.conf
listen-on port 53 { any; };
allow-query     { any; };
recursion no;
dnssec-enable no;
dnssec-validation no;

然後編輯 / etc/named.rfc1912.zones 文件,設置正向區域:

[root@localhost named]# vim /etc/named.rfc1912.zones
zone "magedu.com" IN {
        type master;
        file "magedu.com.zone";
        allow-update { none; };
};

隨後在 / var/named / 目錄下創建區域數據文件 magedu.com.zone:

[root@localhost named]# vim /var/named/magedu.com.zone
$TTL 3600
@       IN      SOA     ns.magedu.com.  10XXXXXX83.qq.com. (
        20180421
        1D
        1H
        1W
        3H
)
@       IN      NS      ns.magedu.com.
magedu.com.     IN      MX      10      mx1.magedu.com.
magedu.com.     IN      MX      20      mx2.magedu.com.
mx1     IN      A       192.168.0.1
mx2     IN      A       192.168.0.2
ns      IN      A       192.168.0.188
qq      IN      A       114.114.114.114
www     IN      A       199.247.21.135
web     IN      CNAME   www

最後檢查相關配置文件是否有錯誤:

[root@localhost named]# named-checkconf /etc/named.conf 
[root@localhost named]# named-checkzone magedu.com /var/named/magedu.com.zone 
zone magedu.com/IN: loaded serial 20180421
OK

如沒有報錯,重啓加載啓動 named 服務:

[root@localhost named]# systemctl restart named

在其他主機上驗證解析結果:

[root@localhost ~]# nslookup
> server 192.168.0.188
Default server: 192.168.0.188
Address: 192.168.0.188#53
> set q=A     
> www.magedu.com
Server:     192.168.0.188
Address:    192.168.0.188#53

Name:   www.magedu.com
Address: 199.247.21.135
> mx1.magedu.com
Server:     192.168.0.188
Address:    192.168.0.188#53

Name:   mx1.magedu.com
Address: 192.168.0.1
> web.magedu.com
Server:     192.168.0.188
Address:    192.168.0.188#53

web.magedu.com  canonical name = www.magedu.com.
Name:   www.magedu.com
Address: 199.247.21.135
> qq.magedu.com
Server:     192.168.0.188
Address:    192.168.0.188#53

Name:   qq.magedu.com
Address: 114.114.114.114
> www.magedu.com
Server:     192.168.0.188
Address:    192.168.0.188#53

Name:   www.magedu.com
Address: 199.247.21.135

解析成功。

4.2 創建反向解析區域文件

在上述案例 1 的基礎上,首先在 / etc/named.rfc1912.zones 中編輯添加反向區域:

zone "0.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.0.zone";
        allow-update { none; };
};

然後在 / var/named 目錄下生成反向區域文件 192.168.0.zone:

[root@localhost named]# vim /var/named/192.168.0.zone
$TTL 3600
@       IN      SOA     ns.magedu.com.  10XXXXXXX3.qq.com. (
        20180421
        1D
        1H
        1W
        3H
)
@       IN      NS      ns.magedu.com.
ns      IN      A       192.168.0.188
1       IN      PTR     mx1.magdu.com.
2       IN      PTR     mx2.magdu.com.
188     IN      PTR     ns.magedu.com.

隨後使用命令檢查相應的配置文件:

[root@localhost named]# named-checkconf /etc/named.conf 
[root@localhost named]# named-checkconf /etc/named.rfc1912.zones 
[root@localhost named]# named-checkzone 0.168.192.in-addr.arpa /var/named/192.168.0.zone 
zone 0.168.192.in-addr.arpa/IN: loaded serial 20180421
OK

如無報錯,則重新啓動 named 服務:

[root@localhost named]# systemctl restart named

在其他主機上測試結果:

[root@localhost ~]# nslookup 
> server 192.168.0.188
Default server: 192.168.0.188
Address: 192.168.0.188#53
> set q=NS   
> 192.168.0.1
Server:     192.168.0.188
Address:    192.168.0.188#53

1.0.168.192.in-addr.arpa    name = mx1.magdu.com.
> 192.168.0.188
Server:     192.168.0.188
Address:    192.168.0.188#53

188.0.168.192.in-addr.arpa  name = ns.magedu.com.
> 192.168.0.2
Server:     192.168.0.188
Address:    192.168.0.188#53

2.0.168.192.in-addr.arpa    name = mx2.magdu.com.
>

反向解析成功。

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