前言
我們日常訪問么個網站或者么個服務時,必須要知道對方IP地址才能通信。但是我們一般很難記住哪個IP地址對應的是哪個服務。為了方便我們區分哪個IP對應的提供了什么服務,便發明了域名。我們通過域名來訪問我們想要的網站,例如www.baidu.com。但是域名不是IP地址,前面我們說想要上網需要指定具體的IP地址,這個時候就引入了我們的主角DNS,他的作用就是解析IP地址和域名的對應關系。
域名
域名按照從右到左的順序來劃分層次結構,最右邊的是最高級的根域,根域就是所謂的”.”,其實我們的域名www.baidu.com在配置當中應該是www.baidu.com.(最后有一個點),一般我們在瀏覽器里輸入時會省略后面的點,瀏覽器會自動幫助我們加上。接下來就是頂級域又稱一級域,一級域之后還有二級、三級域。如何區分當前域名是幾級域,舉個例子如:www.baidu.com
dns服務器
DNS服務器是能提供域名解析的服務器,域名每一層域都會有一堆域名(DNS)服務器,以上述案例www.baidu.com的為例:
根據域名服務器所起的作用,可以把域名服務器劃分為以下四種不用的類型:
1、根域名服務器根
域名服務器是最高層次的域名服務器,所有根服務器都知道所有的頂級域名服務器的域名和IP地址,互聯網上的根域名服務器只是用13個不同IP地址的域名(注意不是13臺機器,一個IP通過負載均衡有很多服務器提供服務)。
2、頂級域名服務器
這些域名服務器負責管理在該頂級域名服務器注冊的所有二級域名。當收到DNS查詢請求時,就給出相應的回答。
3、權威域名服務器
負責一個區域的服務器,例如上述中負責解析baidu的服務器就是權威服務器(只負責解析baidu的域)
4、本地域名服務器
我們上網的時候為了提供查詢速度一般會先訪問本地域名服務器
域名訪問流程
假如我們現在要訪問www.baidu.com,流程如圖所示:
首先,瀏覽器先檢查自身緩存中有沒有被解析過的這個域名對應的ip地址,如果有,解析結束。其次,如果瀏覽器緩存中沒有(專業點叫還沒命中),瀏覽器會檢查操作系統緩存中有沒有對應的已解析過的結果。而操作系統也有一個域名解析的過程。在windows中可通過c盤里一個叫hosts的文件來設置(C:WindowsSystem32driversetchosts),如果你在這里指定了一個域名對應的ip地址,那瀏覽器會首先使用這個ip地址。
- 如果至此還沒有命中域名,才會真正的請求本地域名服務器來解析這個域名,這臺服務器一般在你的城市的某個角落,距離你不會很遠,并且這臺服務器的性能都很好,一般都會緩存域名解析結果,大約80%的域名解析到這里就完成了。
- 如果本地域名服務器仍然沒有命中,就直接跳到根域名服務器請求解析
- 根域名服務器返回給本地域名服務器一個所查詢域的頂級域名服務器(如.com .cn .org等)地址
- 此時本地域名服務器再發送請求給上一步返回的頂級域名服務器
- 接受請求的頂級域名服務器查找并返回baidu這個域名對應的權威域名服務器的地址,這個權威域名服務器就是www.baidu.com注冊的域名服務器
- 權威域名服務器根據映射關系表找到目標ip,返回給本地域名服務器
- 本地域名服務器緩存這個域名和對應的ip
- 本地域名服務器把解析的結果返回給用戶,域名解析過程至此結束
其中本機向本地域名服務器的查詢一般稱之為遞歸查詢,本地域名服務器象根域名服務器等的查詢稱之為迭代查詢。
清除dns緩存
在我們日常工作中,如果頻繁的修改本地host文件,會出現因為存在dns緩存,從而導致修改的host文件沒有生效,不能正確的解析域名。清除緩存的方法如下:
//展示系統緩存的域名解析
ipconfig /displaydns
//清除系統緩存的域名解析
ipconfig /flushdns
dns其他概念
如圖所示,用nslookup來查看域名www.163.com的解析情況:
SOA記錄:域權威記錄,說明本機服務器為該域的管理服務器圖示案例因為訪問的是本地dns服務器,所以顯示非權威應答
A記錄:又稱正向解析記錄把域名解析為IP
PTR記錄:又稱反向解析記錄IP地址到域名的映射
cname記錄:又稱別名和linux系統中命令的別名,簡化命令是一樣的作用圖示中的www.163.com.163jiasu.com和www.163.com.bsgslb.cn就是別名,訪問這兩個域名和訪問www.163.com效果是一樣的,即訪問同一臺機器(前提是服務端配置能允許訪問這兩個域名)
dns劫持
現在做個假設:假如攻擊者劫持了DNS服務器,通過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,導致用戶對該域名地址進行訪問的時候,由原來的IP地址轉入到修改后的IP地址。結果就是讓正確的網址不能解析或者是被解析到另一個網址的IP,實現獲取用戶資料或者破壞原有網址正常服務的目的。
大家試想一下,如果2.2.2.2這臺服務器上的www.qq.com和qq官方的頁面做的一模一樣(可以拷貝瀏覽器代碼實現),那么我們登錄QQ的時候,是不是就把自己的QQ帳號和密碼透露給了黑客呢?
好在及時黑客真的攻陷了本地dns服務器,影響的范圍也只是使用該被攻擊的dns服務器的群主,不會有大范圍的影響(根域名dns服務器除外)。
解決辦法:(本地DNS服務器都是運營商分配的)1、直接用此IP代替域名后進行訪問2、手動指定信任的/沒有被攻擊的DNS服務器
結束語
這里只介紹了dns的工作常識,關于dns如何在linux上部署或者想更深入學習dns(cdn相關的認識)的朋友可以參看書籍《DNS與BIND》