dig 是一個強大而靈活的工具,用於查詢域名系統(DNS)服務器。在這篇文章中,咱們將深刻了解它的工做原理以及它能告訴你什麼。緩存
dig 是一款強大而靈活的查詢 DNS 名稱服務器的工具。它執行 DNS 查詢,並顯示參與該過程的名稱服務器返回的應答以及與搜索相關的細節。系統管理員和 DNS 管理員常常使用 dig 來幫助排除 DNS 問題。在這篇文章中,咱們將深刻了解它的工做原理,看看它能告訴咱們什麼。服務器
開始以前,對 DNS(域名系統)的工做方式有一個基本的印象是頗有幫助的。它是全球互聯網的關鍵部分,由於它提供了一種查找世界各地的服務器的方式,從而能夠與之鏈接。你能夠把它看做是互聯網的地址簿,任何正確鏈接到互聯網的系統,都應該可以使用它來查詢任何正確註冊的服務器的 IP 地址。ide
Linux 系統上通常都默認安裝了 dig 工具。下面是一個帶有一點註釋的 dig 命令的例子:工具
$ dig www.networkworld.com ; <<>> DiG 9.16.1-Ubuntu <<>> www.networkworld.com <== 你使用的 dig 版本 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6034 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: <== 你的查詢細節 ;www.networkworld.com. IN A ;; ANSWER SECTION: <== 結果 www.networkworld.com. 3568 IN CNAME idg.map.fastly.net. idg.map.fastly.net. 30 IN A 151.101.250.165 ;; Query time: 36 msec <== 查詢用時 ;; SERVER: 127.0.0.53#53(127.0.0.53) <== 本地緩存解析器 ;; WHEN: Fri Jul 24 19:11:42 EDT 2020 <== 查詢的時間 ;; MSG SIZE rcvd: 97 <== 返回的字節數
若是你獲得了一個這樣的應答,是好消息嗎?簡短的回答是「是」。你獲得了及時的回覆。狀態字段(status: NOERROR)顯示沒有問題。你正在鏈接到一個可以提供所要求的信息的名稱服務器,並獲得一個回覆,告訴你一些關於你所查詢的系統的重要細節。簡而言之,你已經驗證了你的系統和域名系統相處得很好。google
其餘可能的狀態指標包括:操作系統
$ dig cannotbe.org ; <<>> DiG 9.16.1-Ubuntu <<>> cannotbe.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 35348 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
通常來講,dig 比 ping 會提供更多的細節,若是域名不存在,ping 會回覆 「名稱或服務未知」。當你查詢一個合法的系統時,你能夠看到域名系統對該系統知道些什麼,這些記錄是如何配置的,以及檢索這些數據須要多長時間。.net
(LCTT 譯註:dig 也比 nslookup 提供的數據更多。此外,dig 採用的是操做系統的解析庫,而 nslookup 採用的是本身提供的解析庫,這有時候會帶來不一樣的行爲。最後,有趣的一點是,dig 的返回的格式是符合 BIND 區域文件格式的。)code
事實上,有時 dig 能夠在 ping 徹底不能響應的時候進行響應,當你試圖肯定一個鏈接問題時,這種信息是很是有用的。server
DNS 記錄類型和標誌
在上面的第一個查詢中,咱們能夠看到一個問題,那就是同時存在 CNAME 和 A 記錄。CNAME(規範名稱canonical name)就像一個別名,把一個域名指向另外一個域名。你查詢的大多數系統不會有 CNAME 記錄,而只有 A 記錄。若是你運行 dig localhost 命令,你會看到一個 A 記錄,它就指向 127.0.0.1 —— 這是每一個系統都使用的「迴環」地址。A 記錄用於將一個名字映射到一個 IP 地址。blog
DNS 記錄類型包括:
TXT 一些相關文本
咱們還能夠在上述輸出的第五行看到一系列的「標誌」。這些定義在 RFC 1035 中 —— 它定義了 DNS 報文頭中包含的標誌,甚至顯示了報文頭的格式。
1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
在上面的初始查詢中,第五行顯示的標誌是:
RFC 中描述的其餘標誌包括:
若是你添加 +trace 選項,你將從 dig 獲得更多的輸出。它會添加更多信息,顯示你的 DNS 查詢如何經過名稱服務器的層次結構找到你要找的答案。
下面顯示的全部 NS 記錄都反映了名稱服務器 —— 這只是你將看到的數據的第一部分,由於查詢經過名稱服務器的層次結構來追蹤你要找的東西:
$ dig +trace networkworld.com ; <<>> DiG 9.16.1-Ubuntu <<>> +trace networkworld.com ;; global options: +cmd . 84895 IN NS k.root-servers.net. . 84895 IN NS e.root-servers.net. . 84895 IN NS m.root-servers.net. . 84895 IN NS h.root-servers.net. . 84895 IN NS c.root-servers.net. . 84895 IN NS f.root-servers.net. . 84895 IN NS a.root-servers.net. . 84895 IN NS g.root-servers.net. . 84895 IN NS l.root-servers.net. . 84895 IN NS d.root-servers.net. . 84895 IN NS b.root-servers.net. . 84895 IN NS i.root-servers.net. . 84895 IN NS j.root-servers.net. ;; Received 262 bytes from 127.0.0.53#53(127.0.0.53) in 28 ms ...
最終,你會獲得與你的要求直接掛鉤的信息:
networkworld.com. 300 IN A 151.101.2.165 networkworld.com. 300 IN A 151.101.66.165 networkworld.com. 300 IN A 151.101.130.165 networkworld.com. 300 IN A 151.101.194.165 networkworld.com. 14400 IN NS ns-d.pnap.net. networkworld.com. 14400 IN NS ns-a.pnap.net. networkworld.com. 14400 IN NS ns0.pcworld.com. networkworld.com. 14400 IN NS ns1.pcworld.com. networkworld.com. 14400 IN NS ns-b.pnap.net. networkworld.com. 14400 IN NS ns-c.pnap.net. ;; Received 269 bytes from 70.42.185.30#53(ns0.pcworld.com) in 116 ms
你可使用 @ 符號來指定一個特定的名稱服務器來處理你的查詢。在這裏,咱們要求 Google 的主名稱服務器響應咱們的查詢:
$ dig @8.8.8.8 networkworld.com ; <<>> DiG 9.16.1-Ubuntu <<>> @8.8.8.8 networkworld.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43640 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;networkworld.com. IN A ;; ANSWER SECTION: networkworld.com. 299 IN A 151.101.66.165 networkworld.com. 299 IN A 151.101.194.165 networkworld.com. 299 IN A 151.101.130.165 networkworld.com. 299 IN A 151.101.2.165 ;; Query time: 48 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sat Jul 25 11:21:19 EDT 2020 ;; MSG SIZE rcvd: 109
下面所示的命令對 8.8.8.8 IP 地址進行反向查找,以顯示它屬於 Google 的 DNS 服務器。
$ nslookup 8.8.8.8 8.8.8.8.in-addr.arpa name = dns.google.
dig 命令是掌握 DNS 工做原理和在出現鏈接問題時排除故障的重要工具。
【編輯推薦】
【責任編輯:龐桂玉 TEL:(010)68476606】