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