小菜學(xué)網(wǎng)絡(luò)之DNS記錄類型
本文轉(zhuǎn)載自微信公眾號(hào)「小菜學(xué)編程」,作者fasionchan。轉(zhuǎn)載本文請(qǐng)聯(lián)系小菜學(xué)編程公眾號(hào)。
經(jīng)過前面學(xué)習(xí),我們初步掌握了域名系統(tǒng)的基本原理。
我們知道,域名可以和指定的 IP 進(jìn)行關(guān)聯(lián),進(jìn)而充當(dāng) IP 的別名。我們通過域名來(lái)訪問網(wǎng)絡(luò)服務(wù)時(shí),域名系統(tǒng)會(huì)幫我們將域名解析成對(duì)應(yīng)的 IP 地址。
那么,域名是否只能關(guān)聯(lián) IP 地址呢?其實(shí)并不是。除了 IP 地址,域名還可以關(guān)聯(lián)其他類型的信息。
實(shí)際上,域名和與之關(guān)聯(lián)的信息,就構(gòu)成了一條 DNS記錄 ( DNS record )。DNS記錄可以理解成一個(gè)鍵值對(duì):
- 鍵:域名;
- 值:與域名關(guān)聯(lián)的值;
除了 IP 地址,DNS記錄值還可以是 IPv6 地址、別名、文本等等。據(jù)此,DNS記錄可分為若干不同類型,包括:
- A ,主機(jī) IP 地址;
- AAAA ,主機(jī) IPv6 地址;
- ALIAS ,自動(dòng)解析的別名( alias );
- CNAME ,別名的權(quán)威名稱( canonical name );
- MX ,郵件交換服務(wù)器( Mail eXchange );
- NS ,域名服務(wù)器( name server );
- TXT ,描述文本;
記錄類型也就是 DNS 報(bào)文中,問題記錄和資源記錄的類型( Type )。
A記錄
A 記錄,表示主機(jī)的 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 記錄,表示主機(jī)的 IPv6 地址,與 A 記錄類似。IP 地址長(zhǎng)度為 4 字節(jié),IPv6 地址長(zhǎng)度為 16 字節(jié),這也是 AAAA 記錄的由來(lái)。隨著 IPv6 的部署,AAAA 記錄也正變得常用了。
dig 命令默認(rèn)查詢 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 為例,它可以取一個(gè)別名,比如:network.fasionchan.com 。如此一來(lái),我們稱前者是后者的 權(quán)威名稱 ,CNAME 記錄則保存權(quán)威名稱。
當(dāng)查詢別名 network.fasionchan.com 時(shí),如果 DNS 服務(wù)器返回的是 CNAME 記錄,我們還需要進(jìn)一步查詢權(quán)威名稱,才能得到最終結(jié)果。當(dāng)然了,大部分 DNS 緩存服務(wù)器會(huì)自動(dòng)幫我們做這件事情。
那么,域名為什么需要?jiǎng)e名呢?CNAME 記錄又有什么典型的應(yīng)用場(chǎng)景呢?
假設(shè)我有一臺(tái) Web 服務(wù)器,它上面部署了多個(gè)站點(diǎn):
- 我的網(wǎng)絡(luò)專欄:network.fasionchan.com ;
- 我的 Linux 專欄:linux.fasionchan.com ;
- 我的 Python 專欄:python.fasionchan.com ;
我可以申請(qǐng)一個(gè)域名 webserver.fasionchan.com ,通過 A 記錄指向 Web 服務(wù)器;然后為幾個(gè)專欄域名配置 CNAME 記錄,指向 webserver.fasionchan.com :
這樣做有一個(gè)好處:如果我調(diào)整了 Web 服務(wù)器,將它遷移到另一臺(tái)主機(jī)上,我只需修改 webserver.fasionchan.com 一個(gè)域名,其他專欄域名均無(wú)須調(diào)整。
我的個(gè)人網(wǎng)站 fasionchan.com 部署在阿里云 CDN 上,域名也是通過 CNAME 記錄指向一個(gè)阿里云域名。不然的話,只要阿里云 CDN 一調(diào)整,我就得修改域名!這肯定會(huì)是一場(chǎng)噩夢(mèng)!
MX記錄
MX 記錄,表示 郵件交換 ( mail exchange )服務(wù),即郵件服務(wù)器。其中,MX 是 Mail eXchange 的縮寫。
電子郵件可以是說是互聯(lián)網(wǎng)中發(fā)展最早,應(yīng)用最為廣泛的應(yīng)用。我們發(fā)送郵件時(shí),客戶端需要根據(jù)自己的郵箱賬號(hào)找到郵件服務(wù)器的地址,并通過 SMTP 協(xié)議和它進(jìn)行通信。
每個(gè)郵件廠商都有一個(gè)自己的域名,查詢?cè)撚蛎?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 個(gè)郵件交換服務(wù),分別是:
- mx1.qq.com.
- mx2.qq.com.
- mx3.qq.com.
我們可以從中挑選一臺(tái),比如 mx3.qq.com. ,它的 IP 地址是 14.215.140.20 。通過 SMTP 協(xié)議連接上去,認(rèn)證完畢后,即可正常收發(fā)郵件了。
讀到此處,您可能會(huì)有疑問了:根據(jù)域名找到郵件服務(wù)器,A 記錄不也能夠勝任嗎?
確實(shí)如此,A 記錄理論上也是可以勝任的。只不過在互聯(lián)網(wǎng)發(fā)展早期,電子郵件是一個(gè)重量級(jí)應(yīng)用。網(wǎng)絡(luò)先驅(qū)們?yōu)樗氐卦O(shè)計(jì)了 MX 記錄,也就不奇怪了。
實(shí)際上,騰訊不止 QQ 郵箱一個(gè)產(chǎn)品,還有騰訊網(wǎng)。由于郵件服務(wù)有自己的 MX 記錄,騰訊網(wǎng)可以使用 A 記錄。這樣一來(lái),兩者可以使用相同的域名qq.com:
瀏覽器訪問騰訊網(wǎng)時(shí),可以查詢 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 記錄,保存著負(fù)責(zé)該域解析的權(quán)威DNS服務(wù)器,記錄值為DNS服務(wù)器的域名。
以我的域名 fasionchan.com 為例,它在騰訊云 dnspod 上解析。我注冊(cè)域名后,需要配置 NS 記錄,指向 dnspod 服務(wù)器。這個(gè) NS 記錄,最終會(huì)被同步到 .com 頂級(jí)域名服務(wù)器。
由此一來(lái),當(dāng)客戶端發(fā)起迭代解析時(shí),com 域名服務(wù)器就知道查詢?cè)撚蛎麘?yīng)該去找 dnspod 。
如果我想將域名轉(zhuǎn)到阿里云上去解析,我只需找我的域名注冊(cè)商,修改 NS 記錄指向阿里云的 DNS 服務(wù)器。一切就緒后,我就可以在阿里云上管理我的域名了。
我還可以將子域 lumy.fasionchan.com 送給我的朋友 Lumy ,只要我在 dnspod 上為 lumy.fasionchan.com 添加 NS 記錄,指向 Lumy 選擇的 DNS 服務(wù)器即可。此后,Lumy 就可以在自己的 DNS 服務(wù)上管理該域。
當(dāng)有客戶端迭代查詢 lumy.fasionchan.com 這個(gè)子域時(shí),dnspod 將根據(jù)該 NS 記錄,告訴客戶端應(yīng)該去找 Lumy 的 DNS 服務(wù)器查詢(假設(shè) Lumy 在阿里云上管理子域):
由此可見,NS 記錄在 DNS 迭代查詢中扮演著非常重要的角色。上級(jí) DNS 服務(wù)器通過 NS 記錄,找到下級(jí) DNS 服務(wù)器,直到域名查詢完畢。
理論上,根域也需要 NS 記錄,來(lái)指向全球的 13 臺(tái)根域名服務(wù)器。那根域的 NS 記錄維護(hù)在哪里呢?由于根服務(wù)器極少改動(dòng),所以可以通過配置的形式指定。客戶端可以查詢根域 NS 記錄,DNS 緩存服務(wù)器會(huì)根據(jù)自己的配置進(jìn)行回答:
- 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 記錄用來(lái)保存一些文本信息,這些信息可以用作配置,但不太常見。我們舉個(gè)例子:
- 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
很多云平臺(tái)使用 TXT 記錄來(lái)驗(yàn)證域名所有權(quán):先讓域名所有人配置一條特殊的 TXT 記錄,然后查詢?cè)撚涗浛唇Y(jié)果是否匹配。