DNS基礎知識

DNS 是什么

DNS (Domain Name System), 也叫網域名稱系統,是互聯網的一項服務。它實質上是一個 域名IP 相互映射的分布式數據庫,有了它,我們就可以通過域名更方便的訪問互聯網。

DNS有以下特點:

  • 分布式的
  • 協議支持TCP 和 UDP, 常用端口是53
  • 每一級域名的長度限制是63
  • 域名總長度限制是253

那么,什么情況下使用TCP,什么情況下使用UDP呢?

最早的時候,DNS 的UDP報文上限大小是512 字節, 所以當某個response大小超過512 (返回信息太多),DNS服務就會使用TCP協議來傳輸。后來DNS 協議擴展了自己的UDP協議,DNS client 發出查詢請求時,可以指定自己能接收超過512字節的UDP包, 這種情況下,DNS 還是會使用UDP協議

分層的數據庫結構

DNS 的結構跟Linux 文件系統很相似,像一棵倒立的樹。 下面用站長之家的域名舉例:

最上面的.是根域名, 接著是頂級域名com,再下來是站長之家域名chinaz 依次類推。 使用域名時,從下而上。 s.tool.chinaz.com. 就是一個完整的域名, www.chinaz.com. 也是。

之所以設計這樣復雜的樹形結構, 是為了防止名稱沖突。 這樣一棵樹結構,當然可以存儲在一臺機器上,但現實世界中完整的域名非常多,并且每天都在新增、刪除大量的域名,存在一臺機器上,對單機器的存儲性能就是不小的挑戰。 另外,集中管理還有一個缺點就是管理不夠靈活。 可以想象一下,每次新增、刪除域名都需要向中央數據庫申請是多么麻煩。 所以現實中的DNS 都是分布式存儲的。

根域名服務器只管理頂級域,同時把每個頂級域的管理委派給各個頂級域,所以當你想要申請com下的二級域名時,找com域名注冊中心就好了。 例如你申請了上圖的chinaz.com二級域名, chinaz.com 再向下的域名就歸你管理了。 當你管理chinaz.com的子域名時,你可以搭建自己的nameserver, 在.com注冊中心把chinaz.com的管理權委派給自己搭建的nameserver。 自建nameserver 和不自建的結構圖如下:

一般情況下,能不自建就不要自建,因為維護一個高可用的DNS也并非容易。據我所知,有兩種情況需要搭建自己的nameserver:

  1. 搭建對內的DNS。公司內部機器眾多,通過ip相互訪問太過凌亂,這時可以搭建對內的nameserver,允許內部服務器通過域名互通
  2. 公司對域名廠商提供的nameserver性能不滿意。雖然頂級域名注冊商都有自己的nameserver, 但注冊商提供的nameserver 并不專業,在性能和穩定性上無法滿足企業需求,這時就需要企業搭建自己的高性能nameserver,比如增加智能解析功能,讓不同地域的用戶訪問最近的IP,以此來提高服務質量

概括一下DNS的分布式管理, 當把一個域委派給一個nameserver后,這個域下的管理權都交由此nameserver處理。 這種設計一方面解決了存儲壓力,另一方面提高了域名管理的靈活性 (這種結構像極了Linux File System, 可以把任何一個子目錄掛載到另一個磁盤,還可以把它下面的子目錄繼續掛載出去)

頂級域名

像com這樣的頂級域名,由ICANN 嚴格控制,是不允許隨便創建的。頂級域名分兩類:

  • 通用頂級域名
  • 國家頂級域名

通用頂級域名常見的如.com、 .org、.edu等, 國家頂級域名如我國的.cn, 美國的.us。 一般公司申請公網域名時,如果是跨國產品,應該選擇通用頂級域名;如果沒有跨國業務,看自己喜好(可以對比各家頂級域的服務、穩定性等再做選擇)。 這里說一下幾個比較熱的頂級域,完整的頂級域參見維基百科

me
me頂級域其實是國家域名, 是黑山共和國的國家域名,只不過它對個人開發申請,所以很多個人博主就用它作為自己的博客域名(本博客也是這么來的~)

io
很多開源項目常用io做頂級域名,它也是國家域名。 因為io 與計算機中的 input/output 縮寫相同,和計算機的二機制10也很像,給人一種geek的感覺。相較于.com域名,.io下的資源很多,更多選擇.

DNS 解析流程

聊完了DNS 的基本概念,我們再來聊一聊DNS 的解析流程。 當我們通過瀏覽器或者應用程序訪問互聯網時,都會先執行一遍DNS解析流程。標準glibc提供了libresolv.so.2 動態庫,我們的應用程序就是用它進行域名解析(也叫resolving)的, 它還提供了一個配置文件/etc/nsswitch.conf來控制resolving行為,配置文件中最關鍵的是這行:

hosts:      files dns myhostname

它決定了resolving 的順序,默認是先查找hosts文件,如果沒有匹配到,再進行DNS解析。默認的解析流程如下圖:

上圖主要描述了client端的解析流程,我們可以看到最主要的是第四步請求本地DNS服務器去執行resolving,它會根據本地DNS服務器配置,發送解析請求到遞歸解析服務器(稍后介紹什么是遞歸解析服務器), 本地DNS服務器在 /etc/resolv.conf 中配置。 下面我們再來看看服務端的resolving流程:

我們分析一下解析流程:

  1. 客戶端向本地DNS服務器(遞歸解析服務器) 發出解析tool.chinaz.com域名的請求
  2. 本地dns服務器查看緩存,是否有緩存過tool.chinaz.com域名,如果有直接返回給客戶端;如果沒有執行下一步
  3. 本地dns服務器向根域名服務器發送請求,查詢com頂級域的nameserver 地址
  4. 拿到com域名的IP后,再向com nameserver發送請求,獲取chinaz域名的nameserver地址
  5. 繼續請求chinaz的nameserver, 獲取tool域名的地址,最終得到了tool.chinaz.com的IP,本地dns服務器把這個結果緩存起來,以供下次查詢快速返回
  6. 本地dns服務器把把結果返回給客戶端

遞歸解析服務器 vs 權威域名服務器

我們在解析流程中發現兩類DNS服務器,客戶端直接訪問的是 遞歸解析服務器, 它在整個解析過程中也最忙。 它的查詢步驟是遞歸的,從根域名服務器開始,一直詢問到目標域名。

遞歸解析服務器通過請求一級一級的權威域名服務器,獲得下一目標的地址,直到找到目標域名的 權威域名服務器

簡單來說: 遞歸解析服務器 是負責解析域名的, 權威域名服務器是負責存儲域名記錄的

遞歸解析服務器一般由ISP提供,除此之外也有一些比較出名的公共遞歸解析服務器, 如谷歌的8.8.8.8,聯通的114,BAT也都有推出公共遞歸解析服務器,但性能最好的應該還是你的ISP提供的,只是可能會有 DNS劫持 的問題

緩存

由于整個解析過程非常復雜,所以DNS 通過緩存技術來實現服務的魯棒性。 當遞歸nameserver解析過tool.chianaz.com 域名后,再次收到tool.chinaz.com查詢時,它不會再走一遍遞歸解析流程,而是把上一次解析結果的緩存直接返回。 并且它是分級緩存的,也就是說,當下次收到的是www.chinaz.com的查詢時, 由于這臺遞歸解析服務器已經知道chinaz.com的權威nameserver, 所以它只需要再向chinaz.com nameserver 發送一個查詢www的請求就可以了。

根域名服務器
遞歸解析服務器是怎么知道 根域名服務器的地址的呢? 根域名服務器的地址是固定的,目前全球有13個根域名解析服務器,這13條記錄持久化在遞歸解析服務器中:

為什么只有13個根域名服務器呢,不是應該越多越好來做負載均衡嗎? 之前說過DNS 協議使用了UDP查詢, 由于UDP查詢中能保證性能的最大長度是512字節,要讓所有根域名服務器數據能包含在512字節的UDP包中, 根服務器只能限制在13個, 而且每個服務器要使用字母表中單字母名

智能解析

智能解析,就是當一個域名對應多個IP時,當你查詢這個域名的IP,會返回離你最近的IP。 由于國內不同運營商之間的帶寬很低,所以電信用戶訪問聯通的IP就是一個災難,而智能DNS解析就能解決這個問題。

智能解析依賴EDNS協議,這是google 起草的DNS擴展協議, 修改比較簡單,就是在DNS包里面添加origin client IP, 這樣nameserver 就能根據client IP 返回距離client 比較近的server IP 了

國內最新支持EDNS的就是DNSPod 了,DNSPod 是國內比較流行的域名解析廠商,很多公司會把域名利用DNSPod 加速, 它已經被鵝廠收購

域名注冊商

一般我們要注冊域名,都要需要找域名注冊商,比如說我想注冊hello.com,那么我需要找com域名注冊商注冊hello域名。com的域名注冊商不止一家, 這些域名注冊商也是從ICANN 拿到的注冊權, 參見如何申請成為.com域名注冊商

那么,域名注冊商權威域名解析服務器 有什么關系呢? 域名注冊商都會自建權威域名解析服務器,比如你在狗爹上申請一個.com下的二級域名,你并不需要搭建nameserver, 直接在godaddy控制中心里管理你的域名指向就可以了, 原因就是你新域名的權威域名服務器默認由域名注冊商提供。 當然你也可以更換,比如從godaddy申請的境外域名,把權威域名服務器改成DNSPod,一方面加快國內解析速度,另一方面還能享受DNSPod 提供的智能解析功能

用bind搭建域名解析服務器

由于網上介紹bind搭建的文章實在太多了,我就不再贅述了, 喜歡動手的朋友可以網上搜一搜搭建教程,一步步搭建一個本地的nameserver 玩一玩。這里主要介紹一下bind 的配置文件吧

bind 的配置文件分兩部分: bind配置文件zone配置文件

bind配置文件

bind配置文件位于/etc/named.conf,它主要負責bind功能配置,如zone路徑、日志、安全、主從等配置

其中最主要的是添加zone的配置以及指定zone配置文件。 recursion 開啟遞歸解析功能, 這個如果是no, 那么此bind服務只能做權威解析服務,當你的bind服務對外時,打開它會有安全風險,如何防御不當,會讓你的nameserver 被hacker 用來做肉雞

zone配置文件

zone的配置文件在bind配置文件中指定,下圖是一份簡單的zone配置:

zone的配置是nameserver的核心配置, 它指定了DNS 資源記錄,如SOA、A、CNAME、AAAA等記錄,各種記錄的概念網上資料太多,我這里就不重復了。其中主要講一下SOA 和 CNAME 的作用。

SOA記錄

SOA 記錄表示此域名的權威解析服務器地址。 上文講了權威解析服務器和遞歸解析服務器的差別, 當所有遞歸解析服務器中有沒你域名解析的緩存時,它們就會回源來請求此域名的SOA記錄,也叫權威解析記錄

CNAME

CNAME 的概念很像別名,它的處理邏輯也如此。 一個server 執行resloving 時,發現name 是一個CNAME, 它會轉而查詢這個CNAME的A記錄。一般來說,能使用CNAME的地方都可以用A記錄代替, 那么為什么還要發明CNAME這樣一個東西呢? 它是讓多個域名指向同一個IP的一種快捷手段, 這樣當最低層的CNAME 對應的IP換了之后,上層的CNAME 不用做任何改動。就像我們代碼中的硬編碼,我們總會去掉這些硬編碼,用一個變量來表示,這樣當這個變量變化時,我們只需要修改一處

配置完之后可以用named-checkconfnamed-checkzone 兩個命令來check我們的配置文件有沒有問題, 之后就可以啟動bind服務了:

$> service named start
Redirecting to /bin/systemctl restart  named.service

我們用netstat -ntlp 來檢查一下服務是否啟動:

53端口已啟動,那么我們測試一下效果, 用dig解析一下www.hello.com域名, 使用127.0.0.1 作為遞歸解析服務器

我們看到dig的結果跟我們配置文件中配置的一樣是1.2.3.4,DNS完成了它的使命,根據域名獲取到IP,但我們這里用來做示范的IP明顯是個假IP:)

用DNS 實現負載均衡

一個域名添加多條A記錄,解析時使用輪詢的方式返回隨機一條,流量將會均勻分類到多個A記錄。

www     IN      A       1.2.3.4
www     IN      A       1.2.3.5

上面的配置中,我們給www域添加了兩條A記錄, 這種做法叫multi-homed hosts, 它的效果是:當我們請求nameserver 解析www.hello.com 域名時,返回的IP會在兩個IP中輪轉(默認行為,有些智能解析DNS會根據IP判斷,返回一個離client近的IP, 距離 請搜索DNS智能解析)。

其實每次DNS解析請求時,nameserver都會返回全部IP,如上面配置,它會把1.2.3.4 和1.2.3.5 都返回給client端。 那么它是怎么實現RR的呢? nameserver 只是每次返回的IP排序不同,客戶端會把response里的第一個IP用來發請求。

** DNS負載均衡 vs LVS專業負載均衡**

和 LVS 這種專業負載均衡工具相比,在DNS層做負載均衡有以下特點:

  1. 實現非常簡單
  2. 默認只能通過RR方式調度
  3. DNS 對后端服務不具備健康檢查
  4. DNS 故障恢復時間比較長(DNS服務之間有緩存)
  5. 可負載的rs數量有限(受DNS response包大小限制)

真實場景中,還需要根據需求選擇相應的負載均衡策略

子域授權

我們從.com域下申請一個二級域名hello.com后, 發展到某一天我們的公司擴大了,需要拆分兩個事業部A和B, 并且公司給他們都分配了三級域名 a.hello.comb.hello.com, 域名結構如下圖:

再發展一段時間, A部門和B部門內部業務太多,需要頻繁的為新產品申請域名, 這個時候他們就想搭建自己的namserver, 并且需要上一級把相應的域名管理權交給自己, 他們期望的結構如下:

注意 第一階段 和 第二階段的區別: 第一階段, A部門想申請a.hello.com 下的子域名,需要向上級申請, 整個a.hello.com 域的管理都在總公司; 第二階段, A部門先自己搭建nameserver,然后總公司把 a.hello.com 域管理權轉交給 自建的nameserver, 這個轉交管理權的行為,就叫 子域授權

子域授權分兩部操作:

  1. A部門自建nameserver, 并且在zone配置文件中指定a.hello.com 的 權威解析服務器為自己的nameserver地址
  2. 總公司在nameserver 上增加一條NS記錄, 把a.hello.com 域授權給A部門的nameserver

第一步我們在用bind搭建域名解析服務器 里講過, 只要在 zone配置文件里指定SOA記錄就好:

@       IN     SOA      ns.a.hello.com    admin.a.hello.com. (……)

第二步,在hello.com域的nameserver 上添加一條NS記錄:

a.hello.com      IN       NS       ns.a.hello.com
ns.a.hello.com      IN      A        xx.xx.xx.xx (自建nameserver的IP)

這樣當解析xx.a.hello.com 域名時, hello.com nameserver 發現配置中有NS記錄,就會繼續遞歸向下解析

DNS 調試工具

OPS 常用的DNS調試工具有: host, nslookup, dig

這三個命令都屬于 bind-utils 包, 也就是bind工具集, 它們的使用復雜度、功能 依次遞增。 關于它們的使用, man 手冊和網上有太多教程,這里簡單分析一下dig命令的輸出吧:

dig 的參數非常多, 功能也很多,詳細使用方法大家自行man吧

其他

DNS 放大攻擊

DNS 放大攻擊屬于DoS攻擊的一種,是通過大量流量占滿目標機帶寬, 使得目標機對正常用戶的請求拒絕連接從而掛掉。

思路
正常的流量攻擊,hack機向目標機建立大量request-response, 但這樣存在的問題是需要大量的hack機器。 因為服務器一般的帶寬遠大于家用網絡, 如果我們自己的家用機用來做hack機器,還沒等目標機的帶寬占滿,我們的帶寬早超載了。

原理
DNS 遞歸解析的流程比較特殊, 我們可以通過幾個字節的query請求,換來幾百甚至幾千字節的resolving應答(流量放大), 并且大部分服務器不會對DNS服務器做防御。 那么hacker們只要可以偽裝DNS query包的source IP, 從而讓DNS 服務器發送大量的response到目標機,就可以實現DoS攻擊。

但一般常用的DNS服務器都會對攻擊請求做過濾,所以找DNS服務器漏洞也是一個問題。 詳細的放大攻擊方法大家有興趣自行google吧,這里只做一個簡單介紹 :)

好用的公共遞歸解析DNS服務器

見: 公共DNS哪家強

延伸

如何用樹莓派打造家用DNS

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 1. 概述 在網絡環境中一般用戶只需要在瀏覽器中輸入url如www.sunny.com就可以到對應服務器獲取相應的...
    ghbsunny閱讀 2,929評論 0 7
  • 在使用consul做docker容器服務化的過程中,使用到了dnsmasq做DNS請求轉發,于是研究了下DNS協議...
    __七把刀__閱讀 4,011評論 2 13
  • DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能...
    一直在努力hard閱讀 4,667評論 3 19
  • 《Mr Shifty穿墻先生》是一款酷炫的俯視角動作游戲。 玩家要去利用自己瞬間移動的超能力快節奏地打倒那些手持武...
    閏土我是猹啊_閱讀 410評論 0 1