滲透&&探測 (之DNS協議)
DNS是網際網路 核心協議之一 。不管是 上網瀏覽 ,還是 程式設計開發 ,都需要了解一點它的知識。
DNS是什麼
DNS( Domain Name System
的縮寫)的作用非常簡單,就是根據 域名 查出 IP
地址。你可以把它想象成一本 巨大的電話本 。
舉例來說,如果你要訪問域名 www.baidu.com
,首先要通過 DNS
查出它的 IP
地址是 220.181.57.216
和 123.125.115.110
。
查詢過程
雖然只需要返回一個 IP
地址,但是 DNS
的查詢過程非常複雜,分成 多個步驟 。
工具軟體 dig
可以顯示 整個查詢過程 。
$ dig www.baidu.com 複製程式碼
上面的命令會輸出 六段 資訊。
-
第一段是查詢引數和統計
-
第二段是查詢內容
上面結果表示,查詢域名 www.baidu.com
的 A
記錄, A
是 address
的縮寫。
- 第三段是DNS伺服器的答覆
上面結果顯示, www.baidu.com
有 三個A記錄 ,即 三個IP地址 。 294 是 TTL
值( Time to live
的縮寫),表示 快取時間 ,即 600 秒之內 不用重新查詢 。
- 第四段顯示
www.baidu.com
的NS
記錄(Name Server
的縮寫),即 哪些伺服器 負責管理www.baidu.com
的DNS
記錄。
上面結果顯示 www.baidu.com
共有五條 NS
記錄,即 五個域名伺服器 ,向其中任一臺查詢就能知道 www.baidu.com
的 IP
地址是什麼。
-
第五段是上面四個域名伺服器的
IP
地址 -
第六段是
DNS
伺服器的一些傳輸資訊。
上面結果顯示,本機的 DNS
伺服器是 192.168.3.1
,查詢埠是 53
( DNS
伺服器的預設埠),以及迴應長度是 271
位元組。
如果不想看到這麼多內容,可以使用+short引數。
$ dig +short www.baidu.com www.a.shifen.com. 115.239.211.112 115.239.210.27 複製程式碼
上面命令只返回 www.baidu.com
對應的 2 個 IP
地址(即 A
記錄)和一個 CNAME
( Canonical Name
,後文有介紹)。
DNS伺服器
下面我們根據前面這個例子,一步步還原,本機到底怎麼得到域名 www.baidu.com
的 IP
地址。
首先,本機一定要知道 DNS
伺服器的 IP
地址,否則上不了網。通過 DNS
伺服器,才能知道某個域名的 IP
地址到底是什麼。

DNS伺服器的 IP
地址,有可能是 動態的 ,每次上網時由 閘道器分配 ,這叫做 DHCP
機制;也有可能是事先指定的 固定地址 。 MacOS
系統裡面, DNS
伺服器的 IP
地址儲存在 /etc/resolv.conf
檔案。
上例的DNS伺服器是 192.168.3.1
,這是一個內網地址。有一些 公網 的 DNS
伺服器,也可以使用,其中最有名的就是 Google
的 8.8.8.8
和 Level 3
的 4.2.2.2
。
本機只向自己的 DNS
伺服器查詢,dig命令有一個 @
引數,顯示向其他 DNS
伺服器查詢的結果。
$ dig @8.8.8.8 www.baidu.com 複製程式碼
上面命令指定向 DNS
伺服器 8.8.8.8
查詢。
域名的層級
DNS伺服器怎麼會知道每個域名的 IP
地址呢?答案是 分級查詢。
請仔細看前面的例子,每個域名的尾部都多了一個點。

比如,域名 www.baidu.com
顯示為 www.baidu.com.
。這不是 疏忽 ,而是 所有域名的尾部 ,實際上都有一個 根域名 。
舉例來說, www.example.com
真正的域名是 www.example.com.root
,簡寫為 www.example.com.
。
因為,根域名 .root
對於 所有域名 都是一樣的,所以平時是 省略的 。
根域名的 下一級 ,叫做 頂級域名 ( top-level domain
,縮寫為 TLD
),比如 .com
、 .net
;
再下一級叫做 次級域名 ( second-level domain
,縮寫為 SLD
),比如 www.example.com
裡面的 .example
,這一級域名是使用者可以 註冊的 ;
再下一級是主機名( host
),比如 www.example.com
裡面的 www
,又稱為 三級域名 ,這是使用者在自己的域裡面為伺服器分配的名稱,是使用者可以 任意分配的 。
總結一下,域名的層級結構如下。
主機名.次級域名.頂級域名.根域名 # 即 host.sld.tld.root 複製程式碼
DNS的記錄型別
域名與 IP
之間的對應關係,稱為 記錄 ( record
)。根據使用場景, 記錄 可以分成不同的 型別 ( type
),前面已經看到了有 A記錄 。
常見的 DNS
記錄型別如下:
-
A:地址記錄(
Address
),返回域名指向的IP
地址 -
NS:域名伺服器記錄(
Name Server
),返回儲存 下一級域名資訊的伺服器地址 。該記錄只能設定為 域名 ,不能設定為IP
地址。 -
MX:郵件記錄(
Mail eXchange
),返回接收電子郵件的伺服器地址。 -
CNAME:規範名稱記錄(
Canonical Name
),返回另一個域名,即當前查詢的域名是另一個域名的跳轉,詳見下文。 -
PTR:逆向查詢記錄(
Pointer Record
),只用於從IP
地址查詢域名
一般來說,為了服務的安全可靠,至少應該有 兩條NS記錄 ,而 A
記錄和 MX
記錄也可以有多條,這樣就提供了服務的 冗餘性 , 防止出現單點失敗 。
CNAME記錄主要用於域名的內部跳轉,為伺服器配置提供靈活性,使用者感知不到。舉例來說, www.baidu.com
這個域名就是一個CNAME記錄。
$ dig www.baidu.com ... ;; ANSWER SECTION: www.baidu.com.1091INCNAMEwww.a.shifen.com. www.a.shifen.com.200INA115.239.211.112 www.a.shifen.com.200INA115.239.210.27 複製程式碼
上面結果顯示, www.baidu.com
的 CNAME
記錄指向 www.a.shifen.com
。也就是說,使用者查詢 www.baidu.com
的時候,實際上返回的是 www.a.shifen.com
的 IP
地址。
這樣的 好處 是,變更伺服器 IP
地址的時候,只要修改 www.a.shifen.com
這個域名就可以了,使用者的 www.baidu.com
域名不用修改。
由於 CNAME
記錄就是一個替換,所以 域名 一旦設定 CNAME
記錄以後,就不能再設定其他記錄了(比如 A
記錄和 MX
記錄),這是為了 防止產生衝突 。舉例來說, foo.com
指向 bar.com
,而兩個域名各有自己的 MX
記錄,如果兩者不一致,就會 產生問題 。由於頂級域名通常要設定 MX
記錄,所以一般 不允許使用者對頂級域名 設定 CNAME
記錄。
PTR記錄用於從 IP
地址反查域名。 dig
命令的 -x
引數用於查詢 PTR
記錄。
$ dig -x 192.30.252.153 ... ;; ANSWER SECTION: 153.252.30.192.in-addr.arpa. 3600 IN PTR pages.github.com. 複製程式碼
上面結果顯示, 192.30.252.153
這臺伺服器的域名是 pages.github.com
。
逆向查詢的一個應用,是可以 防止垃圾郵件 ,即 驗證傳送郵件 的 IP
地址,是否真的有它所聲稱的域名。
dig命令可以檢視指定的 記錄型別 。
$ dig a github.com $ dig ns github.com $ dig mx github.com 複製程式碼
其他DNS工具
除了 dig
,還有一些 其他小工具 也可以使用。
- host 命令
host命令可以看作 dig
命令的簡化版本,返回當前請求域名的各種記錄。
$ host baidu.com baidu.com has address 123.125.115.110 baidu.com has address 220.181.57.216 baidu.com mail is handled by 20 mx1.baidu.com. baidu.com mail is handled by 20 jpmx.baidu.com. baidu.com mail is handled by 20 mx50.baidu.com. baidu.com mail is handled by 10 mx.maillb.baidu.com. baidu.com mail is handled by 15 mx.n.shifen.com. 複製程式碼
host命令也可以用於 逆向查詢 ,即從 IP
地址查詢域名,等同於 dig -x <ip>
。
$ host 192.30.252.153 153.252.30.192.in-addr.arpa domain name pointer pages.github.com. 複製程式碼
- nslookup 命令
nslookup命令用於 互動式地查詢域名記錄 。
$ nslookup > www.baidu.com Server:192.168.3.1 Address:192.168.3.1#53 Non-authoritative answer: www.baidu.comcanonical name = www.a.shifen.com. Name:www.a.shifen.com Address: 115.239.211.112 Name:www.a.shifen.com Address: 115.239.210.27 複製程式碼
- whois 命令
whois命令用來檢視 域名的註冊情況 。
$ whois baidu.com 複製程式碼