小菜學(xué)網(wǎng)絡(luò)之DNS記錄類型
本文轉(zhuǎn)載自微信公眾號「小菜學(xué)編程」,作者fasionchan。轉(zhuǎn)載本文請聯(lián)系小菜學(xué)編程公眾號。
經(jīng)過前面學(xué)習(xí),我們初步掌握了域名系統(tǒng)的基本原理。
我們知道,域名可以和指定的 IP 進行關(guān)聯(lián),進而充當(dāng) IP 的別名。我們通過域名來訪問網(wǎng)絡(luò)服務(wù)時,域名系統(tǒng)會幫我們將域名解析成對應(yīng)的 IP 地址。
那么,域名是否只能關(guān)聯(lián) IP 地址呢?其實并不是。除了 IP 地址,域名還可以關(guān)聯(lián)其他類型的信息。
實際上,域名和與之關(guān)聯(lián)的信息,就構(gòu)成了一條 DNS記錄 ( DNS record )。DNS記錄可以理解成一個鍵值對:
- 鍵:域名;
- 值:與域名關(guān)聯(lián)的值;
除了 IP 地址,DNS記錄值還可以是 IPv6 地址、別名、文本等等。據(jù)此,DNS記錄可分為若干不同類型,包括:
- A ,主機 IP 地址;
- AAAA ,主機 IPv6 地址;
- ALIAS ,自動解析的別名( alias );
- CNAME ,別名的權(quán)威名稱( canonical name );
- MX ,郵件交換服務(wù)器( Mail eXchange );
- NS ,域名服務(wù)器( name server );
- TXT ,描述文本;
記錄類型也就是 DNS 報文中,問題記錄和資源記錄的類型( Type )。
A記錄
A 記錄,表示主機的 IP 地址,這是最常見的 DNS 記錄類型。
- root@netbox [ ~ ] ➜ dig test.fasionchan.com
- ; <<>> DiG 9.16.1-Ubuntu <<>> test.fasionchan.com
- ;; global options: +cmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49579
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;test.fasionchan.com. IN A
- ;; ANSWER SECTION:
- test.fasionchan.com. 752 IN A 10.0.0.1
- ;; Query time: 71 msec
- ;; SERVER: 192.168.65.1#53(192.168.65.1)
- ;; WHEN: Mon Apr 26 17:22:16 CST 2021
- ;; MSG SIZE rcvd: 53
AAAA記錄
AAAA 記錄,表示主機的 IPv6 地址,與 A 記錄類似。IP 地址長度為 4 字節(jié),IPv6 地址長度為 16 字節(jié),這也是 AAAA 記錄的由來。隨著 IPv6 的部署,AAAA 記錄也正變得常用了。
dig 命令默認查詢 A 記錄,如果想查詢 AAAA 記錄,必須通過命令行參數(shù)指定:
- root@netbox [ ~ ] ➜ dig t-aaaa.fasionchan.com AAAA
- ; <<>> DiG 9.16.1-Ubuntu <<>> t-aaaa.fasionchan.com AAAA
- ;; global options: +cmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5088
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
- ;; QUESTION SECTION:
- ;t-aaaa.fasionchan.com. IN AAAA
- ;; ANSWER SECTION:
- t-aaaa.fasionchan.com. 752 IN AAAA ::1
- ;; Query time: 50 msec
- ;; SERVER: 192.168.65.1#53(192.168.65.1)
- ;; WHEN: Mon Apr 26 17:37:10 CST 2021
- ;; MSG SIZE rcvd: 67
CNAME記錄
CNAME 記錄,表示別名的 權(quán)威名稱 ( canonical name )。
域名可以取別名,以 webserver.fasionchan.com 為例,它可以取一個別名,比如:network.fasionchan.com 。如此一來,我們稱前者是后者的 權(quán)威名稱 ,CNAME 記錄則保存權(quán)威名稱。
當(dāng)查詢別名 network.fasionchan.com 時,如果 DNS 服務(wù)器返回的是 CNAME 記錄,我們還需要進一步查詢權(quán)威名稱,才能得到最終結(jié)果。當(dāng)然了,大部分 DNS 緩存服務(wù)器會自動幫我們做這件事情。
那么,域名為什么需要別名呢?CNAME 記錄又有什么典型的應(yīng)用場景呢?
假設(shè)我有一臺 Web 服務(wù)器,它上面部署了多個站點:
- 我的網(wǎng)絡(luò)專欄:network.fasionchan.com ;
- 我的 Linux 專欄:linux.fasionchan.com ;
- 我的 Python 專欄:python.fasionchan.com ;
我可以申請一個域名 webserver.fasionchan.com ,通過 A 記錄指向 Web 服務(wù)器;然后為幾個專欄域名配置 CNAME 記錄,指向 webserver.fasionchan.com :
這樣做有一個好處:如果我調(diào)整了 Web 服務(wù)器,將它遷移到另一臺主機上,我只需修改 webserver.fasionchan.com 一個域名,其他專欄域名均無須調(diào)整。
我的個人網(wǎng)站 fasionchan.com 部署在阿里云 CDN 上,域名也是通過 CNAME 記錄指向一個阿里云域名。不然的話,只要阿里云 CDN 一調(diào)整,我就得修改域名!這肯定會是一場噩夢!
MX記錄
MX 記錄,表示 郵件交換 ( mail exchange )服務(wù),即郵件服務(wù)器。其中,MX 是 Mail eXchange 的縮寫。
電子郵件可以是說是互聯(lián)網(wǎng)中發(fā)展最早,應(yīng)用最為廣泛的應(yīng)用。我們發(fā)送郵件時,客戶端需要根據(jù)自己的郵箱賬號找到郵件服務(wù)器的地址,并通過 SMTP 協(xié)議和它進行通信。
每個郵件廠商都有一個自己的域名,查詢該域名的 MX 記錄,即可找到郵件服務(wù)器的地址。以 QQ郵箱 為例,它的域名是 qq.com 。我們執(zhí)行 dig 命令查詢 qq.com 的 MX 記錄:
- root@netbox [ ~ ] ➜ dig qq.com MX
- ; <<>> DiG 9.16.1-Ubuntu <<>> qq.com MX
- ;; global options: +cmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49462
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4
- ;; OPT PSEUDOSECTION:
- ; EDNS: version: 0, flags:; udp: 4000
- ;; QUESTION SECTION:
- ;qq.com. IN MX
- ;; ANSWER SECTION:
- qq.com. 1435 IN MX 20 mx2.qq.com.
- qq.com. 1435 IN MX 10 mx3.qq.com.
- qq.com. 1435 IN MX 30 mx1.qq.com.
- ;; ADDITIONAL SECTION:
- mx3.qq.com. 463 IN A 113.96.208.206
- mx3.qq.com. 3 IN AAAA 240e:ff:f101:10::127
- mx1.qq.com. 2409 IN A 14.215.140.20
- ;; Query time: 18 msec
- ;; SERVER: 10.2.66.66#53(10.2.66.66)
- ;; WHEN: Wed Apr 28 18:40:03 CST 2021
- ;; MSG SIZE rcvd: 155
由此可見,QQ郵箱總共有 3 個郵件交換服務(wù),分別是:
- mx1.qq.com.
- mx2.qq.com.
- mx3.qq.com.
我們可以從中挑選一臺,比如 mx3.qq.com. ,它的 IP 地址是 14.215.140.20 。通過 SMTP 協(xié)議連接上去,認證完畢后,即可正常收發(fā)郵件了。
讀到此處,您可能會有疑問了:根據(jù)域名找到郵件服務(wù)器,A 記錄不也能夠勝任嗎?
確實如此,A 記錄理論上也是可以勝任的。只不過在互聯(lián)網(wǎng)發(fā)展早期,電子郵件是一個重量級應(yīng)用。網(wǎng)絡(luò)先驅(qū)們?yōu)樗氐卦O(shè)計了 MX 記錄,也就不奇怪了。
實際上,騰訊不止 QQ 郵箱一個產(chǎn)品,還有騰訊網(wǎng)。由于郵件服務(wù)有自己的 MX 記錄,騰訊網(wǎng)可以使用 A 記錄。這樣一來,兩者可以使用相同的域名qq.com:
瀏覽器訪問騰訊網(wǎng)時,可以查詢 qq.com 的 A 記錄,得到服務(wù)器地址。我們可以執(zhí)行 dig 命令模擬一下:
- root@netbox [ ~ ] ➜ dig qq.com A
- ; <<>> DiG 9.16.1-Ubuntu <<>> qq.com A
- ;; global options: +cmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46166
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
- ;; OPT PSEUDOSECTION:
- ; EDNS: version: 0, flags:; udp: 4000
- ;; QUESTION SECTION:
- ;qq.com. IN A
- ;; ANSWER SECTION:
- qq.com. 193 IN A 203.205.254.157
- qq.com. 193 IN A 61.129.7.47
- qq.com. 193 IN A 183.3.226.35
- qq.com. 193 IN A 123.151.137.18
- ;; Query time: 11 msec
- ;; SERVER: 10.2.66.66#53(10.2.66.66)
- ;; WHEN: Wed Apr 28 18:41:16 CST 2021
- ;; MSG SIZE rcvd: 99
NS記錄
NS 記錄,保存著負責(zé)該域解析的權(quán)威DNS服務(wù)器,記錄值為DNS服務(wù)器的域名。
以我的域名 fasionchan.com 為例,它在騰訊云 dnspod 上解析。我注冊域名后,需要配置 NS 記錄,指向 dnspod 服務(wù)器。這個 NS 記錄,最終會被同步到 .com 頂級域名服務(wù)器。
由此一來,當(dāng)客戶端發(fā)起迭代解析時,com 域名服務(wù)器就知道查詢該域名應(yīng)該去找 dnspod 。
如果我想將域名轉(zhuǎn)到阿里云上去解析,我只需找我的域名注冊商,修改 NS 記錄指向阿里云的 DNS 服務(wù)器。一切就緒后,我就可以在阿里云上管理我的域名了。
我還可以將子域 lumy.fasionchan.com 送給我的朋友 Lumy ,只要我在 dnspod 上為 lumy.fasionchan.com 添加 NS 記錄,指向 Lumy 選擇的 DNS 服務(wù)器即可。此后,Lumy 就可以在自己的 DNS 服務(wù)上管理該域。
當(dāng)有客戶端迭代查詢 lumy.fasionchan.com 這個子域時,dnspod 將根據(jù)該 NS 記錄,告訴客戶端應(yīng)該去找 Lumy 的 DNS 服務(wù)器查詢(假設(shè) Lumy 在阿里云上管理子域):
由此可見,NS 記錄在 DNS 迭代查詢中扮演著非常重要的角色。上級 DNS 服務(wù)器通過 NS 記錄,找到下級 DNS 服務(wù)器,直到域名查詢完畢。
理論上,根域也需要 NS 記錄,來指向全球的 13 臺根域名服務(wù)器。那根域的 NS 記錄維護在哪里呢?由于根服務(wù)器極少改動,所以可以通過配置的形式指定??蛻舳丝梢圆樵兏?NS 記錄,DNS 緩存服務(wù)器會根據(jù)自己的配置進行回答:
- root@netbox [ ~ ] ➜ dig . NS
- ; <<>> DiG 9.16.1-Ubuntu <<>> . NS
- ;; global options: +cmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10652
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 4
- ;; OPT PSEUDOSECTION:
- ; EDNS: version: 0, flags:; udp: 4000
- ;; QUESTION SECTION:
- ;. IN NS
- ;; ANSWER SECTION:
- . 1767 IN NS h.root-servers.net.
- . 1767 IN NS l.root-servers.net.
- . 1767 IN NS k.root-servers.net.
- . 1767 IN NS f.root-servers.net.
- . 1767 IN NS b.root-servers.net.
- . 1767 IN NS d.root-servers.net.
- . 1767 IN NS m.root-servers.net.
- . 1767 IN NS i.root-servers.net.
- . 1767 IN NS c.root-servers.net.
- . 1767 IN NS g.root-servers.net.
- . 1767 IN NS e.root-servers.net.
- . 1767 IN NS j.root-servers.net.
- . 1767 IN NS a.root-servers.net.
- ;; ADDITIONAL SECTION:
- h.root-servers.net. 2926 IN A 198.97.190.53
- c.root-servers.net. 37 IN A 192.33.4.12
- a.root-servers.net. 2217 IN A 198.41.0.4
- ;; Query time: 17 msec
- ;; SERVER: 10.2.66.66#53(10.2.66.66)
- ;; WHEN: Thu Apr 29 19:45:54 CST 2021
- ;; MSG SIZE rcvd: 300
TXT記錄
TXT 記錄用來保存一些文本信息,這些信息可以用作配置,但不太常見。我們舉個例子:
- root@netbox [ ~ ] ➜ dig t-txt.fasionchan.com TXT
- ; <<>> DiG 9.16.1-Ubuntu <<>> t-txt.fasionchan.com TXT
- ;; global options: +cmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23557
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
- ;; OPT PSEUDOSECTION:
- ; EDNS: version: 0, flags:; udp: 4000
- ;; QUESTION SECTION:
- ;t-txt.fasionchan.com. IN TXT
- ;; ANSWER SECTION:
- t-txt.fasionchan.com. 600 IN TXT "hello world"
- ;; Query time: 55 msec
- ;; SERVER: 10.2.66.66#53(10.2.66.66)
- ;; WHEN: Wed Apr 28 18:04:24 CST 2021
- ;; MSG SIZE rcvd: 73
很多云平臺使用 TXT 記錄來驗證域名所有權(quán):先讓域名所有人配置一條特殊的 TXT 記錄,然后查詢該記錄看結(jié)果是否匹配。