硬核!《DNS 速成指南》一文搞懂 DNS ,網絡排查再也不難

1. DNS 是什麼?

DNS (Domain Name System 的縮寫)的做用很是簡單,就是根據域名查出IP地址。你能夠把它想象成一本巨大的電話本。shell

舉例來講,若是你要訪問域名math.stackexchange.com,首先要經過DNS查出它的IP地址是151.101.129.69緩存

2. 域名的層級

因爲後面我會講到 DNS 的解析過程,所以須要你對域名的層級有一些瞭解服務器

  • 根域名 :.root 或者 . ,一般是省略的
  • 頂級域名,如 .com.cn
  • 次級域名,如 baidu.com 裏的 baidu,這個用戶是能夠註冊購買的
  • 主機域名,好比 baike.baidu.com 裏的baike,這個用戶是可分配的
主機名.次級域名.頂級域名.根域名

baike.baidu.com.root

3. DNS 解析過程

我們以訪問 www.163.com 這個域名爲例,來看一看當你訪問 www.163.com 時,會發生哪些事:網絡

  1. 先查找本地 DNS 緩存(本身的電腦上),有則返回,沒有則進入下一步
  2. 查看本地 hosts 文件有沒有相應的映射記錄,有則返回,沒有則進入下一步
  3. 向本地 DNS 服務器(通常都是你的網絡接入服務器商提供,好比中國電信,中國移動)發送請求進行查詢,本地DNS服務器收到請求後,會先查下本身的緩存記錄,若是查到了直接返回就結束了,若是沒有查到,本地DNS服務器就會向DNS的根域名服務器發起查詢請求:請問老大, www.163.com 的ip是啥?
  4. 根域名服務器收到請求後,看到這是個 .com 的域名,就回信說:這個域名是由 .com 老弟管理的,你去問他好了,這是.com老弟的聯繫方式(ip1)。
  5. 本地 DNS 服務器接收到回信後,照着老大哥給的聯繫方式(ip1),立刻給 .com 這個頂級域名服務器發起請求:請問 .com 大大,www.163.com 的ip 是啥?
  6. .com 頂級域名服務器接收到請求後,看到這是 163.com 的域名,就回信說:這個域名是 .163.com 老弟管理的,你就去問他就好了,這是他的聯繫方式(ip2)
  7. 本地 DNS 服務器接收到回信後,按照前輩的指引(ip2),又向 .163.com 這個權威域名服務器發起請求:請問 163.com 大大,請問 www.163.com 的ip是啥?
  8. 163.com 權威域名服務器接收到請求後,確認了是本身管理的域名,立刻查了下本身的小本本,把 www.163.com 的ip告訴了 本地DNS服務器。
  9. 本地DNS服務器接收到回信後,很是地開心,這下總算拿到了www.163.com的ip了,立刻把這個消息告訴了要求查詢的客戶(就是你的電腦)。因爲這個過程比較漫長,本地DNS服務器爲了節省時間,也爲了儘可能不去打擾各位老大哥,就把這個查詢結果偷偷地記在了本身的小本本上,方便下次有人來查詢時,能夠快速回應。

總結起來就是三句話工具

  1. 從"根域名服務器"查到"頂級域名服務器"的NS記錄和A記錄(IP地址)
  2. 從"頂級域名服務器"查到"次級域名服務器"的NS記錄和A記錄(IP地址)
  3. 從"次級域名服務器"查出"主機名"的IP地址

4. DNS的緩存時間

上面的幾個步驟裏,能夠看到有兩個地方會緩存 DNS 的查詢記錄,有了緩存,在必定程度上會提升查詢效率,但同時在準確率上會有所損失。網站

所以咱們在配置 DNS 解析的時候,會有一個 TTL 參數(Time To Live),意思就是這個緩存能夠存活多長時間,過了這個時間,本地 DNS 就會刪除這條記錄,刪除了緩存後,你再訪問,就要從新走一遍上面的流程,獲取最新的地址。google

5. DNS 的記錄類型

當咱們在阿里雲買了一個域名後,能夠配置咱們主機域名解析規則,也就是 記錄阿里雲

阿里雲 域名雲解析

常見的 DNS 記錄類型以下.net

  • A:地址記錄(Address),返回域名指向的IP地址。命令行

  • NS:域名服務器記錄(Name Server),返回保存下一級域名信息的服務器地址。該記錄只能設置爲域名,不能設置爲IP地址。

  • MX:郵件記錄(Mail eXchange),返回接收電子郵件的服務器地址。

  • CNAME:規範名稱記錄(Canonical Name),返回另外一個域名,即當前查詢的域名是另外一個域名的跳轉,詳見下文。

  • PTR:逆向查詢記錄(Pointer Record),只用於從IP地址查詢域名,詳見下文。

6. DNS 報文結構

後面我將使用 wireshark 抓取 DNS 的數據包,可是在開始以前 ,得先了解一下 DNS 的報文結構

  • 事務 ID:DNS 報文的 ID 標識。對於請求報文和其對應的應答報文,該字段的值是相同的。經過它能夠區分 DNS 應答報文是對哪一個請求進行響應的。
  • 標誌:DNS 報文中的標誌字段。
  • 問題計數:DNS 查詢請求的數目。
  • 回答資源記錄數:DNS 響應的數目。
  • 權威名稱服務器計數:權威名稱服務器的數目。
  • 附加資源記錄數:額外的記錄數目(權威名稱服務器對應 IP 地址的數目)。

7. Wireshark抓包實戰

打開 Wireshark 後,使用 ping 163.com 來發起 DNS 解析請求,使用 DNS 關鍵字在Wireshark 過濾。

從抓取的報文總體來看,咱們能夠粗略獲取幾個信息

  1. DNS 是應用層協議,傳輸層協議使用的是 UDP
  2. DNS 默認端口是 53

請求和應答的報文的截圖我放在了下面,接下來我將逐個分析。

請求

應答

Transaction ID

請求和應答的事務ID應當是一個:0xd0d7

Flags

標誌字段裏的內容比較多,每一個字段的含義以下

  • QR(Response):查詢請求/響應的標誌信息。查詢請求時,值爲 0;響應時,值爲 1。
  • Opcode:操做碼。其中,0 表示標準查詢;1 表示反向查詢;2 表示服務器狀態請求。
  • AA(Authoritative):受權應答,該字段在響應報文中有效。值爲 1 時,表示名稱服務器是權威服務器;值爲 0 時,表示不是權威服務器。
  • TC(Truncated):表示是否被截斷。值爲 1 時,表示響應已超過 512 字節並已被截斷,只返回前 512 個字節。
  • RD(Recursion Desired):指望遞歸。該字段能在一個查詢中設置,並在響應中返回。該標誌告訴名稱服務器必須處理這個查詢,這種方式被稱爲一個遞歸查詢。若是該位爲 0,且被請求的名稱服務器沒有一個受權回答,它將返回一個能解答該查詢的其餘名稱服務器列表。這種方式被稱爲迭代查詢。
  • RA(Recursion Available):可用遞歸。該字段只出如今響應報文中。當值爲 1 時,表示服務器支持遞歸查詢。
  • Z:保留字段,在全部的請求和應答報文中,它的值必須爲 0。
  • rcode(Reply code):返回碼字段,表示響應的差錯狀態。當值爲 0 時,表示沒有錯誤;當值爲 1 時,表示報文格式錯誤(Format error),服務器不能理解請求的報文;當值爲 2 時,表示域名服務器失敗(Server failure),由於服務器的緣由致使沒辦法處理這個請求;當值爲 3 時,表示名字錯誤(Name Error),只有對受權域名解析服務器有意義,指出解析的域名不存在;當值爲 4 時,表示查詢類型不支持(Not Implemented),即域名服務器不支持查詢類型;當值爲 5 時,表示拒絕(Refused),通常是服務器因爲設置的策略拒絕給出應答,如服務器不但願對某些請求者給出應答。

Answer RRs

回答資源記錄數,在應答包裏爲 2,說明返回了兩條查詢結果,你能夠在 Answer 字段裏看到。

Authority RRs

權威名稱服務器計數

Additionnal RRs

附加資源記錄數

Answers

應答的主要內容,這裏返回兩條結果,每條結果裏的字段有

Name:          查詢的域名
Type:          A表示IPv4,AAAA 表示IPv6
Class:         表示Internet,幾乎老是它
Time to live:  生存時間
Data length:   數據長度
Address:       查詢到的 IP 地址

8. DNS 劫持 與 HTTP 劫持

經過上面的講解,咱們都知道了,DNS 完成了一次域名到 IP 的映射查詢,當你在訪問 www.baidu.com 時,能正確返回給你 百度首頁的 ip。

但若是此時 DNS 解析出現了一些問題,當你想要訪問 www.baidu.com 時,卻返回給你 www.google.com 的ip,這就是咱們常說的 DNS 劫持。

與之容易混淆的有 HTTP 劫持。

那什麼是 HTTP 劫持呢?

你必定見過當你在訪問 某個網站時,右下角也忽然彈出了一個扎眼的廣告彈窗。這就是 HTTP 劫持。

藉助別人文章裏的例子,它們倆的區別就比如是

  • DNS劫持是你想去機場的時候,把你給丟到火車站。

  • HTTP劫持是你去機場途中,有人給你塞小廣告。

那麼 DNS劫持 是如何產生的呢?

下面大概說幾種DNS劫持方法:

1.本機DNS劫持

攻擊者經過某些手段使用戶的計算機感染上木馬病毒,或者惡意軟件以後,惡意修改本地DNS配置,好比修改本地hosts文件,緩存等

2. 路由DNS劫持

不少用戶默認路由器的默認密碼,攻擊者能夠侵入到路由管理員帳號中,修改路由器的默認配置

3.攻擊DNS服務器

直接攻擊DNS服務器,例如對DNS服務器進行DDOS攻擊,能夠是DNS服務器宕機,出現異常請求,還能夠利用某些手段感染dns服務器的緩存,使給用戶返回來的是惡意的ip地址

9. 工具的使用

dig 命令

dig是一個在類Unix命令行模式下查詢DNS包括NS記錄,A記錄,MX記錄等相關信息的工具。

經過 dig (參數:+trace)命令,咱們能夠看到上面描述的 DNS 解析的詳細過程

從返回的結果,咱們能夠看得出幾點信息

  1. 咱們的本地 DNS 服務器 ip 爲 192.168.1.1,端口爲53,你能夠在 /etc/resolv.conf 裏看到這個配置
  2. 根域名服務器目前全球一共只有十三臺,從a.root-servers.net. m.root-servers.net. ,它們對應的ip地址,已經內置在本地DNS服務器中。

若是你只想看到結果,可使用 +short 參數,能夠直接返回 www.163.com 對應着哪幾個ip

你也能夠加個 @ 參數 ,指定從某個 DNS 服務器進行查詢

若是你只想查看指定的記錄類型

host 命令

host 命令 能夠看做dig命令的簡化版本,返回當前請求域名的各類記錄。

whois命令

whois命令用來查看域名的註冊狀況。

nslookup命令

nslookup也是經常使用的一個查詢 DNS 解析結果的工具

$ nslookup [查詢的域名] [指定DNS服務器]

你也能夠指定公網的域名服務器進行查詢,好比常見的 114.114.114.114

10. 手動清理本地緩存

MacOS

$ sudo dscacheutil -flushcache
$ sudo killall -HUP mDNSResponder

Windows

$ ipconfig /flushdns

Linux

# 使用NSCD的DNS緩存
$ sudo /etc/init.d/nscd restart

# 服務器或者路由器使用DNSMASQ
$ sudo dnsmasq restart

相關文章
相關標籤/搜索