DNS (Domain Name System 的縮寫)的做用很是簡單,就是根據域名查出IP地址。你能夠把它想象成一本巨大的電話本。shell
舉例來講,若是你要訪問域名math.stackexchange.com
,首先要經過DNS查出它的IP地址是151.101.129.69
。緩存
因爲後面我會講到 DNS 的解析過程,所以須要你對域名的層級有一些瞭解服務器
.root
或者 .
,一般是省略的.com
,.cn
等baidu.com
裏的 baidu
,這個用戶是能夠註冊購買的baike.baidu.com
裏的baike
,這個用戶是可分配的主機名.次級域名.頂級域名.根域名 baike.baidu.com.root
我們以訪問 www.163.com
這個域名爲例,來看一看當你訪問 www.163.com 時,會發生哪些事:網絡
www.163.com
的ip是啥?.com
的域名,就回信說:這個域名是由 .com
老弟管理的,你去問他好了,這是.com
老弟的聯繫方式(ip1)。.com
這個頂級域名服務器發起請求:請問 .com
大大,www.163.com
的ip 是啥?.com
頂級域名服務器接收到請求後,看到這是 163.com
的域名,就回信說:這個域名是 .163.com
老弟管理的,你就去問他就好了,這是他的聯繫方式(ip2).163.com
這個權威域名服務器發起請求:請問 163.com
大大,請問 www.163.com
的ip是啥?163.com
權威域名服務器接收到請求後,確認了是本身管理的域名,立刻查了下本身的小本本,把 www.163.com
的ip告訴了 本地DNS服務器。www.163.com
的ip了,立刻把這個消息告訴了要求查詢的客戶(就是你的電腦)。因爲這個過程比較漫長,本地DNS服務器爲了節省時間,也爲了儘可能不去打擾各位老大哥,就把這個查詢結果偷偷地記在了本身的小本本上,方便下次有人來查詢時,能夠快速回應。總結起來就是三句話工具
上面的幾個步驟裏,能夠看到有兩個地方會緩存 DNS 的查詢記錄,有了緩存,在必定程度上會提升查詢效率,但同時在準確率上會有所損失。網站
所以咱們在配置 DNS 解析的時候,會有一個 TTL 參數(Time To Live),意思就是這個緩存能夠存活多長時間,過了這個時間,本地 DNS 就會刪除這條記錄,刪除了緩存後,你再訪問,就要從新走一遍上面的流程,獲取最新的地址。google
當咱們在阿里雲買了一個域名後,能夠配置咱們主機域名解析規則,也就是 記錄。阿里雲
常見的 DNS 記錄類型以下.net
A
:地址記錄(Address),返回域名指向的IP地址。命令行
NS
:域名服務器記錄(Name Server),返回保存下一級域名信息的服務器地址。該記錄只能設置爲域名,不能設置爲IP地址。
MX
:郵件記錄(Mail eXchange),返回接收電子郵件的服務器地址。
CNAME
:規範名稱記錄(Canonical Name),返回另外一個域名,即當前查詢的域名是另外一個域名的跳轉,詳見下文。
PTR
:逆向查詢記錄(Pointer Record),只用於從IP地址查詢域名,詳見下文。
後面我將使用 wireshark 抓取 DNS 的數據包,可是在開始以前 ,得先了解一下 DNS 的報文結構
打開 Wireshark 後,使用 ping 163.com
來發起 DNS 解析請求,使用 DNS
關鍵字在Wireshark 過濾。
從抓取的報文總體來看,咱們能夠粗略獲取幾個信息
請求和應答的報文的截圖我放在了下面,接下來我將逐個分析。
請求
應答
請求和應答的事務ID應當是一個:0xd0d7
標誌字段裏的內容比較多,每一個字段的含義以下
回答資源記錄數,在應答包裏爲 2,說明返回了兩條查詢結果,你能夠在 Answer 字段裏看到。
權威名稱服務器計數
附加資源記錄數
應答的主要內容,這裏返回兩條結果,每條結果裏的字段有
Name: 查詢的域名 Type: A表示IPv4,AAAA 表示IPv6 Class: 表示Internet,幾乎老是它 Time to live: 生存時間 Data length: 數據長度 Address: 查詢到的 IP 地址
經過上面的講解,咱們都知道了,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地址
dig是一個在類Unix命令行模式下查詢DNS包括NS記錄,A記錄,MX記錄等相關信息的工具。
經過 dig (參數:+trace
)命令,咱們能夠看到上面描述的 DNS 解析的詳細過程
從返回的結果,咱們能夠看得出幾點信息
到
m.root-servers.net. ,它們對應的ip地址,已經內置在本地DNS服務器中。若是你只想看到結果,可使用 +short
參數,能夠直接返回 www.163.com 對應着哪幾個ip
你也能夠加個 @
參數 ,指定從某個 DNS 服務器進行查詢
若是你只想查看指定的記錄類型
host
命令 能夠看做dig
命令的簡化版本,返回當前請求域名的各類記錄。
whois
命令用來查看域名的註冊狀況。
nslookup也是經常使用的一個查詢 DNS 解析結果的工具
$ nslookup [查詢的域名] [指定DNS服務器]
你也能夠指定公網的域名服務器進行查詢,好比常見的 114.114.114.114
MacOS
$ sudo dscacheutil -flushcache $ sudo killall -HUP mDNSResponder
Windows
$ ipconfig /flushdns
Linux
# 使用NSCD的DNS緩存 $ sudo /etc/init.d/nscd restart # 服務器或者路由器使用DNSMASQ $ sudo dnsmasq restart