網(wǎng)上有很多文章講解DNS原理赐劣,很多寫的很不錯(cuò),但是有些太過宏觀哩都,有些又過于細(xì)節(jié)魁兼。但作為一個(gè)碼農(nóng),不想止于宏觀概念漠嵌,又不想深陷實(shí)現(xiàn)細(xì)節(jié)咐汞,就想知道DNS通訊的過程盖呼。。化撕。如果你也是一樣的想法几晤,你就來對了地方。
DNS通訊過程概要
首先請看一個(gè)典型的DNS通訊示意圖(以訪問www.qq.com為例)
名詞解釋
user process:請求通過名稱得到IP地址訪問網(wǎng)絡(luò)的用戶程序惨撇,例如IE伊脓。
DNS Resolver:接受DNS查詢,代理用戶進(jìn)程獲取域名對應(yīng)的IP地址魁衙”ㄇ唬可以作為單獨(dú)進(jìn)程,也可作為用戶進(jìn)程的一部分剖淀。根據(jù)功能不同纯蛾,又可分為Stub Server和Full-Service Resolver.
Stub Resolver:接受DNS查詢,有緩存功能的纵隔,先在緩存查找翻诉,若命中直接返回,若沒有命中捌刮,直接轉(zhuǎn)發(fā)查詢請求到Full-Service Resolver碰煌。如果沒有緩存功能,就直接轉(zhuǎn)發(fā)請求绅作。Full-Service Resolver的地址是直接配置的芦圾。如下圖
Full-Service Resolver:接受DNS查詢夜焦,先在緩存查找,若命中直接返回岂贩,若沒有命中茫经,就開始遞歸查詢Authority Name Server(權(quán)威名稱服務(wù)器),直到查詢到目標(biāo)地址或者超時(shí),并且緩存查詢結(jié)果。遞歸查詢(Recursive Query)的起點(diǎn)根服務(wù)器(13臺)的IP地址卸伞,是提前配置在服務(wù)器上褥紫。另外,還可以作為本地網(wǎng)絡(luò)的權(quán)威名稱服務(wù)器瞪慧,自定義內(nèi)部網(wǎng)絡(luò)的名稱和IP映射髓考。
Authority Name Server:接受DNS查詢,如果存在查詢請求的答案則直接返回答案弃酌;如果是子域名查詢氨菇,則返回子域名名稱服務(wù)器地址;否則妓湘,直接拒絕查蓉。
驗(yàn)證一下
準(zhǔn)備工作
首先在Ubuntu上安裝bind9(bind9是功能全面的DNS服務(wù)器,通過配置可以作為Full-Service Resolver或者Authority Name Server)榜贴。
安裝命令如下:
sudo apt install bind9
更改配置
sudo vi /etc/bind/named.conf.options
作為Full-Service Resolver
配置文件如下
options {
forwarders {
8.8.8.8;//如果沒有命中緩存豌研,則轉(zhuǎn)發(fā)查詢請求到8.8.8.8,那么8.8.8.8充當(dāng)Full-Service Resolver(由此可知DNS查詢可以轉(zhuǎn)發(fā)請求唬党,形成查詢處理鏈)鹃共。如果沒有配置轉(zhuǎn)發(fā),開始遞歸查詢驶拱,如示意圖所示霜浴。
};
dnssec-validation no;
auth-nxdomain no;? ? # conform to RFC1035
recursion yes;//允許遞歸查詢,否則只能充當(dāng)權(quán)威名稱服務(wù)器蓝纲,而權(quán)威名稱服務(wù)器只返回自己管轄范圍的主機(jī)或者子域名查詢請求阴孟,其他直接拒絕。
};
啟動bind9
sudo systemctl start bind9
驗(yàn)證是否啟動成功
sudo systemctl status bind9
在windows(192.168.2.100)上税迷,安裝wireshark(免費(fèi)永丝,去baidu找一下),并啟動監(jiān)聽箭养。
在Ubuntu(192.168.2.106)上慕嚷,輸入下列命令,啟動DNS通訊監(jiān)控
sudo tcpdump -li any 'udp port 53'
在windows命令行輸入
nslookup - 192.168.2.106
為了簡化通訊露懒,接著輸入
set retry=1
set type=A
開始查詢闯冷,接著輸入
www.qq.com
wireshark在windows上監(jiān)控如下
Ubuntu監(jiān)控如下
在windows上再次輸入
www.qq.com
Ubuntu上監(jiān)控如下
作為權(quán)威名稱服務(wù)器
更改配置文件如下
sudo vi /etc/bind/named.conf.options
options {
forwarders {
8.8.8.8;//recursion no的情況下轉(zhuǎn)發(fā)無效
};
dnssec-validation no;
auth-nxdomain no;? ? # conform to RFC1035
recursion no;
};
編輯本地zone文件
sudo vi /etc/bind/named.conf.local
添加以下內(nèi)容
zone "my.net" IN {
type master;
file "/etc/bind/db.mynet";
};
添加mynet的配置文件
sudo vi /etc/bind/db.mynet
$TTL 7200
@ IN SOA ns admin (
2017060909
3600
900
604800
86400
)
@? ? ? ? ? ? IN NS ns
ns IN A? 10.100.99.195
dav IN A 10.100.99.195
www IN A 10.100.99.195
simon IN A? 10.100.99.221
重啟bind9
sudo systemctl restart bind9
sudo systemctl status bind9
在windows上輸入以下命令
nslookup - 192.168.2.106
set retry=1
set type=A
www.qq.com
wireshark監(jiān)控如下
Ubuntu監(jiān)控如下
作為Full-Service Resolver抠忘,但不設(shè)置轉(zhuǎn)發(fā)的情形
沒有做撩炊。。崎脉。
還有更多的pattern拧咳,請各位自己去試驗(yàn)啦。
總結(jié)
通過搭建DNS服務(wù)器以及包監(jiān)控工具囚灼,驗(yàn)證了本文開始部分的DNS通訊示意圖骆膝。實(shí)際的DNS通訊遠(yuǎn)比上述復(fù)雜。特別是DNS是明文通訊灶体,為了確保DNS通訊安全阅签,防止攔截,劫持蝎抽,釣魚政钟,DNS通訊規(guī)范引入DNSSEC,一種類似數(shù)字簽名的技術(shù)來確保DNS通訊安全樟结。有興趣的讀者养交,可以繼續(xù)調(diào)查。
參考