面試題:你主要負(fù)責(zé)公司基礎(chǔ)架構(gòu)的高可用,那你說(shuō)說(shuō)DNS的解析過(guò)程蝌诡?

image

DNS 是互聯(lián)網(wǎng)核心協(xié)議之一溉贿。不管是上網(wǎng)瀏覽枫吧,還是編程開(kāi)發(fā)浦旱,都需要了解一點(diǎn)它的知識(shí)。

DNS 是什么九杂?

image

DNS (Domain Name System 的縮寫)的作用非常簡(jiǎn)單颁湖,就是根據(jù)域名查出IP地址宣蠕。你可以把它想象成一本巨大的電話本。

舉例來(lái)說(shuō)甥捺,如果你要訪問(wèn)域名 math.stackexchange.com抢蚀,首先要通過(guò)DNS查出它的IP地址是 151.101.129.69。

查詢過(guò)程

雖然只需要返回一個(gè)IP地址镰禾,但是DNS的查詢過(guò)程非常復(fù)雜皿曲,分成多個(gè)步驟。

工具軟件dig可以顯示整個(gè)查詢過(guò)程吴侦。

$ dig math.stackexchange.com 
image.gif

上面的命令會(huì)輸出六段信息屋休。

image

第一段是查詢參數(shù)和統(tǒng)計(jì)。

image

第二段是查詢內(nèi)容备韧。

image

上面結(jié)果表示劫樟,查詢域名math.stackexchange.com的A記錄,A是address的縮寫织堂。

第三段是DNS服務(wù)器的答復(fù)叠艳。

image

上面結(jié)果顯示,math.stackexchange.com 有四個(gè)A記錄易阳,即四個(gè)IP地址附较。600是TTL值(Time to live 的縮寫),表示緩存時(shí)間潦俺,即600秒之內(nèi)不用重新查詢翅睛。

第四段顯示stackexchange.com的NS記錄(Name Server的縮寫),即哪些服務(wù)器負(fù)責(zé)管理stackexchange.com的DNS記錄黑竞。

image

上面結(jié)果顯示stackexchange.com共有四條NS記錄捕发,即四個(gè)域名服務(wù)器,向其中任一臺(tái)查詢就能知道m(xù)ath.stackexchange.com的IP地址是什么很魂。

第五段是上面四個(gè)域名服務(wù)器的IP地址扎酷,這是隨著前一段一起返回的。

image

第六段是DNS服務(wù)器的一些傳輸信息遏匆。

image

上面結(jié)果顯示法挨,本機(jī)的DNS服務(wù)器是192.168.1.253,查詢端口是53(DNS服務(wù)器的默認(rèn)端口)幅聘,以及回應(yīng)長(zhǎng)度是305字節(jié)凡纳。

如果不想看到這么多內(nèi)容,可以使用+short參數(shù)帝蒿。

$ dig +short math.stackexchange.com 151.101.129.69 151.101.65.69 151.101.193.69 151.101.1.69 上面命令只返回math.stackexchange.com對(duì)應(yīng)的4個(gè)IP地址(即A記錄)荐糜。 
image.gif

DNS服務(wù)器

下面我們根據(jù)前面這個(gè)例子,一步步還原,本機(jī)到底怎么得到域名math.stackexchange.com 的IP地址暴氏。

首先延塑,本機(jī)一定要知道DNS服務(wù)器的IP地址,否則上不了網(wǎng)答渔。通過(guò)DNS服務(wù)器关带,才能知道某個(gè)域名的IP地址到底是什么。

image

DNS服務(wù)器的IP地址沼撕,有可能是動(dòng)態(tài)的宋雏,每次上網(wǎng)時(shí)由網(wǎng)關(guān)分配,這叫做DHCP機(jī)制务豺;也有可能是事先指定的固定地址好芭。Linux系統(tǒng)里面,DNS服務(wù)器的IP地址保存在/etc/resolv.conf文件冲呢。

上例的DNS服務(wù)器是192.168.1.253舍败,這是一個(gè)內(nèi)網(wǎng)地址。有一些公網(wǎng)的DNS服務(wù)器敬拓,也可以使用邻薯,其中最有名的就是Google的8.8.8.8和Level 3的4.2.2.2。

本機(jī)只向自己的DNS服務(wù)器查詢乘凸,dig命令有一個(gè)@參數(shù)厕诡,顯示向其他DNS服務(wù)器查詢的結(jié)果。

$ dig @4.2.2.2 math.stackexchange.com 上面命令指定向DNS服務(wù)器4.2.2.2查詢营勤。 

域名的層級(jí)

DNS服務(wù)器怎么會(huì)知道每個(gè)域名的IP地址呢灵嫌?答案是分級(jí)查詢。

請(qǐng)仔細(xì)看前面的例子葛作,每個(gè)域名的尾部都多了一個(gè)點(diǎn)寿羞。

image

比如,域名math.stackexchange.com顯示為math.stackexchange.com.赂蠢。這不是疏忽绪穆,而是所有域名的尾部,實(shí)際上都有一個(gè)根域名虱岂。

舉例來(lái)說(shuō)玖院,www.example.com真正的域名是www.example.com.root,簡(jiǎn)寫為www.example.com.第岖。因?yàn)槟丫蛎?root對(duì)于所有域名都是一樣的,所以平時(shí)是省略的蔑滓。

根域名的下一級(jí)郊酒,叫做”頂級(jí)域名”(top-level domain遇绞,縮寫為TLD),比如.com猎塞、.net试读;再下一級(jí)叫做”次級(jí)域名”(second-level domain杠纵,縮寫為SLD)荠耽,比如www.example.com里面的.example,這一級(jí)域名是用戶可以注冊(cè)的比藻;再下一級(jí)是主機(jī)名(host)铝量,比如www.example.com里面的www,又稱為”三級(jí)域名”银亲,這是用戶在自己的域里面為服務(wù)器分配的名稱慢叨,是用戶可以任意分配的。

總結(jié)一下务蝠,域名的層級(jí)結(jié)構(gòu)如下拍谐。

主機(jī)名.次級(jí)域名.頂級(jí)域名.根域名 # 即 host.sld.tld.root 
image.gif

根域名服務(wù)器

DNS服務(wù)器根據(jù)域名的層級(jí),進(jìn)行分級(jí)查詢馏段。

需要明確的是轩拨,每一級(jí)域名都有自己的NS記錄,NS記錄指向該級(jí)域名的域名服務(wù)器院喜。這些服務(wù)器知道下一級(jí)域名的各種記錄亡蓉。

所謂”分級(jí)查詢”,就是從根域名開(kāi)始喷舀,依次查詢每一級(jí)域名的NS記錄砍濒,直到查到最終的IP地址,過(guò)程大致如下硫麻。

  1. 從”根域名服務(wù)器”查到”頂級(jí)域名服務(wù)器”的NS記錄和A記錄(IP地址)
  2. 從”頂級(jí)域名服務(wù)器”查到”次級(jí)域名服務(wù)器”的NS記錄和A記錄(IP地址)
  3. 從”次級(jí)域名服務(wù)器”查出”主機(jī)名”的IP地址

仔細(xì)看上面的過(guò)程爸邢,你可能發(fā)現(xiàn)了,沒(méi)有提到DNS服務(wù)器怎么知道”根域名服務(wù)器”的IP地址拿愧〖坠鳎回答是”根域名服務(wù)器”的NS記錄和IP地址一般是不會(huì)變化的,所以內(nèi)置在DNS服務(wù)器里面赶掖。

下面是內(nèi)置的根域名服務(wù)器IP地址的一個(gè)例子感猛。

image

上面列表中,列出了根域名(.root)的三條NS記錄A.ROOT-SERVERS.NET奢赂、B.ROOT-SERVERS.NET和C.ROOT-SERVERS.NET陪白,以及它們的IP地址(即A記錄)198.41.0.4、192.228.79.201膳灶、192.33.4.12咱士。

另外立由,可以看到所有記錄的TTL值是3600000秒,相當(dāng)于1000小時(shí)序厉。也就是說(shuō)锐膜,每1000小時(shí)才查詢一次根域名服務(wù)器的列表。

目前弛房,世界上一共有十三組根域名服務(wù)器道盏,從A.ROOT-SERVERS.NET一直到M.ROOT-SERVERS.NET。

分級(jí)查詢的實(shí)例

dig命令的+trace參數(shù)可以顯示DNS的整個(gè)分級(jí)查詢過(guò)程文捶。

$ dig +trace math.stackexchange.com 
image.gif

上面命令的第一段列出根域名.的所有NS記錄荷逞,即所有根域名服務(wù)器。

image

根據(jù)內(nèi)置的根域名服務(wù)器IP地址粹排,DNS服務(wù)器向所有這些IP地址發(fā)出查詢請(qǐng)求种远,詢問(wèn)math.stackexchange.com的頂級(jí)域名服務(wù)器com.的NS記錄。最先回復(fù)的根域名服務(wù)器將被緩存顽耳,以后只向這臺(tái)服務(wù)器發(fā)請(qǐng)求坠敷。

接著是第二段。

image
image.gif

?

上面結(jié)果顯示.com域名的13條NS記錄射富,同時(shí)返回的還有每一條記錄對(duì)應(yīng)的IP地址膝迎。

然后,DNS服務(wù)器向這些頂級(jí)域名服務(wù)器發(fā)出查詢請(qǐng)求辉浦,詢問(wèn)math.stackexchange.com的次級(jí)域名stackexchange.com的NS記錄弄抬。

image

上面結(jié)果顯示stackexchange.com有四條NS記錄,同時(shí)返回的還有每一條NS記錄對(duì)應(yīng)的IP地址宪郊。

然后掂恕,DNS服務(wù)器向上面這四臺(tái)NS服務(wù)器查詢math.stackexchange.com的主機(jī)名。

image

上面結(jié)果顯示弛槐,math.stackexchange.com有4條A記錄懊亡,即這四個(gè)IP地址都可以訪問(wèn)到網(wǎng)站。并且還顯示乎串,最先返回結(jié)果的NS服務(wù)器是ns-463.awsdns-57.com店枣,IP地址為205.251.193.207。

NS 記錄的查詢

dig命令可以單獨(dú)查看每一級(jí)域名的NS記錄叹誉。

$ dig ns com $ dig ns stackexchange.com 
image.gif

+short參數(shù)可以顯示簡(jiǎn)化的結(jié)果鸯两。

$ dig +short ns com $ dig +short ns stackexchange.com 
image.gif

DNS的記錄類型

域名與IP之間的對(duì)應(yīng)關(guān)系,稱為”記錄”(record)长豁。根據(jù)使用場(chǎng)景钧唐,”記錄”可以分成不同的類型(type),前面已經(jīng)看到了有A記錄和NS記錄匠襟。

常見(jiàn)的DNS記錄類型如下钝侠。

A:地址記錄(Address)该园,返回域名指向的IP地址。

NS:域名服務(wù)器記錄(Name Server)帅韧,返回保存下一級(jí)域名信息的服務(wù)器地址里初。該記錄只能設(shè)置為域名,不能設(shè)置為IP地址忽舟。

MX:郵件記錄(Mail eXchange)双妨,返回接收電子郵件的服務(wù)器地址。

CNAME:規(guī)范名稱記錄(Canonical Name)萧诫,返回另一個(gè)域名斥难,即當(dāng)前查詢的域名是另一個(gè)域名的跳轉(zhuǎn)枝嘶,詳見(jiàn)下文帘饶。

PTR:逆向查詢記錄(Pointer Record),只用于從IP地址查詢域名群扶,詳見(jiàn)下文及刻。

一般來(lái)說(shuō),為了服務(wù)的安全可靠竞阐,至少應(yīng)該有兩條NS記錄缴饭,而A記錄和MX記錄也可以有多條,這樣就提供了服務(wù)的冗余性骆莹,防止出現(xiàn)單點(diǎn)失敗颗搂。

CNAME 記錄主要用于域名的內(nèi)部跳轉(zhuǎn),為服務(wù)器配置提供靈活性幕垦,用戶感知不到丢氢。舉例來(lái)說(shuō),facebook.github.io這個(gè)域名就是一個(gè)CNAME記錄先改。

$ dig facebook.github.io ... ;; ANSWER SECTION: facebook.github.io. 3370 IN CNAME github.map.fastly.net. github.map.fastly.net. 600 IN A 103.245.222.133 
image.gif

上面結(jié)果顯示疚察,facebook.github.io的CNAME記錄指向github.map.fastly.net。也就是說(shuō)仇奶,用戶查詢facebook.github.io的時(shí)候貌嫡,實(shí)際上返回的是github.map.fastly.net的IP地址。這樣的好處是该溯,變更服務(wù)器IP地址的時(shí)候岛抄,只要修改github.map.fastly.net這個(gè)域名就可以了,用戶的facebook.github.io域名不用修改狈茉。

由于CNAME記錄就是一個(gè)替換夫椭,所以域名一旦設(shè)置CNAME記錄以后,就不能再設(shè)置其他記錄了(比如A記錄和MX記錄)论皆,這是為了防止產(chǎn)生沖突益楼。舉例來(lái)說(shuō)猾漫,foo.com指向bar.com,而兩個(gè)域名各有自己的MX記錄感凤,如果兩者不一致悯周,就會(huì)產(chǎn)生問(wèn)題。由于頂級(jí)域名通常要設(shè)置MX記錄陪竿,所以一般不允許用戶對(duì)頂級(jí)域名設(shè)置CNAME記錄禽翼。

PTR記錄用于從IP地址反查域名。dig命令的-x參數(shù)用于查詢PTR記錄族跛。

$ dig -x 192.30.252.153 ... ;; ANSWER SECTION: 153.252.30.192.in-addr.arpa. 3600 IN PTR pages.github.com. 上面結(jié)果顯示闰挡,192.30.252.153這臺(tái)服務(wù)器的域名是pages.github.com。 
image.gif

逆向查詢的一個(gè)應(yīng)用礁哄,是可以防止垃圾郵件长酗,即驗(yàn)證發(fā)送郵件的IP地址,是否真的有它所聲稱的域名桐绒。

dig命令可以查看指定的記錄類型夺脾。

$ dig a github.com $ dig ns github.com $ dig mx github.com 
image.gif

其他DNS工具

除了dig,還有一些其他小工具也可以使用茉继。

1咧叭、host 命令

host命令可以看作dig命令的簡(jiǎn)化版本,返回當(dāng)前請(qǐng)求域名的各種記錄烁竭。

$ host github.com github.com has address 192.30.252.121 github.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM. github.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM. github.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM. github.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM. github.com mail is handled by 1 ASPMX.L.GOOGLE.COM. $ host facebook.github.com facebook.github.com is an alias for github.map.fastly.net. github.map.fastly.net has address 103.245.222.133 
image.gif

host命令也可以用于逆向查詢菲茬,即從IP地址查詢域名,等同于dig -x 派撕。

$ host 192.30.252.153 153.252.30.192.in-addr.arpa domain name pointer pages.github.com. 
image.gif

2婉弹、nslookup 命令

nslookup命令用于互動(dòng)式地查詢域名記錄。

$ nslookup > facebook.github.io Server: 192.168.1.253 Address: 192.168.1.253#53 Non-authoritative answer: facebook.github.io canonical name = github.map.fastly.net. Name: github.map.fastly.net Address: 103.245.222.133 > 3腥刹、whois 命令 
image.gif

whois命令用來(lái)查看域名的注冊(cè)情況马胧。

$ whois github.com

看到這里還沒(méi)過(guò)癮,那么就來(lái)群里與更多的同學(xué)交流切磋技術(shù)衔峰,戳這里:咱們來(lái)一起抱團(tuán)取暖佩脊,好嗎?

qvarfz39px.jpeg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垫卤,一起剝皮案震驚了整個(gè)濱河市威彰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穴肘,老刑警劉巖歇盼,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異评抚,居然都是意外死亡豹缀,警方通過(guò)查閱死者的電腦和手機(jī)伯复,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邢笙,“玉大人啸如,你說(shuō)我怎么就攤上這事〉撸” “怎么了叮雳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妇汗。 經(jīng)常有香客問(wèn)我帘不,道長(zhǎng),這世上最難降的妖魔是什么杨箭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任寞焙,我火速辦了婚禮,結(jié)果婚禮上告唆,老公的妹妹穿的比我還像新娘棺弊。我一直安慰自己晶密,他們只是感情好擒悬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著稻艰,像睡著了一般懂牧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尊勿,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天僧凤,我揣著相機(jī)與錄音,去河邊找鬼元扔。 笑死躯保,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澎语。 我是一名探鬼主播途事,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼擅羞!你這毒婦竟也來(lái)了尸变?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤减俏,失蹤者是張志新(化名)和其女友劉穎召烂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娃承,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奏夫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年怕篷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酗昼。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匙头,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仔雷,到底是詐尸還是另有隱情蹂析,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布碟婆,位于F島的核電站电抚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏竖共。R本人自食惡果不足惜蝙叛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望公给。 院中可真熱鬧借帘,春花似錦、人聲如沸淌铐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腿准。三九已至际起,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吐葱,已是汗流浹背街望。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弟跑,地道東北人灾前。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像孟辑,于是被迫代替她去往敵國(guó)和親哎甲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354