DNS(Domain Name System,域名系統),萬維網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住IP。
通過域名,最終得到該域名對應的IP地址的過程叫做域名解析(或主機名解析)。
為什么需要DNS解析域名為IP地址?
首先計算機在網絡上通訊時只能識別IP地址(網絡通訊大部分是基於TCP/IP協議,而TCP/IP是基於IP地址的),比如我要在瀏覽器中訪問百度的地址,我可以在地址欄直接輸入14.215.177.39就能訪問到百度的首頁。但是我們無法記住更多的IP地址。那么域名就出現了,域名是由一串用”.”分隔的唯一名字。所以現在我們訪問網站的時候,就可以在瀏覽器地址欄中輸入域名(www.baidu.com),那么DNS就會把域名翻譯成IP,然后訪問IP
域名
域名按照從右到左的順序來划分優先等級,最右邊的是最高級的根域,根域就是所謂的”.”,其實我們的域名www.baidu.com在配置當中應該是www.baidu.com.(最后有一個點),一般我們在瀏覽器里輸入時會省略后面的點。接下來就是頂級域又稱一級域,一級域之后還有二級三級域。如何區分當前域名是幾級域,可以參考域名中有幾個點來判斷(除了根域外),比如baidu.com就是個一級域,而www.baidu.com就是個二級域(它是在baidu.com這個域里面有一個叫做www的主機)
每一層域都會有一堆域名(DNS)服務器,DNS服務器是能提供域名解析的服務器,記錄類型可以是A(address)記錄,NS(name server)記錄,MX(mail),CNAME等,這些記錄類型后續會一一介紹到。
這里有個知識點,百科中說全世界只有13台根DNS服務器,但其實這是錯誤的觀點,根DNS服務器只有具體的13個IP地址,但機器的數量不止13台。
DNS服務器一般分三種,根DNS服務器,頂級DNS服務器,權威DNS服務器
接下來會講到這些DNS服務器和我們今天說的DNS解析有什么關系,在講述DNS解析流程前先要理解什么是本地DNS
本地DNS一般是指你電腦上網時IPv4或者IPv6設置中填寫的那個DNS。這個有可能是手工指定的或者是自動分配的。
如果你的電腦是直連運營商(ISP)網絡,一般默認設置情況下DNS為ISP的服務器地址。
如果你的電腦和ISP之間還加了無線或者有線路由(一般的路由器本身還會內置DNS轉發器),它的作用是將發往它所有的DNS請求轉發到上層DNS,但最終會轉發到ISP的DNS。
如果手動修改了DNS,比如改成8.8.8.8這樣的公用DNS服務器,那么指的就是這個服務器。
本地DNS不是權威服務器,相當於一個代理的DNS解析服務器,他會幫你迭代權威服務器返回的回答,然后把最終查到的IP返回給你。
如下圖所示,就是之后我們講到的本地DNS服務器。
- 現在我有一台電腦,在瀏覽器中輸入www.baidu.com域名,瀏覽器會從瀏覽器的DNS緩存中檢查是否有這個網址的映射關系,如果有,就返回IP,完成域名解析
- 如果沒有,操作系統會先檢查自己本地的hosts文件是否有這個網址的映射關系,如果有,就返回IP,完成域名解析。看到這里大家應該都猜到了,有DNS的地方,就有緩存。瀏覽器、操作系統、本地DNS、根域名服務器,它們都會對DNS結果做一定程度的緩存。
- 如果還沒有,我的電腦就要向本地DNS服務器發起請求查詢www.baidu.com這個域名。
- 本地DNS服務器拿到請求后,先檢查一下自己的緩存中有沒有這個地址,有的話直接返回。這個時候拿到的IP地址,會被標記為非權威服務器的應答
- 如果本地DNS服務器的緩存中沒有的話,本地DNS服務器會從配置文件中讀取13個根DNS服務器的地址,然后向其中一台發起請求
- 根DNS服務器拿到請求后,知道他是com.這個頂級域名下的,所以會返回com域名中的NS記錄(用來表明哪台服務器對該域名進行解析),其實就是一個IP(com對應的服務器IP)
- 本地DNS服務器根據返回的IP(com DNS服務器)發起請求,com DNS服務器發現你這請求的是baidu.com這個域,查到這個域的NS記錄,然后返回IP(baidu.com)
- 本地DNS服務器在根據IP(baidu.com DNS服務器)訪問這些權威服務器,baidu.com服務器在A記錄(正向解析記錄,域名到IP地址的映射)中查找到www.baidu.com的IP地址,返回IP(www.baidu.com)
- 最終本地DNS服務器拿到用戶想訪問的www.baidu.com的IP,返回給客戶端,並進行緩存操作,以便下次使用。
看上面的圖,再理解一遍:
瀏覽器:@瀏覽器緩存,你知道www.baidu.com對應的IP么?
瀏覽器緩存:知道,是xxxx
瀏覽器:好的,我去訪問啦!
瀏覽器緩存:不知道
瀏覽器:@系統緩存,你知道www.baidu.com對應的IP么?
系統緩存:我看下hosts哦,找到了,是xxxx
瀏覽器:好的,我去訪問啦~
系統緩存:我看下hosts哦,哎呀沒有找到哎
瀏覽器:好的,我無能為力了,@客戶機想想辦法
客戶機:我去問問@本地DNS服務器,你知道www.baidu.com對應的IP么?
本地DNS服務器:我去DNS服務器緩存中找找,找到了,是xxxx
客戶機:@瀏覽器,是xxxx,你去訪問吧
瀏覽器:好的,我去訪問啦#
本地DNS服務器:我去DNS服務器緩存中找找,哎呀沒有找到哎
本地DNS服務器:想個辦法,先去找大哥@根DNS服務器,你知道www.baidu.com對應的IP么?
根DNS服務器:我知道com DNS服務器的IP,你叫他給你查
本地DNS服務器:好的,@com DNS服務器,你知道www.baidu.com對應的IP么?
com DNS服務器:我知道baidu.com DNS服務器的IP,你叫他給你查
本地DNS服務器:怎么開始踢皮球了,@baidu.com DNS服務器,你知道www.baidu.com對應的IP么?
baidu.com DNS服務器:我這里查到了,IP是xxxx
本地DNS服務器:太開心了@客戶機IP是xxxx。這么麻煩,先記到DNS服務器緩存,免得下次又這么折騰。
客戶機:@瀏覽器 IP是xxxx
瀏覽器:好的,我去訪問啦
上面就把正常的DNS解析流程講解完畢了,其中有提到的迭代查詢,在整個DNS解析過程中會存在遞歸查詢過程和迭代查詢過程。
我的電腦向本地DNS服務器的查詢一般都是采用遞歸查詢
本地DNS服務器向其他DNS服務器的查詢是迭代查詢
總結下就是發起查詢的機器改變了就是遞歸查詢,反之,發起查詢的機器不變就是迭代查詢。
DNS解析過程中也解釋了DNS服務器記錄中的NS記錄和A記錄,那么接下來就看下DNS服務器中的這些記錄的作用
其實在上面DNS解析www.baidu.com域名的時候,在實際操作中就有遇到CNAME記錄。
當我們向baidu.com請求www.baidu.com的時候,返回了一個別名www.a.shifen.com
一般解析過程中遇到CNAME,查詢會終止,重新向根DNS服務器發起查詢別名的請求,最終返回給電腦www.baidu.com 的CNAME以及別名的IP。
以上所有流程可以使用nslookup或dig(linux自帶,windows可裝)命令查詢驗證
DNS劫持
DNS決定的是我們的域名將解析到哪一個IP地址的記錄,是基於UDP協議的一種應用層協議。這種攻擊的前提是攻擊者掌控了你的本地DNS服務器
攻擊者劫持了DNS服務器,通過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,導致用戶對該域名地址進行訪問的時候,由原來的IP地址轉入到修改后的IP地址。結果就是讓正確的網址不能解析或者是被解析到另一個網址的IP,實現獲取用戶資料或者破壞原有網址正常服務的目的。
原理如下圖所示:
由於域名劫持往往只能在特定的被劫持的網絡范圍內進行,所以在此范圍外的DNS服務器能夠返回正常的IP地址,或者修改DNS以及直接IP訪問。
一般而言,用戶上網的DNS服務器都是運營商分配的,所以在這個節點上,運營商可以做一些事情,比如,你去訪問www.a.com,正常DNS應該返回10.0.0.1,而運營商劫持后,會返回一個運營商的中間服務器IP,訪問該服務器會一致性的返回302(暫時重定向),讓用戶瀏覽器跳轉到預處理好的帶廣告的網頁,在該網頁中再通過iframe打開用戶原先訪問的地址。
DNS污染
又稱域名服務器緩存投毒(DNS cache poisoning),它和DNS劫持的不同之處,在於污染針對的是DNS緩存,是在查詢信息到達目標DNS服務器前,經過的節點上做手腳,而劫持是DNS服務器中記錄的是錯誤的內容。
總結下就是DNS劫持是修改DNS服務器,DNS污染是修改DNS緩存。
看下圖舉個例子:對於GFW來說,DNS劫持用於國內服務器,因為可以修改服務器中的DNS記錄,而對於國外服務器GFW無法更改其內容,故采用DNS污染的方式篡改用戶收到的信息。其中的過程是,當你向國外DNS服務器查詢DNS記錄時,這些流量走到國際出口帶寬的時候會遇到GFW的關鍵字審查,如果上了黑名單,GFW會立即向你返回一個虛假的DNS記錄。上面也說到DNS走的是UDP協議,加上DNS查詢結果只認最快返回的,所以一定是先收到了GFW給你返回的虛假DNS記錄,就算馬上你收到了真正的來自國外DNS的回復,也會被你的系統無視掉。這種攻擊也被稱為中間人攻擊。