第一篇:DNS服務(wù)器實(shí)驗(yàn)報(bào)告
網(wǎng) 絡(luò) 工 程 實(shí) 驗(yàn)
實(shí)驗(yàn)名稱:DNS服務(wù)(系統(tǒng)自帶)
班級(jí):計(jì)科一班
組長(zhǎng):李柯穎(41112045)
組員:馬曉賢(41112033)馬彬(41112036)
劉永軍(41112012)高富雷(41112003)
張明東(41112016)
前 言
一、DNS服務(wù)器的概念
它是由解析器以及域名服務(wù)器組成的。域名服務(wù)器是指保存有該網(wǎng)絡(luò)中所有主機(jī)的域名和對(duì)應(yīng)IP地址,并具有將域名轉(zhuǎn)換為IP地址功能的服務(wù)器。DNS使用TCP與UDP端口號(hào)都是53,主要使用UDP,服務(wù)器之間備份使用TCP。
DNS最早于1983年由保羅·莫卡派喬斯(Paul Mockapetris)發(fā)明;原始的技術(shù)規(guī)范在882號(hào)因特網(wǎng)標(biāo)準(zhǔn)草案(RFC 882)中發(fā)布。1987年發(fā)布的第1034和1035號(hào)草案修正了DNS技術(shù)規(guī)范,并廢除了之前的第882和883號(hào)草案。在此之后對(duì)因特網(wǎng)標(biāo)準(zhǔn)草案的修改基本上沒(méi)有涉及到DNS技術(shù)規(guī)范部分的改動(dòng)。
域名結(jié)構(gòu)
通常 Internet 主機(jī)域名的一般結(jié)構(gòu)為:主機(jī)名.三級(jí)域名.二級(jí)域名.頂級(jí)域名。Internet 的頂級(jí)域名由 Internet網(wǎng)絡(luò)協(xié)會(huì)域名注冊(cè)查詢負(fù)責(zé)網(wǎng)絡(luò)地址分配的委員會(huì)進(jìn)行登記和管理,它還為 Internet的每一臺(tái)主機(jī)分配唯一的 IP 地址。全世界現(xiàn)有三個(gè)大的網(wǎng)絡(luò)信息中心: 位于美國(guó)的 Inter-NIC,負(fù)責(zé)美國(guó)及其他地區(qū); 位于荷蘭的RIPE-NIC,負(fù)責(zé)歐洲地區(qū);位于日本的APNIC,負(fù)責(zé)亞太地區(qū)。
解析器
解析器,或另一臺(tái)DNS服務(wù)器遞歸代表的情況下,域名解析器,協(xié)商使用遞歸服務(wù),使用查詢頭位。
解析通常需要遍歷多個(gè)名稱服務(wù)器,找到所需要的信息。然而,一些解析器的功能更簡(jiǎn)單地只用一個(gè)名稱服務(wù)器進(jìn)行通信。這些簡(jiǎn)單的解析器依賴于一個(gè)遞歸名稱服務(wù)器(稱為“存根解析器”),為他們尋找信息的執(zhí)行工作。
服務(wù)器
提供DNS服務(wù)的是安裝了DNS服務(wù)器端軟件的計(jì)算機(jī)。服務(wù)器端軟件既可以是基于類linux操作系統(tǒng),也可以是基于Windows操作系統(tǒng)的。裝好DNS服務(wù)器軟件后,您就可以在您指定的位置創(chuàng)建區(qū)域文件了,所謂區(qū)域文件就是包含了此域中名字到IP地址解析記錄的一個(gè)文件,如文件的內(nèi)容可能是這樣的:primary name server = dns2(主服務(wù)器的主機(jī)名是)
serial = 2913(序列號(hào)=2913、這個(gè)序列號(hào)的作用是當(dāng)輔域名服務(wù)器來(lái)復(fù)制這個(gè)文件的時(shí)候,如果號(hào)碼增加了就復(fù)制)
refresh = 10800(3 hours)(刷新=10800秒、輔域名服務(wù)器每隔3小時(shí)查詢一個(gè)主服務(wù)器)
retry = 3600(1 hour)(重試=3600秒、當(dāng)輔域名服務(wù)試圖在主服務(wù)器上查詢更新時(shí),而連接失敗了,輔域名服務(wù)器每隔1小時(shí)訪問(wèn)主域名服務(wù)器)
expire = 604800(7 days)(到期=604800秒、輔域名服務(wù)器在向主服務(wù)更新失敗后,7天后刪除中的記錄。)
default TTL = 3600(1 hour)(默認(rèn)生存時(shí)間=3600秒、緩存服務(wù)器保存記錄的時(shí)間是1小時(shí)。也就是告訴緩存服務(wù)器保存域的解析記錄為1小時(shí))
二、設(shè)置類別
您可以把DNS服務(wù)器配置成以下3類之一: 1.主DNS服務(wù)器。2.輔DNS服務(wù)器。3.緩存DNS服務(wù)器。
三、DNS服務(wù)器的工作原理大致如下:
1、用戶在瀏覽器里輸入域名,例如www.tmdps.cn,這個(gè)郵件地址只能表明收郵件人在msserver.com.cn域上擁有一個(gè)賬戶。可是僅僅知道這些并不夠,因?yàn)殡娮余]件程序并不知道該域的郵件服務(wù)器地址,因此不能將這封郵件發(fā)送到目的地。而MX記錄就是專門為電子郵件程序指路的,在DNS服務(wù)器中添加MX記錄后電子郵件程序就能知道郵件服務(wù)器的具體位置(即IP地址)了。在主DNS服務(wù)器中添加MX記錄的操作步驟如下所述:
步驟:1 在DNS控制臺(tái)窗口中首先添加一個(gè)主機(jī)名為mail的主機(jī)記錄,并將域名mail.msserver.com.cn映射到提供郵件服務(wù)的計(jì)算機(jī)IP地址上。2 在“正向查找區(qū)域”目錄中右鍵單擊準(zhǔn)備添加MX郵件交換記錄的域名,選擇“新建郵件交換器(MX)”命令,如圖所示。
1.2.3
打開(kāi)“新建資源記錄”對(duì)話框,在“郵件服務(wù)器的完全合格的域名(FQDN)”編輯框中輸入事先添加的郵件服務(wù)器的主機(jī)域名(如mail.msserver.com.cn)。或單擊“瀏覽”按鈕,在打開(kāi)的“瀏覽”對(duì)話框中找到并選擇作為郵件服務(wù)器的主機(jī)名稱(如mail),如圖所示。
3.4 返回“新建資源記錄”對(duì)話框,當(dāng)該區(qū)域中有多個(gè)MX記錄(即有多個(gè)郵件服務(wù)器)時(shí),則需要在“郵件服務(wù)器優(yōu)先級(jí)”編輯框中輸入數(shù)值來(lái)確定其優(yōu)先級(jí)。通過(guò)設(shè)置優(yōu)先級(jí)數(shù)字來(lái)指明首選服務(wù)器,數(shù)字越小表示優(yōu)先級(jí)越高。最后單擊“確定”按鈕使設(shè)置生效,如圖所示。小提示:一般情況下“主機(jī)或子域”編輯框中應(yīng)該保持為空,這樣才能得到諸如user@msserver.com.cn之類的信箱地址。如果在“主機(jī)或子域”編輯框中輸入內(nèi)容(如mail),則信箱名將會(huì)成為user@mail.msserver.com.cn5 重復(fù)上述步驟可以添加多個(gè)MX記錄,并且需要在“郵件服務(wù)器優(yōu)先級(jí)”編輯框中分別設(shè)置其優(yōu)先級(jí)。
實(shí)驗(yàn)六 給DNS服務(wù)器做個(gè)快速體檢
你的內(nèi)網(wǎng)DNS服務(wù)器工作狀態(tài)正常嗎?大家常用的測(cè)試方法是查看內(nèi)網(wǎng)用戶是否能使用域名瀏覽網(wǎng)站,但這種測(cè)試方法并不全面和科學(xué)。其實(shí)最簡(jiǎn)單和便捷的方式是使用nslookup+Ping命令的組合方式,通過(guò)簡(jiǎn)單的兩步就能給本地企業(yè)網(wǎng)中的DNS服務(wù)器做個(gè)快速“體檢”。
步驟:
第一步:首先使用nslookup命令來(lái)測(cè)試本企業(yè)網(wǎng)的DNS服務(wù)器,查看它是否能正常將域名解析成IP地址。這里以www.tmdps.cn”
第六步:設(shè)置完畢后我們?cè)L問(wèn)www.tmdps.cn時(shí)就會(huì)自動(dòng)根據(jù)是在內(nèi)網(wǎng)還是外網(wǎng)來(lái)解析了。
命令提示符輸入netsh winsock reset重啟電腦
實(shí)驗(yàn)九 快速刪除電腦IPv6 DNS地址
隨著IPv6地址使用范圍的越來(lái)越廣,在電腦上進(jìn)行IPv6 DNS地址的配置和刪除也是常有的事,下面就介紹一種快速刪除電腦IPv6 DNS地址的方法:
步驟:
1.1 在Win 7的“開(kāi)始”中打開(kāi)“運(yùn)行”對(duì)話框,并在其中運(yùn)行“cmd”命令,點(diǎn)擊“確定”按鈕。
2.2 在“CMD”命令行中執(zhí)行命令“ipconfig/all”,查看電腦網(wǎng)卡上配置的ipv6 DNS地址。
執(zhí)行完上面的命令后就能看到電腦網(wǎng)卡的IPv6 DNS地址配置情況,如下圖。
3.4 然后在“CMD”命令行中執(zhí)行命令“netsh interface ipv6 delete dnsservers “本地連接”2001:dn8:8000:1:202:120:2:101”,就可以把電腦網(wǎng)卡上的ipv6 DNS地址刪除掉。
注意事項(xiàng)
刪除電腦IPv6 DNS地址的命令格式,必須按要求輸入,不能有任何的差錯(cuò),否則不能正確執(zhí)行。
實(shí)驗(yàn)十 怎樣讓別人無(wú)法修改DNS的內(nèi)容
DNS設(shè)置在TCP/IP中,我們可以通過(guò)禁用TCP/IP來(lái)實(shí)現(xiàn)。
1.1 首先點(diǎn)擊“開(kāi)始”菜單,點(diǎn)擊運(yùn)行。2 在打開(kāi)的運(yùn)行框中輸入gpedit.msc,按確定。
2.3 依次展開(kāi)“用戶配置管理模板網(wǎng)絡(luò)網(wǎng)絡(luò)連接”4 在右側(cè)窗口中找到“禁用TCP/IP高級(jí)配置”。
3.5 雙擊打開(kāi)將“已啟用”選中,確定。
然后再?gòu)?qiáng)制執(zhí)行組策略即可生效。
保護(hù)DNS服務(wù)器的幾種方法
DNS軟件是黑客熱衷攻擊的目標(biāo),它可能帶來(lái)安全問(wèn)題。下面是保護(hù)DNS服務(wù)器的幾種方法。
禁用區(qū)域傳輸
區(qū)域傳輸發(fā)生在主DNS服務(wù)器和從DNS服務(wù)器之間。主DNS服務(wù)器授權(quán)特定域名,并且?guī)в锌筛膶懙腄NS區(qū)域文件,在需要的時(shí)候可以對(duì)該文件進(jìn)行更新。從DNS服務(wù)器從主力DNS服務(wù)器接收這些區(qū)域文件的只讀拷貝。從DNS服務(wù)器被用于提高來(lái)自內(nèi)部或者互聯(lián)網(wǎng)DNS查詢響應(yīng)性能。
然而,區(qū)域傳輸并不僅僅針對(duì)從DNS服務(wù)器。任何一個(gè)能夠發(fā)出DNS查詢請(qǐng)求的人都可能引起DNS服務(wù)器配置改變,允許區(qū)域傳輸傾倒自己的區(qū)域數(shù)據(jù)庫(kù)文件。惡意用戶可以使用這些信息來(lái)偵察你組織內(nèi)部的命名計(jì)劃,并攻擊關(guān)鍵服務(wù)架構(gòu)。你可以配置你的DNS服務(wù)器,禁止區(qū)域傳輸請(qǐng)求,或者僅允許針對(duì)組織內(nèi)特定服務(wù)器進(jìn)行區(qū)域傳輸,以此來(lái)進(jìn)行安全防范。
使DNS只用安全連接
很多DNS服務(wù)器接受動(dòng)態(tài)更新。動(dòng)態(tài)更新特性使這些DNS服務(wù)器能記錄使用DHCP的主機(jī)的主機(jī)名和IP地址。DDNS能夠極大地減
輕DNS管理員的管理費(fèi)用,否則管理員必須手工配置這些主機(jī)的DNS資源記錄。
然而,如果未檢測(cè)的DDNS更新,可能會(huì)帶來(lái)很嚴(yán)重的安全問(wèn)題。一個(gè)惡意用戶可以配置主機(jī)成為臺(tái)文件服務(wù)器、Web服務(wù)器或者數(shù)據(jù)庫(kù)服務(wù)器動(dòng)態(tài)更新的DNS主機(jī)記錄,如果有人想連接到這些服務(wù)器就一定會(huì)被轉(zhuǎn)移到其他的機(jī)器上。
你可以減少惡意DNS升級(jí)的風(fēng)險(xiǎn),通過(guò)要求安全連接到DNS服務(wù)器執(zhí)行動(dòng)態(tài)升級(jí)。這很容易做到,你只要配置你的DNS服務(wù)器使用活動(dòng)目錄綜合區(qū)(ActiveDirectoryIntegratedZones)并要求安全動(dòng)態(tài)升級(jí)就可以實(shí)現(xiàn)。這樣一來(lái),所有的域成員都能夠安全地、動(dòng)態(tài)更新他們的DNS信息。
使用防火墻來(lái)控制DNS訪問(wèn)
防火墻可以用來(lái)控制誰(shuí)可以連接到你的DNS服務(wù)器上。對(duì)于那些僅僅響應(yīng)內(nèi)部用戶查詢請(qǐng)求的DNS服務(wù)器,應(yīng)該設(shè)置防火墻的配置,阻止外部主機(jī)連接這些DNS服務(wù)器。對(duì)于用做只緩存轉(zhuǎn)發(fā)器的DNS服務(wù)器,應(yīng)該設(shè)置防火墻的配置,僅僅允許那些使用只緩存轉(zhuǎn)發(fā)器的DNS服務(wù)器發(fā)來(lái)的查詢請(qǐng)求。防火墻策略設(shè)置的重要一點(diǎn)是阻止內(nèi)部用戶使用DNS協(xié)議連接外部DNS服務(wù)器。
在DNS注冊(cè)表中建立訪問(wèn)控制
在基于Windows的DNS服務(wù)器中,你應(yīng)該在DNS服務(wù)器相關(guān)的注冊(cè)表中設(shè)置訪問(wèn)控制,這樣只有那些需要訪問(wèn)的帳戶才能夠閱讀或修改這些注冊(cè)表設(shè)置。
HKLMCurrentControlSetServicesDNS鍵應(yīng)該僅僅允許管理員和系統(tǒng)帳戶訪問(wèn),這些帳戶應(yīng)該擁有完全控制權(quán)限。在DNS文件系統(tǒng)入口設(shè)置訪問(wèn)控制
在基于Windows的DNS服務(wù)器中,你應(yīng)該在DNS服務(wù)器相關(guān)的文件系統(tǒng)入口設(shè)置訪問(wèn)控制,這樣只有需要訪問(wèn)的帳戶才能夠閱讀或修改這些文件。
%system_directory%DNS文件夾及子文件夾應(yīng)該僅僅允許系統(tǒng)帳戶訪問(wèn),系統(tǒng)帳戶應(yīng)該擁有完全控制權(quán)限。實(shí)驗(yàn)十一 在windows07 查看DNS服務(wù)器屬性
步驟:
打開(kāi)“控制面板”里的“管理工具”
點(diǎn)擊“服務(wù)”,下拉列表框,找到“DNS client”
雙擊“DNS client”
可對(duì)其屬性查看,或進(jìn)行修改。
第二篇:DNS實(shí)驗(yàn)報(bào)告
DNS實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)環(huán)境:兩臺(tái)2003服務(wù)器。一臺(tái)xp客戶端 實(shí)驗(yàn)?zāi)康模涸趚p客戶端上可以正向反向拼通ip和域名 實(shí)驗(yàn)步驟:
第一步:在控制面板中添加DNS服務(wù)器,然后打開(kāi)正向查找區(qū)域
做輔助服務(wù)器的時(shí)候區(qū)域名稱必須和主機(jī)保持一致,下一步:在主機(jī)上把DNS服務(wù)器改成本地回環(huán)
然后在客戶端上把DNS改成主服務(wù)器的IP
然后用命令拼通,nslookup sjk.axl.com可以得到服務(wù)器的ip,用nslookup同樣也可以
反向和這個(gè)同理
第三篇:計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì) DNS 服務(wù)器 實(shí)驗(yàn)報(bào)告
DNS中繼服務(wù)器實(shí)驗(yàn)報(bào)告
07415
林珅(13)
071401 07415
劉磊(18)
071406 07415
李鴻(19)
071407
一、系統(tǒng)概述
1)運(yùn)行環(huán)境:windows XP
2)編譯:
Microsoft visual C++ 6.0 3)使用方法:
a)使用ipconfig/all,記下當(dāng)前DNS服務(wù)器,例如為211.68.71.4 b)使用下頁(yè)的配置界面,將DNS設(shè)置為127.0.0.1(本地主機(jī))c)運(yùn)行你的dnsrelay程序(在你的程序中把外部dns服務(wù)器設(shè)為前面記下的211.68.71.4)d)正常使用ping,ftp,IE等,名字解析工作正常
二、系統(tǒng)的功能設(shè)計(jì)
設(shè)計(jì)一個(gè)DNS服務(wù)器程序,讀入“域名-IP地址”對(duì)照表,當(dāng)客戶端查詢域名對(duì)應(yīng)的IP地址時(shí),用域名檢索該對(duì)照表,三種檢索結(jié)果:
1)檢索結(jié)果為ip地址0.0.0.0,則向客戶端返回“域名不存在”的報(bào)錯(cuò)消息(不良網(wǎng)站攔截功能)
2)檢索結(jié)果為普通IP地址,則向客戶返回這個(gè)地址(服務(wù)器功能)
3)表中未檢到該域名,則向因特網(wǎng)DNS服務(wù)器發(fā)出查詢,并將結(jié)果返給客戶端(中繼功能)
? 考慮多個(gè)計(jì)算機(jī)上的客戶端會(huì)同時(shí)查詢,需要進(jìn)行消息ID的轉(zhuǎn)換
三、模塊劃分
DNS服務(wù)器主模塊包含三個(gè)子模塊,分別如下:
1)命令行參數(shù)處理模塊:該模塊用來(lái)處理通過(guò)命令行提示符來(lái)啟動(dòng)這個(gè)DNS服務(wù)器時(shí)所輸入的命令行參數(shù),管理員通過(guò)設(shè)置不同的參數(shù)可以使DNS服務(wù)器顯示不同程度的提示和調(diào)試信息。所以這模塊主要是依照輸入的參數(shù)設(shè)置標(biāo)志數(shù)據(jù),以控制最后的各種信息的輸出。
2)本地解析模塊:本模塊是在本DNS服務(wù)器本地保存的曾經(jīng)解析過(guò)的或者需要屏蔽額域名和其對(duì)應(yīng)IP信息文件中查找從應(yīng)用程序來(lái)的請(qǐng)求解析的域名,在這個(gè)文件中查到需要的域名后取出對(duì)應(yīng)的IP地址,并構(gòu)造DNS應(yīng)答數(shù)據(jù)包返回給發(fā)送此DNS域名解析請(qǐng)求的應(yīng)用程序。
3)外部DNS服務(wù)器解析模塊:當(dāng)本地解析失敗時(shí),本DNS服務(wù)器會(huì)調(diào)用外部DNS服務(wù)器解析模塊。此模塊將應(yīng)用程序發(fā)送的DNS請(qǐng)求報(bào)文轉(zhuǎn)發(fā)給外部DNS服務(wù)器,然后接收外部服務(wù)器返回的應(yīng)答信息,并根據(jù)這個(gè)信息給予應(yīng)用程序相應(yīng)的DNS應(yīng)答。
三個(gè)模塊與主模塊的關(guān)系圖如下,主模塊調(diào)用這三個(gè)并列的模塊,而本地解析模塊調(diào)用文件查找子模塊:
DNS服務(wù)器主模塊調(diào)用命令行參數(shù)處理模塊本地解析模塊半調(diào)用外部DNS服務(wù)器解析模塊調(diào)用文件查找子模塊
四、軟件流程圖
開(kāi)始創(chuàng)建套接字初始化接收緩沖命令行參數(shù)處理初始化設(shè)置UDP連接和套接字信息套接字綁定是否退出程序否接收UDPDNS數(shù)據(jù)包獲取DNS包頭參數(shù)是請(qǐng)求包DNS包類型應(yīng)答包域名格式轉(zhuǎn)換還原DNS數(shù)據(jù)包頭ID設(shè)置外部DNS應(yīng)答數(shù)據(jù)包向應(yīng)用程序發(fā)送DNS響應(yīng)數(shù)據(jù)包本地文件解析是找到對(duì)應(yīng)IP?否設(shè)置DNS包頭轉(zhuǎn)換DNS數(shù)據(jù)包頭ID設(shè)置外部DNS請(qǐng)求數(shù)據(jù)包向指定外部DNS轉(zhuǎn)發(fā)請(qǐng)求設(shè)置應(yīng)答結(jié)果發(fā)送DNS應(yīng)答結(jié)果清除socket關(guān)閉套接字結(jié)束
五、主要數(shù)據(jù)結(jié)構(gòu)
unsigned long upDNSaddr = inet_addr(DNS_SVR);
//外部DNS地址
unsigned short oID,nID,ID = 0,TYPE,CLASS,RDLENGTH,RDATA,flag,qdcount,ancount;
// oID,nID,ID為數(shù)據(jù)報(bào)ID // TYPE,CLASS,RDLENGTH,RDATA, flag,qdcount,ancount為報(bào)文的相應(yīng)標(biāo)志位
char initxt[100] = “C:dns.txt”,name[50];
// initxt[100]為配置文件路徑,name[50]為保存文件域名或IP int opt = 0,isfind = 0,TTL,len = 0,leng,strlen = 512;
//opt為用戶選項(xiàng),isfind標(biāo)志是否在本地文件找到記錄的布爾變量 // TTL為生存周期,len 接收的數(shù)據(jù)報(bào)長(zhǎng)度,leng發(fā)送的數(shù)據(jù)報(bào)長(zhǎng)度 //strlen為保存接收到的sockaddr的長(zhǎng)度
WSAData wsaData;
//套接口
WORD wVersionRequested;
//使用的套接口版本
struct sockaddr_in server,from,to,temp;
//server用于本地監(jiān)聽(tīng)DNS數(shù)據(jù)報(bào),from用于接收外部數(shù)據(jù)報(bào)
//to用于發(fā)送數(shù)據(jù)報(bào),temp是保存發(fā)送請(qǐng)求的瀏覽器信息
char sendbuf[256],recvbuf[256];
//發(fā)送緩存和接收緩存
char *ptr = recvbuf
//以ptr的增減來(lái)達(dá)到在數(shù)組中指針移動(dòng)的效果
六、測(cè)試用例以及運(yùn)行結(jié)果
a)測(cè)試本地解析功能
請(qǐng)求一個(gè)本地DNS對(duì)照表中已有的某一記錄,如2qq.cn:
在本地DNS對(duì)照表中找到記錄,將相應(yīng)的IP地址返回給用戶:
調(diào)試信息級(jí)別0:dnsrelay
調(diào)試信息級(jí)別1:dnsrelay –d
調(diào)試信息級(jí)別2:dnsrelay –dd
b)測(cè)試中繼功能:
請(qǐng)求一個(gè)本地DNS對(duì)照表中沒(méi)有的記錄,如www.tmdps.cn。本地DNS沒(méi)有找到相應(yīng)記錄,向外部web服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求,并接收相應(yīng)的應(yīng)答報(bào)文并轉(zhuǎn)發(fā)給用戶:
調(diào)試信息級(jí)別0:dnsrelay
調(diào)試信息級(jí)別1:dnsrelay –d
調(diào)試信息級(jí)別2:dnsrelay –dd c)
測(cè)試攔截功能:
請(qǐng)求一個(gè)不良網(wǎng)站,如www.tmdps.cn:
向用戶返回IP地址0.0.0.0,告知用戶“域名不存在”的報(bào)錯(cuò)信息:
調(diào)試信息級(jí)別0:dnsrelay
調(diào)試信息級(jí)別1:dnsrelay –d
調(diào)試信息級(jí)別2:dnsrelay –dd
d)請(qǐng)求一個(gè)不存在的www.tmdps.cn。當(dāng)外部web服務(wù)器找不到相應(yīng)的域名時(shí)返回超時(shí)信息,本地DNS服務(wù)器將此信息返回給用戶。
調(diào)試信息級(jí)別0:dnsrelay
調(diào)試信息級(jí)別1:dnsrelay –d
調(diào)試信息級(jí)別2:dnsrelay –dd
e)請(qǐng)求一個(gè)不合法的域名,如123:
本地DNS服務(wù)器返回給用戶“找不到該域名”的報(bào)錯(cuò)信息。
七、調(diào)試中遇到并解決的問(wèn)題
1)使用socket連接的時(shí)候,剛開(kāi)始只用了一個(gè)socket作為所有發(fā)送和接收的接口。在實(shí)際調(diào)試的過(guò)程中發(fā)現(xiàn)一個(gè)不能滿足軟件需求的實(shí)現(xiàn),所以用一個(gè)socket負(fù)責(zé)發(fā)送數(shù)據(jù)報(bào),另一個(gè)socket負(fù)責(zé)接收數(shù)據(jù)報(bào)。2)回應(yīng)報(bào)文中域名是使用偏移指針的方式實(shí)現(xiàn)的,這是由于在域名段寫入需要請(qǐng)求的域名時(shí)會(huì)與問(wèn)題報(bào)文中的域名字段重復(fù)從而造成不必要的浪費(fèi),用偏移指針的方式既可以防止重復(fù),也可以節(jié)省空間。
3)使用sendto函數(shù)時(shí),一開(kāi)始使用的是sizeof(sendbuf)來(lái)確定發(fā)送的數(shù)據(jù)報(bào)大小,但是實(shí)際操作中發(fā)現(xiàn)發(fā)送消息時(shí)只需要發(fā)送有用的部分,如果使用原來(lái)的方法會(huì)造成發(fā)送數(shù)據(jù)的冗余,需要精確確定發(fā)送數(shù)據(jù)的有效位數(shù)。
4)在編程過(guò)程中,對(duì)于指針的掌握不當(dāng)造成了多次錯(cuò)誤,例如在對(duì)于不同的標(biāo)志位要轉(zhuǎn)換成不同長(zhǎng)度的指針進(jìn)行賦值。
5)對(duì)于請(qǐng)求包的域名還原問(wèn)題,需要注意數(shù)組下標(biāo)與實(shí)際位數(shù)的區(qū)別。6)當(dāng)請(qǐng)求的域名為不帶www開(kāi)頭的域名時(shí),本機(jī)會(huì)自動(dòng)在其尾部追加“.localdomain”來(lái)形成新的域名,導(dǎo)致在本地解析工作中無(wú)法找到該域名對(duì)應(yīng)的記錄,從而轉(zhuǎn)發(fā)給外部web服務(wù)器,這與本地解析工作是相違背的。所以后來(lái)每當(dāng)在接收到寫有“.localdomain”域名的時(shí)候,強(qiáng)行進(jìn)行字符匹配并將其刪除,從而完成本地解析工作。
八、心得體會(huì)
本次大作業(yè)為實(shí)現(xiàn)一個(gè)DNS中繼服務(wù)器。通過(guò)完成本地域名解析、中繼功能以及不良網(wǎng)站攔截等基本的三個(gè)功能,來(lái)實(shí)現(xiàn)用戶訪問(wèn)外部服務(wù)器的需求。這次大作業(yè)的完成,需要我們閱讀并了解RFC 1035文檔。一開(kāi)始的時(shí)候?qū)FC完全沒(méi)有一個(gè)清晰地概念,只知道這是一個(gè)規(guī)格說(shuō)明,而且初讀其中的內(nèi)容也覺(jué)得一頭霧水。但后來(lái)在老師的提點(diǎn)下抓住了重點(diǎn),然后一遍一遍反復(fù)的閱讀,不懂的地方借助網(wǎng)絡(luò)和圖書(shū)資料,漸漸發(fā)現(xiàn)對(duì)DNS的原理和實(shí)現(xiàn)方法有了更加全面和深刻的理解,這對(duì)后期的程序編寫起到了非常大的幫助作用。
通過(guò)本次網(wǎng)絡(luò)實(shí)驗(yàn),對(duì)小型網(wǎng)絡(luò)應(yīng)用程序的實(shí)現(xiàn)有了一定程度的理解,同時(shí)更加熟悉了winsock函數(shù)庫(kù)。通過(guò)抓包分析UDP數(shù)據(jù)報(bào)文、DNS數(shù)據(jù)報(bào)文,對(duì)傳輸層和應(yīng)用層的數(shù)據(jù)包發(fā)送和接收等工作原理也有了更深的理解。
在本次大作業(yè)中,讓我感觸最深的就是這三年來(lái)編程實(shí)力的反映。在編程的過(guò)程中就不斷的被一些低級(jí)錯(cuò)誤影響了軟件實(shí)現(xiàn)的進(jìn)度,而且對(duì)在大一大二學(xué)到的知識(shí)點(diǎn),例如文件的讀取,不同進(jìn)制數(shù)的轉(zhuǎn)換等掌握不牢,導(dǎo)致需要花額外的時(shí)間去彌補(bǔ)以前遺忘的知識(shí)。在最終驗(yàn)收的階段,通過(guò)比較其他組同學(xué)的程序就可以很明顯的看出,自己程序的功能上比較單一,實(shí)現(xiàn)的方法也沒(méi)有他們來(lái)的精妙。繼而通過(guò)老師質(zhì)疑的幾個(gè)問(wèn)題,也可以發(fā)現(xiàn)我們的程序還存在許多不足,例如思考的方面不夠全面,思考的角度不夠多向。細(xì)節(jié)反應(yīng)一個(gè)程序的健壯性,而我們沒(méi)有盡可能的考慮每一個(gè)可能的情況,導(dǎo)致仍存在許多漏洞。所以這次的大作業(yè)告訴了我們,在以后的學(xué)習(xí)與實(shí)踐中,要時(shí)刻注意“細(xì)節(jié)”的重要性。這個(gè)不僅要在軟件分析的時(shí)候要注意,在編程的時(shí)候要注意,在調(diào)試測(cè)試的時(shí)候要注意,在最后維護(hù)階段也不能放松。這次的收獲想必對(duì)未來(lái)從事的網(wǎng)絡(luò)工作很有益處。
無(wú)論程序好還是壞,最重要就是親手實(shí)踐。借鑒別人的好代碼永遠(yuǎn)只是模范,只有自己動(dòng)手才會(huì)實(shí)現(xiàn)突破與創(chuàng)新。我們會(huì)在以后的學(xué)習(xí)與實(shí)踐中不斷提高自己的編程能力,日臻完善。
第四篇:襄陽(yáng)電信寬帶DNS服務(wù)器
襄陽(yáng)電信寬帶DNS服務(wù)器:
202.103.44.150
202.103.24.68
客服電話:10000
襄陽(yáng)網(wǎng)通(聯(lián)通)寬帶DNS服務(wù)器:218.104.111.122
218.104.111.114
客服電話:10010 襄陽(yáng)總公司:0710-3700663 襄陽(yáng)鐵通(移動(dòng))寬帶DNS服務(wù)器:61.232.206.102
61.232.206.100
61.234.145.102
客服電話:10050
襄陽(yáng)廣電寬帶DNS服務(wù)器:
10.0.20.1
10.0.20.3
客服電話:0710-3567110
第五篇:北郵計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)DNS服務(wù)器
北郵計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)DNS服務(wù)器 環(huán)境
操作系統(tǒng)隨意,語(yǔ)言python2.7
2.文件
Socket.py 說(shuō)明
完成緩存檢測(cè),確定是回應(yīng),還是轉(zhuǎn)發(fā),如果是回應(yīng),確定是本地回應(yīng)還是外部應(yīng)答轉(zhuǎn)發(fā)
import socket import mydic import charhandle import makeframe
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)port = 53
the_dic = mydic.get_web_ip()client_request = {} client_request_index = {} reverse_map = {} key_record = 0 client_wait = []
s.bind(('',port))
time_rest = 0 request_general = ''
print 'running' while True:
try:
msg ,(client,port)= s.recvfrom(1024)
except:
print 'Time out!'
continue
request = []
request = list(msg)
requre_web = charhandle.get_request(request[12:])
website = ''.join(requre_web)
if(port == 53):
answer = []
answer = list(msg)
print “Type:Remote Response”
print “remote answer is: ”
response_ip = msg[-4]+msg[-3]+msg[-2]+msg[-1]
char_ip = socket.inet_ntoa(response_ip)
print website + ' has the ip : '+char_ip
fre = mydic.storeForUpdate(website,char_ip)
print 'with the frequence of '+ str(fre)
###real_request = client_request[request[0]+request[1]]
for each_client in client_wait:
my_key = client_request[request[0]+request[1]+str(each_client)]
if client_request_index.get(my_key)!= None :
s.sendto(msg,client_request_index[my_key])
print “Response to ip and Client port:”
print client_request_index[my_key]
break
else:
print “Type: Client Request”
print “ip and port:”
print(client,port)
### requre_web = charhandle.get_request(request[12:])
### website = ''.join(requre_web)
print “Request website:”+website
if(the_dic.get(website)!= None):
print “Found in local cache:”
re_ip = the_dic.get(website)
print re_ip
fre = mydic.storeForUpdate(website)
print re_ip[0]+' with frequence '+str(fre)
zhen = makeframe.make(re_ip[0],msg)
s.sendto(zhen,(client,port))
else:
print “need to ask remote server”
key_record = key_record + 1
request_general = key_record
client_request[request[0]+request[1]+str(client)] = request_general
client_request_index[request_general] =(client,port)
if client not in client_wait:
client_wait.append(client)
# select authority DNS server as you wish
s.sendto(msg,('10.3.9.4',53))
time_rest = time_rest+1
try:
if(time_rest == 50):
print 'pay attention'
print '
#'
mydic.updateCache()
print '
#'
the_dic = mydic.get_web_ip()
time_rest = 0
except:
print 'not valid frequence'
print '--------------------' s.close()
Mydic.py 完成本地查詢,LRU算法維護(hù)本地緩存,socket.py第97行的time_request值可以確定更新緩存的頻率,可以直接輸出在dnsrelay.txt內(nèi),但是為了方便觀測(cè)變化,我輸出到了dnsrelaycopy.txt里面,運(yùn)行一段時(shí)間之后,可以去看看學(xué)習(xí)到的新條目
import pickle import os import threading A=[] d_web_ip = {} d_ip_web = {} update_dic = {}
data = open('dnsrelay.txt')for each_line in data:
try:
(ip,sitecopy)= each_line.split(' ',1)
(site,nothing)= str(sitecopy).split('n',1)
d_web_ip[site] = [ip,1]
d_ip_web[ip] = site
except:
print 'file error'
data.close()
try:
with open('newdnsrelay.pickle','wb')as newdnsrelay_file:
pickle.dump(d_web_ip,newdnsrelay_file)except IOError as err:
print 'File error:'+str(err)except pickle.PickleError as perr:
print 'Pickling error:'+str(perr)
def get_web_ip():
with open('newdnsrelay.pickle','rb')as f:
global update_dic
update_dic = pickle.load(f)
return update_dic.copy()
return(None)
def storeForUpdate(web_site, add = None):
global update_dic
if(update_dic.get(web_site)!= None):
add_frequen = update_dic[web_site]
add_frequen[1] = add_frequen[1] + 1
print web_site+' frequence incrase 1,with ip '+add_frequen[0]
return add_frequen[1]
else:
update_dic[web_site] = [add,1]
print 'record for a new site'
return 1
def updateCache():
global update_dic
m = update_dic.copy()
t = threading.Thread(target = my_thread,kwargs = m)
print 'ready to update local cache'
t.start()
t.join()
def my_thread(*argu,**arg):
frequence = []
remain_dic = {}
for each_key in arg:
tmp = arg[each_key]
if(tmp[1] not in frequence):
frequence.append(tmp[1])
if(tmp[0] == '0.0.0.0'):
remain_dic[each_key] = '0.0.0.0'
print 'various frequence:'
for each in frequence:
print 'have '+ str(each)
for each_key in remain_dic:
arg.pop(each_key)#enimilate ban
i = 0
while(i < 30):
max_frequence = max(frequence)
for each_key in arg:
tmp = arg[each_key]
if(tmp[1] == max_frequence):
remain_dic[each_key] = tmp[0]
i = i + 1
if(i == 30):
break;
frequence.remove(max_frequence)
if(not frequence):###no more
break;
updateFile(remain_dic)
def updateFile(new_dic):
f = open('dnsrelaycopy.txt','w')
for each_key in new_dic:
word = str(new_dic[each_key])+ ' ' + str(each_key)
f.write(word)
f.write('n')
new_dic[each_key] = [new_dic[each_key],0]
try:
with open('newdnsrelay.pickle','wb')as newdnsrelay_file:
pickle.dump(new_dic,newdnsrelay_file)
except IOError as err:
print 'File error:'+str(err)
except pickle.PickleError as perr:
print 'Pickling error:'+str(perr)
Makefram.py 成幀模塊,形成對(duì)外圍權(quán)威服務(wù)器的詢問(wèn)幀
import socket
def make(re_ip,msg):
tmp_list = []
for ch in msg:
tmp_list.append(ch)
tmp_list[4:12] = ['x00','x01','x00','x01','x00','x00','x00','x00']
tmp_list = tmp_list+['xc0','x0c','x00','x01','x00 ','x01','x00','x00','x02','x58','x00','x04']
dive_ip = socket.inet_aton(re_ip)
ch_ip = []
for each_ch in dive_ip:
ch_ip.append(each_ch)
tmp_list = tmp_list + ch_ip
re_msg = ''.join(tmp_list)
return re_msg
Charhandle.py 提取出報(bào)文中的url
def get_request(your_list):
my_list = []
new_list = []
my_list.extend(your_list)
re_list = []
thelen = ord(my_list[0])
try:
while thelen!= 0:
new_list = new_list + my_list[1:thelen+1]
my_list[0:thelen+1] = []
thelen = ord(my_list[0])
new_list.append('.')
except IndexError:
print “bao wen ge shi bu dui”
new_list.pop()
return new_list
原始的dnsrelay.txt老師給出了,自己去弄,把四個(gè)py文件放一個(gè)目錄下,再放一個(gè)dnsrelay.txt 然后,用python shell 打開(kāi) socket.py 從python shell 運(yùn)行,或者直接F5,記得把本地dns手動(dòng)指向本機(jī)。
P.S:本人親測(cè),蔣老師沒(méi)用過(guò)python,從頭到尾就是我講他聽(tīng),從不為難我,我說(shuō)有個(gè)LRU算法,他還說(shuō)我做的好!
如果有不懂的 聯(lián)系作者:302969722@qq.com 學(xué)妹優(yōu)先