DNS( Domain Name System)是「域名系統」的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用於TCP/IP網絡,它所提供的服務是用來將主機名和域名轉換爲IP地址的工做。在互聯網中,是隻存在IP的,IP其實就是一串數字,至關於你家裏的門牌號,你們在網絡中想找到你,必須經過這個,因此IP對於每一個人來講是惟一的。可是第四代IP都是http://XXX.XXX.XXX.XXX這樣的,多難記啊,誰會沒事記住IP呢,更況且之後天那麼長的IPV6,要記住不是得要人命! 這時候一個聰明的科學家出來,咱們給IP加一個別名,你們經過別名不就能夠不記住這個IP,也能夠知道這個IP了!因而就有了域名[Domain]這個東西。而NDS就是把域名翻譯成IP的系統。html
一. 根域
就是所謂的「.」,其實咱們的網址www.baidu.com在配置當中應該是www.baidu.com.(最後有一點),通常咱們在瀏覽器裏輸入時會省略後面的點,而這也已經成爲了習慣。
根域服務器咱們知道有13臺,可是這是錯誤的觀點。根域服務器只是具備13個IP地址,但機器數量卻不是13臺,由於這些IP地址藉助了任播的技術,因此咱們能夠在全球設立這些IP的鏡像站點,你訪問到的這個IP並非惟一的那臺主機。具體的鏡像分佈能夠參考維基百科。這些主機的內容都是同樣的
二. 域的劃分
根域下來就是頂級域或者叫一級域,
有兩種劃分方式,一種互聯網剛興起時的按照行業性質劃分的com.,net.等,一種是按國家劃分的如cn.,jp.,等。具體多少你能夠本身去查,咱們這裏不關心。
每一個域都會有域名服務器,也叫權威域名服務器。好比:
baidu.com就是一個頂級域名,而www.baidu.com卻不是頂級域名,他是在baidu.com 這個域裏的一叫作www的主機。
一級域以後還有二級域,三級域,只要我買了一個頂級域,而且我搭建了本身BIND服務器(或者其餘軟件搭建的)註冊到互聯網中,那麼我就能夠隨意在前面多加幾個域了(固然長度是有限制的)。好比a.www.baidu.com,在這個網址中,www.baidu.com變成了一個二級域而不是一臺主機,主機名是a。linux
三. 域名服務器
能提供域名解析的服務器,上面的記錄類型能夠是A(address)記錄,NS記錄(name server),MX(mail),CNAME等。能夠查下它們的區別和聯繫。
A記錄是什麼意思呢,就是記錄一個IP地址和一個主機名字,好比我這個域名服務器所在的域test.baidu.com,咱們知道這是一個二級的域名,而後我在裏面有一條A記錄,記錄了主機爲a的IP,查到了就返回給你了。
若是我如今要想baidu.com這個域名服務器查詢a.test.baidu.com,那麼這個頂級域名服務器就會發現你請求的這個網址在test.baidu.com這個域中,我這裏記錄了這個二級域的域名服務器test.baidu.com的NS的IP。我返回給你這個地址你再去查主機爲a的主機把。
這些域內的域名服務器都稱爲權威服務器,直接提供DNS查詢服務。(這些服務器可不會作遞歸哦) windows
四 . 服務器關係大體以下瀏覽器
[根服務器]:全球一共13個A-M[http://root-servers.net],儲存着各個後綴域名的[頂級域名根服務器]
[頂級域名根服務器]:每一個後綴對應的DNS服務器,存儲着該[後綴]全部域名的權威DNS
[權威DNS]:這個域名所使用的DNS,好比說我設置的DNSPOD的服務器,權威DNS就是DNSPOD。在WHOIS(一個查看域名信息的東西)中能夠看到。儲存着這個域名[對應着的每條信息] 如IP等~緩存
根DNS是什麼呢?你們想一想,每一個域名都有一個後綴,好比說ovear是[.info]後綴的。那麼就有一個專門記錄[.info]後綴的dns服務器,其餘後綴也同樣。這個DNS就是該域名的根DNS。
那麼遞歸DNS呢?其實遞歸DNS就是一個代理人,是用來緩解[根DNS]壓力的,若是你們都去問[根DNS],那[根DNS]不早就跪了。畢竟一我的(網站)的地址不是常常變的,因此就有了TTL這一說法,根據DNS的規定,在一個TTL時間呢,你們就認爲你家裏(域名所指向的IP)的地址是不會變的,因此代理人[遞歸DNS]在這個時間內,是隻會問一次[根DNS]的,若是你第二次問他,他就會直接告訴你域名所指向的IP地址。這樣就能夠解決[根DNS]負載過大的問題啦。服務器
權威DNS:網絡
權威DNS是通過上一級受權對域名進行解析的服務器,同時它能夠把解析受權轉授給其餘人,如COM頂級服務器能夠受權xxorg.com這個域名的的權威服務器爲NS.ABC.COM,同時NS.ABC.COM還能夠把受權轉授給NS.DDD.COM,這樣NS.DDD.COM就成了ABC.COM實際上的權威服務器了。平時咱們解析域名的結果都源自權威DNS。好比xxorg.com的權威DNS服務器就是dnspod的F1G1NS1.DNSPOD.NET和F1G1NS2.DNSPOD.NET。dom
遞歸DNS:工具
負責接受用戶對任意域名查詢,並返回結果給用戶。遞歸DNS的工做過程參見本文第二節。遞歸DNS能夠緩存結果以免重複向上查詢。咱們平時使用最多的就是這類DNS,他對公衆開放服務,通常由網絡運營商提供,你們都本身能夠架遞歸DNS提供服務。遞歸DNS必定要有可靠的互聯網鏈接方可以使用。好比谷歌的8.8.8.8和8.8.4.4以及114的114.114.114.114和114.114.115.115都屬於這一類DNS。你本地電腦上設置的DNS就是這類DNS。醒醒的習慣是設置114.114.114.114和8.8.8.8這兩個,更可靠一點。網站
轉發DNS:
負責接受用戶查詢,並返回結果給用戶。但這個結果不是按標準的域名解析過程獲得的,而是直接把遞歸DNS的結果轉發給用戶。它也具有緩存功能。他主要使用在沒有直接的互聯網鏈接,但能夠鏈接到一個遞歸DNS那裏,這時使用轉發DNS就比較合適。其缺陷是:直接受遞歸DNS的影響,服務品質較差。好比咱們用的路由器裏面的DNS就是這一類,用路由器的朋友能夠看下本地電腦的DNS通常都是192.168.1.1。
遞歸服務器怎麼知道根權威服務器的地址?
很簡單,在遞歸服務器上都保存有一份根服務器的地址列表。
域名解析過程
用戶—本地遞歸服務器—根權威服務器—COM權威服務器—xx.com權威服務器—用戶
五 . 遞歸查詢與迭代查詢
遞歸查詢: 簡單的理解就是以最終結果查詢,就是返回最終的結果給客戶機,而客戶機在此階段是處於等待的狀態!(就比如,你在家裏地位最高,你都是衣來伸手飯來張口的,最什麼事情就只要一句話不用本身親自動手)
迭代查詢:簡單的理解就是以最佳的結果查詢,意思就是若是DNS服務器能解析就直接以最終結果返回給客戶機,若是沒法解析則就返回上一級DNS服務器的IP給客戶機,由客戶機完成查詢工做直到獲得最終結果!(舉個例子就是什麼事情你去問別人,別人只是告訴你怎麼作,你知道後要本身親自去作)
遞歸與迭代結合查詢
五.解析過程
從客戶端到本地DNS服務器是屬於遞歸查詢,而DNS服務器之間就是的交互查詢就是迭代查詢。
瀏覽器緩存 – 瀏覽器會緩存DNS記錄一段時間。 有趣的是,操做系統沒有告訴瀏覽器儲存DNS記錄的時間,這樣不一樣瀏覽器會儲存個自固定的一個時間(2分鐘到30分鐘不等)。
系統緩存 – 若是在瀏覽器緩存裏沒有找到須要的記錄,瀏覽器會作一個系統調用(windows裏是gethostbyname)。這樣即可得到系統緩存中的記錄。
路由器緩存 – 接着,前面的查詢請求發向路由器,它通常會有本身的DNS緩存。
ISP DNS 緩存 – 接下來要check的就是ISP緩存DNS的服務器。在這通常都能找到相應的緩存記錄。
遞歸搜索 – 你的ISP的DNS服務器從跟域名服務器開始進行遞歸搜索,從.com頂級域名服務器到Facebook的域名服務器。通常DNS服務器的緩存中會有.com域名服務器中的域名,因此到頂級服務器的匹配過程不是那麼必要了。
那麼咱們的DNS是怎麼解析一個域名的呢?網上搜了幾個,大概的看下。
1.如今我有一臺計算機,經過ISP接入了互聯網,那麼ISP就會給我分配一個DNS服務器,這個DNS服務器不是權威服務器,而是至關於一個代理的dns解析服務器,他會幫你迭代權威服務器返回的應答,而後把最終查到IP返回給你。
2.如今的我計算機要向這臺ISPDNS發起請求查詢www.baidu.com這個域名了,(經網友提醒:這裏其實準確來講不是ISPDNS,而應該是用戶本身電腦網絡設置裏的DNS,並不必定是ISPDNS。好比也有可能你手工設置了8.8.8.8)
3.ISPDNS拿到請求後,先檢查一下本身的緩存中有沒有這個地址,有的話就直接返回。這個時候拿到的ip地址,會被標記爲非權威服務器的應答。
4.若是緩存中沒有的話,ISPDNS會從配置文件裏面讀取13個根域名服務器的地址(這些地址是不變的,直接在BIND的配置文件中),
5.而後像其中一臺發起請求。
6.根服務器拿到這個請求後,知道他是com.這個頂級域名下的,因此就會返回com域中的NS記錄,通常來講是13臺主機名和IP。
7.而後ISPDNS向其中一臺再次發起請求,com域的服務器發現你這請求是baidu.com這個域的,我一查發現了這個域的NS,那我就返回給你,你再去查。(目前百度有4臺baidu.com的頂級域名服務器)。
8.ISPDNS不厭其煩的再次向baidu.com這個域的權威服務器發起請求,baidu.com收到以後,查了下有www的這臺主機,就把這個IP返回給你了,
9.而後ISPDNS拿到了以後,將其返回給了客戶端,而且把這個保存在高速緩存中。
一、在瀏覽器中輸入www.qq.com域名,操做系統會先檢查本身本地的hosts文件是否有這個網址映射關係,若是有,就先調用這個IP地址映射,完成域名解析。
二、若是hosts裏沒有這個域名的映射,則查找本地DNS解析器緩存,是否有這個網址映射關係,若是有,直接返回,完成域名解析。
三、若是hosts與本地DNS解析器緩存都沒有相應的網址映射關係,首先會找TCP/ip參數中設置的首選DNS服務器,在此咱們叫它本地DNS服務器,此服務器收到查詢時,若是要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具備權威性。
四、若是要查詢的域名,不禁本地DNS服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個IP地址映射,完成域名解析,此解析不具備權威性。
五、若是本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,若是未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS服務器收到請求後會判斷這個域名(.com)是誰來受權管理,並會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息後,將會聯繫負責.com域的這臺服務器。這臺負責.com域的服務器收到請求後,若是本身沒法解析,它就會找一個管理.com域的下一級DNS服務器地址(qq.com)給本地DNS服務器。當本地DNS服務器收到這個地址後,就會找qq.com域服務器,重複上面的動做,進行查詢,直至找到www.qq.com主機。
六、若是用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器若是不能解析,或找根DNS或把轉請求轉至上上級,以此循環。無論是本地DNS服務器用是是轉發,仍是根提示,最後都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。
1.客戶機提交域名解析請求,並將該請求發送給本地的域名服務器。
2.當本地的域名服務器收到請求後,就先查詢本地的緩存。若是有查詢的DNS信息記錄,則直接返回查詢的結果。若是沒有該記錄,本地域名服務器就把請求發給根域名服務器。
3.根域名服務器再返回給本地域名服務器一個所查詢域的頂級域名服務器的地址。
4.本地服務器再向返回的域名服務器發送請求。
5.接收到該查詢請求的域名服務器查詢其緩存和記錄,若是有相關信息則返回客戶機查詢結果,不然通知客戶機下級的域名服務器的地址。
6.本地域名服務器將查詢請求發送給返回的DNS服務器。
7.域名服務器返回本地服務器查詢結果(若是該域名服務器不包含查詢的DNS信息,查詢過程將重複<6>、<7>步驟,直到返回解析信息或解析失敗的迴應)。
8.本地域名服務器將返回的結果保存到緩存,而且將結果返回給客戶機。
六 . 使用工具查看解析過程
下面咱們來用 nslookup 這個工具詳細來講一下解析步驟:
從上圖咱們能夠看到:
第一行Server是:DNS服務器的主機名 -- 114.114.114.114
第二行Address是: 它的IP地址 -- 114.114.114.114#53
下面的Name是:解析的URL -- www.che.com
Address是:解析出來的IP -- 139.196.2.195
還有像百度這樣比較複雜的解析:
你會發現百度有一個cname = www.a.shifen.com 的別名。這是怎麼一個過程呢?咱們用dig工具來跟蹤一下把(linux系統自帶有)
執行以下命令:
第一步是向我這臺機器的ISPDNS獲取到根域服務區的13個IP和主機名[b-j].root-servers.net.。
第二步是向其中的一臺根域服務器(Servername就是末行小括號裏面的)發送www.baidu.com的查詢請求,他返回了com.頂級域的服務器IP(未顯示)和名稱。
第三步,便向com.域的一臺服務器192.48.79.201請求,www.baidu.com,他返回了baidu.com域的服務器IP(未顯示)和名稱,百度有四臺頂級域的服務器【此處能夠用dig @192.48.79.201 www.baidu.com查看返回的百度頂級域名服務器IP地址】。
第四步呢,向百度的頂級域服務器(202.181.38.10)請求www.baidu.com,他發現這個www有個別名,而不是一臺主機,別名是www.a.shifen.com。
按照通常的邏輯,當dns請求到別名的時候,查詢會終止,而是從新發起查詢別名的請求,因此此處應該返回的是www.a.shifen.com而已。 可是爲何返回a.shifen.com的這個域的NS呢? 咱們能夠嘗試下面的這個命令:dig +trace shifen.com 看看有什麼結果。。。。。。。。
會發現第三步時shifen.com這個頂級域的域名服務器和baidu.com這個域的域名服務器是同一臺主機(即:dns.baidu.com)!
所以總結一下即是
①本機向local dns請求www.baidu.com
②local dns向根域請求www.baidu.com,根域返回com.域的服務器IP
③向com.域請求www.baidu.com,com.域返回baidu.com域的服務器IP
④向baidu.com請求www.baidu.com,返回cname www.a.shifen.com和a.shifen.com域的服務器IP
⑤向root域請求www.a.shifen.com
⑥向com.域請求www.a.shife.com
⑦向shifen.com請求
⑧向a.shifen.com域請求
⑨拿到www.a.shifen.com的IP
⑩localdns返回本機www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP
參考自:http://blog.chinaunix.net/uid-28216282-id-3757849.html
七 . DNS 劫持 和 HTTP 劫持
簡單介紹一下HTTP劫持和DNS劫持的概念,也就是運營商經過某些方式篡改了用戶正常訪問的網頁,插入廣告或者其餘一些雜七雜八的東西。
首先對運營商的劫持行爲作一些分析,他們的目的無非就是賺錢,而賺錢的方式有兩種:
一、對正常網站加入額外的廣告,這包括網頁內浮層或彈出廣告窗口;
二、針對一些廣告聯盟或帶推廣連接的網站,加入推廣尾巴。例如普通訪問百度首頁,被前置跳轉爲 http://www.baidu.com/?tn=90509114_hao_pg
DNS劫持:
通常而言,用戶上網的DNS服務器都是運營商分配的,因此,在這個節點上,運營商能夠隨心所欲。
例如,訪問http://jiankang.qq.com/index.html,正常DNS應該返回騰訊的ip,而DNS劫持後,會返回一個運營商的中間服務器ip。訪問該服務器會一致性的返回302,讓用戶瀏覽器跳轉到預處理好的帶廣告的網頁,在該網頁中再經過iframe打開用戶原來訪問的地址。
HTTP劫持:
HTTP劫持是在使用者與其目的網絡服務所創建的專用數據通道中,監視特定數據信息,提示當知足設定的條件時,就會在正常的數據流中插入精心設計的網絡數據報文,目的是讓用戶端程序解釋「錯誤」的數據,並以彈出新窗口的形式在使用者界面展現宣傳性廣告或者直接顯示某網站的內容。
在運營商的路由器節點上,設置協議檢測,一旦發現是HTTP請求,並且是html類型請求,則攔截處理。後續作法每每分爲2種,1種是相似DNS劫持返回302讓用戶瀏覽器跳轉到另外的地址,還有1種是在服務器返回的HTML數據中插入js或dom節點(廣告)。
在用戶角度,這些劫持的表現分爲:
一、網址被無辜跳轉,多了推廣尾巴;
二、頁面出現額外的廣告(iframe模式或者直接同頁面插入了dom節點)。
DNS記錄污染:
指的是有人經過惡意僞造身份、利用漏洞等方式,向用戶或者其餘DNS服務器提供虛假的DNS記錄。因爲DNS記錄存在一個生存期(TTL),在生存期內,DNS保存在緩存中,除非通過了大於一個TTL的時間,或者經手工刷新DNS緩存,虛假的記錄會一直存在下去,而且若是污染了DNS服務器,這種污染還具備傳染性。
DNS污染具備暫時性,過了TTL週期,若是不進行再污染,污染就會消失。
DNS記錄污染同劫持的不一樣之處,在於污染是對原本正確的DNS查詢結果進行篡改,而劫持是DNS服務器本身把記錄改爲錯誤的內容。對於GFW來講,DNS劫持用於國內服務器,而對於國外服務器GFW沒法更改其內容,故採用DNS污染方式篡改用戶收到的信息。
GFW的DNS污染過程,是當你向國外DNS服務器查詢DNS記錄時候,這些流量走到國外出口處即會遭到GFW的關鍵字審查,若是上了黑名單,GFW會當即向你返回一個虛假的DNS記錄。因爲默認的DNS查詢方式是UDP,加上DNS查詢結果只認最快返回的結果,因此你必定是先收到了GFW給你返回的虛假DNS記錄;就算100ms後你收到了真正的來自國外DNS的回覆,那也會被你的系統無視掉。若是GFW想完全污染一個域名,那麼不僅是普通用戶,連國內全部的DNS服務器也會收到虛假的DNS紀錄致使全國性的DNS污染。
前一段,不明緣由的發生了國內大規模的DNS污染事件,國內大部分站點和部分地區均受到影響沒法經過域名訪問。這一定與GFW強大的DNS污染能力有關。
不過不只僅是國外出口處DNS記錄可能污染,各省市的ISP也可能利用現有GFW的技術進行本身的DNS污染,這種污染範圍小一些,也是GFW的一環。
防止DNS污染的方法目前來講就是使用TCP協議代替UDP來進行DNS查詢,由於TCP協議是有鏈接的協議須要雙方握手成功才能通信,從而避免GFW這種簡單的DNS污染方式。目前GFW對於TCP方式的DNS查詢其實已有阻斷能力,但未大規模部署,目前貌似只有dl.dropbox.com會遭遇TCP阻斷
八 . 劫持分析
打開 http://www.hao123.com 自動跳轉到 http://www.hao123.com/?tn=99184670_hao_pg,使用火狐 HttpFox 查看,能夠看到出現一次跳轉
使用 Wireshark 抓包,通過檢查DNS是正常的,沒有問題,那就說明這是HTTP鏈路層劫持了。