作者 | 寫代碼的明哥
來源 | Python編程時(shí)光
頭圖 | CSDN付費(fèi)下載自視覺中國
在找工作面試的過程中,面試官非常喜歡考察基礎(chǔ)知識(shí),除了數(shù)據(jù)結(jié)構(gòu)與算法之外,網(wǎng)絡(luò)知識(shí)也是一個(gè)非常重要的考察對(duì)象。
而網(wǎng)絡(luò)知識(shí),通常是很抽象,不容易理解的,有很多同學(xué)就在這里裁了跟頭。為了更好地通過面試,本文講進(jìn)行一次網(wǎng)絡(luò)知識(shí)大掃盲,聊一聊網(wǎng)絡(luò)知識(shí)最基本的DNS。
DNS 是什么?
DNS是 Domain Name System 的縮寫,也就是 域名解析系統(tǒng),它的作用非常簡單,就是根據(jù)域名查出對(duì)應(yīng)的 IP地址。
你可以把它想象成一本巨大的電話本,比如當(dāng)你要訪問域名www.163.com,首先要通過DNS查出它的IP地址是112.48.162.8。
域名的層級(jí)
由于后面我會(huì)講到 DNS 的解析過程,因此需要你對(duì)域名的層級(jí)有一些了解
-
根域名 :.root 或者 . ,通常是省略的
-
頂級(jí)域名,如 .com,.cn 等
-
次級(jí)域名,如 baidu.com 里的 baidu,這個(gè)是用戶可以進(jìn)行注冊(cè)購買的
-
主機(jī)域名,比如 baike.baidu.com 里的baike,這個(gè)是用戶可分配的
主機(jī)名.次級(jí)域名.頂級(jí)域名.根域名
baike.baidu.com.root
DNS 解析過程
咱們以訪問 www.163.com 這個(gè)域名為例,來看一看當(dāng)你訪問 www.163.com 時(shí),會(huì)發(fā)生哪些事:
-
先查找本地 DNS 緩存(自己的電腦上),有則返回,沒有則進(jìn)入下一步
-
查看本地 hosts 文件有沒有相應(yīng)的映射記錄,有則返回,沒有則進(jìn)入下一步
-
向本地 DNS 服務(wù)器(一般都是你的網(wǎng)絡(luò)接入服務(wù)器商提供,比如中國電信,中國移動(dòng))發(fā)送請(qǐng)求進(jìn)行查詢,本地DNS服務(wù)器收到請(qǐng)求后,會(huì)先查下自己的緩存記錄,如果查到了直接返回就結(jié)束了,如果沒有查到,本地DNS服務(wù)器就會(huì)向DNS的根域名服務(wù)器發(fā)起查詢請(qǐng)求:請(qǐng)問老大, www.163.com 的ip是啥?
-
根域名服務(wù)器收到請(qǐng)求后,看到這是個(gè) .com 的域名,就回信說:這個(gè)域名是由 .com 老弟管理的,你去問他好了,這是.com老弟的聯(lián)系方式(ip1)。
-
本地 DNS 服務(wù)器接收到回信后,照著老大哥給的聯(lián)系方式(ip1),馬上給 .com 這個(gè)頂級(jí)域名服務(wù)器發(fā)起請(qǐng)求:請(qǐng)問 .com 大大,www.163.com 的ip 是啥?
-
.com 頂級(jí)域名服務(wù)器接收到請(qǐng)求后,看到這是 163.com 的域名,就回信說:這個(gè)域名是 .163.com 老弟管理的,你就去問他就行了,這是他的聯(lián)系方式(ip2)
-
本地 DNS 服務(wù)器接收到回信后,按照前輩的指引(ip2),又向 .163.com 這個(gè)權(quán)威域名服務(wù)器發(fā)起請(qǐng)求:請(qǐng)問 163.com 大大,請(qǐng)問 www.163.com 的ip是啥?
-
163.com 權(quán)威域名服務(wù)器接收到請(qǐng)求后,確認(rèn)了是自己管理的域名,馬上查了下自己的小本本,把 www.163.com 的ip告訴了 本地DNS服務(wù)器。
-
本地DNS服務(wù)器接收到回信后,非常地開心,這下總算拿到了www.163.com的ip了,馬上把這個(gè)消息告訴了要求查詢的客戶(就是你的電腦)。由于這個(gè)過程比較漫長,本地DNS服務(wù)器為了節(jié)省時(shí)間,也為了盡量不去打擾各位老大哥,就把這個(gè)查詢結(jié)果偷偷地記在了自己的小本本上,方便下次有人來查詢時(shí),可以快速回應(yīng)。
總結(jié)起來就是三句話:
-
從"根域名服務(wù)器"查到"頂級(jí)域名服務(wù)器"的NS記錄和A記錄(IP地址)
-
從"頂級(jí)域名服務(wù)器"查到"次級(jí)域名服務(wù)器"的NS記錄和A記錄(IP地址)
-
從"次級(jí)域名服務(wù)器"查出"主機(jī)名"的IP地址
DNS的緩存時(shí)間
上面的幾個(gè)步驟里,可以看到有兩個(gè)地方會(huì)緩存 DNS 的查詢記錄,有了緩存,在一定程度上會(huì)提高查詢效率,但同時(shí)在準(zhǔn)確率上會(huì)有所損失。
因此我們?cè)谂渲?DNS 解析的時(shí)候,會(huì)有一個(gè) TTL 參數(shù)(Time To Live),意思就是這個(gè)緩存可以存活多長時(shí)間,過了這個(gè)時(shí)間,本地 DNS 就會(huì)刪除這條記錄,刪除了緩存后,你再訪問,就要重新走一遍上面的流程,獲取最新的地址。
DNS 的記錄類型
當(dāng)我們?cè)诎⒗镌瀑I了一個(gè)域名后,可以配置我們主機(jī)域名解析規(guī)則,也就是 記錄。
阿里云 域名云解析
常見的 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),詳見下文。
-
PTR:逆向查詢記錄(Pointer Record),只用于從IP地址查詢域名,詳見下文。
DNS 報(bào)文結(jié)構(gòu)
后面我將使用 wireshark 抓取 DNS 的數(shù)據(jù)包,但是在開始之前 ,得先了解一下 DNS 的報(bào)文結(jié)構(gòu)
-
事務(wù) ID:DNS 報(bào)文的 ID 標(biāo)識(shí)。對(duì)于請(qǐng)求報(bào)文和其對(duì)應(yīng)的應(yīng)答報(bào)文,該字段的值是相同的。通過它可以區(qū)分 DNS 應(yīng)答報(bào)文是對(duì)哪個(gè)請(qǐng)求進(jìn)行響應(yīng)的。
-
標(biāo)志:DNS 報(bào)文中的標(biāo)志字段。
-
問題計(jì)數(shù):DNS 查詢請(qǐng)求的數(shù)目。
-
回答資源記錄數(shù):DNS 響應(yīng)的數(shù)目。
-
權(quán)威名稱服務(wù)器計(jì)數(shù):權(quán)威名稱服務(wù)器的數(shù)目。
-
附加資源記錄數(shù):額外的記錄數(shù)目(權(quán)威名稱服務(wù)器對(duì)應(yīng) IP 地址的數(shù)目)。
Wireshark抓包實(shí)戰(zhàn)
打開 Wireshark 后,使用 ping 163.com 來發(fā)起 DNS 解析請(qǐng)求,使用 DNS 關(guān)鍵字在Wireshark 過濾。
從抓取的報(bào)文整體來看,我們可以粗略獲取幾個(gè)信息
-
DNS 是應(yīng)用層協(xié)議,傳輸層協(xié)議使用的是 UDP
-
DNS 默認(rèn)端口是 53
請(qǐng)求和應(yīng)答的報(bào)文的截圖我放在了下面,接下來我將逐個(gè)分析。
請(qǐng)求
應(yīng)答
Transaction ID
請(qǐng)求和應(yīng)答的事務(wù)ID應(yīng)當(dāng)是一個(gè):0xd0d7
Flags
標(biāo)志字段里的內(nèi)容比較多,每個(gè)字段的含義如下:
-
QR(Response):查詢請(qǐng)求/響應(yīng)的標(biāo)志信息。查詢請(qǐng)求時(shí),值為 0;響應(yīng)時(shí),值為 1。
-
Opcode:操作碼。其中,0 表示標(biāo)準(zhǔn)查詢;1 表示反向查詢;2 表示服務(wù)器狀態(tài)請(qǐng)求。
-
AA(Authoritative):授權(quán)應(yīng)答,該字段在響應(yīng)報(bào)文中有效。值為 1 時(shí),表示名稱服務(wù)器是權(quán)威服務(wù)器;值為 0 時(shí),表示不是權(quán)威服務(wù)器。
-
TC(Truncated):表示是否被截?cái)唷V禐?1 時(shí),表示響應(yīng)已超過 512 字節(jié)并已被截?cái)啵环祷厍?512 個(gè)字節(jié)。
-
RD(Recursion Desired):期望遞歸。該字段能在一個(gè)查詢中設(shè)置,并在響應(yīng)中返回。該標(biāo)志告訴名稱服務(wù)器必須處理這個(gè)查詢,這種方式被稱為一個(gè)遞歸查詢。如果該位為 0,且被請(qǐng)求的名稱服務(wù)器沒有一個(gè)授權(quán)回答,它將返回一個(gè)能解答該查詢的其他名稱服務(wù)器列表。這種方式被稱為迭代查詢。
-
RA(Recursion Available):可用遞歸。該字段只出現(xiàn)在響應(yīng)報(bào)文中。當(dāng)值為 1 時(shí),表示服務(wù)器支持遞歸查詢。
-
Z:保留字段,在所有的請(qǐng)求和應(yīng)答報(bào)文中,它的值必須為 0。
-
rcode(Reply code):返回碼字段,表示響應(yīng)的差錯(cuò)狀態(tài)。當(dāng)值為 0 時(shí),表示沒有錯(cuò)誤;當(dāng)值為 1 時(shí),表示報(bào)文格式錯(cuò)誤(Format error),服務(wù)器不能理解請(qǐng)求的報(bào)文;當(dāng)值為 2 時(shí),表示域名服務(wù)器失敗(Server failure),因?yàn)榉?wù)器的原因?qū)е聸]辦法處理這個(gè)請(qǐng)求;當(dāng)值為 3 時(shí),表示名字錯(cuò)誤(Name Error),只有對(duì)授權(quán)域名解析服務(wù)器有意義,指出解析的域名不存在;當(dāng)值為 4 時(shí),表示查詢類型不支持(Not Implemented),即域名服務(wù)器不支持查詢類型;當(dāng)值為 5 時(shí),表示拒絕(Refused),一般是服務(wù)器由于設(shè)置的策略拒絕給出應(yīng)答,如服務(wù)器不希望對(duì)某些請(qǐng)求者給出應(yīng)答。
Answer RRs
回答資源記錄數(shù),在應(yīng)答包里為 2,說明返回了兩條查詢結(jié)果,你可以在 Answer 字段里看到。
Authority RRs
權(quán)威名稱服務(wù)器計(jì)數(shù)
Additionnal RRs
附加資源記錄數(shù)
Answers
應(yīng)答的主要內(nèi)容,這里返回兩條結(jié)果,每條結(jié)果里的字段有
DNS 劫持 與 HTTP 劫持
通過上面的講解,我們都知道了,DNS 完成了一次域名到 IP 的映射查詢,當(dāng)你在訪問 www.baidu.com 時(shí),能正確返回給你 百度首頁的 ip。
但如果此時(shí) DNS 解析出現(xiàn)了一些問題,當(dāng)你想要訪問 www.baidu.com 時(shí),卻返回給你 www.google.com 的ip,這就是我們常說的 DNS 劫持。
與之容易混淆的有 HTTP 劫持。
那什么是 HTTP 劫持呢?
你一定見過當(dāng)你在訪問 某個(gè)網(wǎng)站時(shí),右下角也突然彈出了一個(gè)扎眼的廣告彈窗。這就是 HTTP 劫持。
借助別人文章里的例子,它們倆的區(qū)別就好比是
-
DNS劫持是你想去機(jī)場(chǎng)的時(shí)候,把你給丟到火車站。
-
HTTP劫持是你去機(jī)場(chǎng)途中,有人給你塞小廣告。
那么 DNS劫持 是如何產(chǎn)生的呢?
下面大概說幾種DNS劫持方法:
1.本機(jī)DNS劫持
攻擊者通過某些手段使用戶的計(jì)算機(jī)感染上木馬病毒,或者惡意軟件之后,惡意修改本地DNS配置,比如修改本地hosts文件,緩存等。
2. 路由DNS劫持
很多用戶默認(rèn)路由器的默認(rèn)密碼,攻擊者可以侵入到路由管理員賬號(hào)中,修改路由器的默認(rèn)配置。
3.攻擊DNS服務(wù)器
直接攻擊DNS服務(wù)器,例如對(duì)DNS服務(wù)器進(jìn)行DDoS攻擊,可以是DNS服務(wù)器宕機(jī),出現(xiàn)異常請(qǐng)求,還可以利用某些手段感染dns服務(wù)器的緩存,使給用戶返回來的是惡意的ip地址。
工具的使用
dig 命令
dig是一個(gè)在類Unix命令行模式下查詢DNS包括NS記錄,A記錄,MX記錄等相關(guān)信息的工具。
通過 dig (參數(shù):+trace)命令,我們可以看到上面描述的 DNS 解析的詳細(xì)過程
從返回的結(jié)果,我們可以看得出幾點(diǎn)信息:
-
我們的本地 DNS 服務(wù)器 ip 為 192.168.1.1,端口為53,你可以在 /etc/resolv.conf 里看到這個(gè)配置
-
根域名服務(wù)器目前全球一共只有十三臺(tái),從a.root-servers.net. 到m.root-servers.net. ,它們對(duì)應(yīng)的ip地址,已經(jīng)內(nèi)置在本地DNS服務(wù)器中。
如果你只想看到結(jié)果,可以使用 +short 參數(shù),可以直接返回 www.163.com 對(duì)應(yīng)著哪幾個(gè)ip。
你也可以加個(gè) @ 參數(shù) ,指定從某個(gè) DNS 服務(wù)器進(jìn)行查詢。
如果你只想查看指定的記錄類型:
host 命令
host 命令 可以看作dig命令的簡化版本,返回當(dāng)前請(qǐng)求域名的各種記錄。
whois命令
whois命令用來查看域名的注冊(cè)情況。
nslookup命令
nslookup也是常用的一個(gè)查詢 DNS 解析結(jié)果的工具
你也可以指定公網(wǎng)的域名服務(wù)器進(jìn)行查詢,比如常見的 114.114.114.114。
手動(dòng)清理本地緩存
macOS
$ sudo dscacheutil -flushcache
$ sudo killall -HUP mDNSResponder
windows
$ ipconfig /flushdns
linux
# 使用NSCD的DNS緩存
$ sudo /etc/init.d/nscd restart
# 服務(wù)器或者路由器使用DNSMASQ
$ sudo dnsmasq restart