第一篇:北邮计算机网络课程设计DNS服务器
北邮计算机网络课程设计DNS服务器 环境
操作系统随意,语言python2.7
2.文件
Socket.py 说明
完成缓存检测,确定是回应,还是转发,如果是回应,确定是本地回应还是外部应答转发
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算法维护本地缓存,socket.py第97行的time_request值可以确定更新缓存的频率,可以直接输出在dnsrelay.txt内,但是为了方便观测变化,我输出到了dnsrelaycopy.txt里面,运行一段时间之后,可以去看看学习到的新条目
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 成帧模块,形成对外围权威服务器的询问帧
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 提取出报文中的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老师给出了,自己去弄,把四个py文件放一个目录下,再放一个dnsrelay.txt 然后,用python shell 打开 socket.py 从python shell 运行,或者直接F5,记得把本地dns手动指向本机。
P.S:本人亲测,蒋老师没用过python,从头到尾就是我讲他听,从不为难我,我说有个LRU算法,他还说我做的好!
如果有不懂的 联系作者:302969722@qq.com 学妹优先
第二篇:计算机网络课程设计 DNS 服务器 实验报告
DNS中继服务器实验报告
07415
林珅(13)
071401 07415
刘磊(18)
071406 07415
李鸿(19)
071407
一、系统概述
1)运行环境:windows XP
2)编译:
Microsoft visual C++ 6.0 3)使用方法:
a)使用ipconfig/all,记下当前DNS服务器,例如为211.68.71.4 b)使用下页的配置界面,将DNS设置为127.0.0.1(本地主机)c)运行你的dnsrelay程序(在你的程序中把外部dns服务器设为前面记下的211.68.71.4)d)正常使用ping,ftp,IE等,名字解析工作正常
二、系统的功能设计
设计一个DNS服务器程序,读入“域名-IP地址”对照表,当客户端查询域名对应的IP地址时,用域名检索该对照表,三种检索结果:
1)检索结果为ip地址0.0.0.0,则向客户端返回“域名不存在”的报错消息(不良网站拦截功能)
2)检索结果为普通IP地址,则向客户返回这个地址(服务器功能)
3)表中未检到该域名,则向因特网DNS服务器发出查询,并将结果返给客户端(中继功能)
考虑多个计算机上的客户端会同时查询,需要进行消息ID的转换
三、模块划分
DNS服务器主模块包含三个子模块,分别如下:
1)命令行参数处理模块:该模块用来处理通过命令行提示符来启动这个DNS服务器时所输入的命令行参数,管理员通过设置不同的参数可以使DNS服务器显示不同程度的提示和调试信息。所以这模块主要是依照输入的参数设置标志数据,以控制最后的各种信息的输出。
2)本地解析模块:本模块是在本DNS服务器本地保存的曾经解析过的或者需要屏蔽额域名和其对应IP信息文件中查找从应用程序来的请求解析的域名,在这个文件中查到需要的域名后取出对应的IP地址,并构造DNS应答数据包返回给发送此DNS域名解析请求的应用程序。
3)外部DNS服务器解析模块:当本地解析失败时,本DNS服务器会调用外部DNS服务器解析模块。此模块将应用程序发送的DNS请求报文转发给外部DNS服务器,然后接收外部服务器返回的应答信息,并根据这个信息给予应用程序相应的DNS应答。
三个模块与主模块的关系图如下,主模块调用这三个并列的模块,而本地解析模块调用文件查找子模块:
DNS服务器主模块调用命令行参数处理模块本地解析模块半调用外部DNS服务器解析模块调用文件查找子模块
四、软件流程图
开始创建套接字初始化接收缓冲命令行参数处理初始化设置UDP连接和套接字信息套接字绑定是否退出程序否接收UDPDNS数据包获取DNS包头参数是请求包DNS包类型应答包域名格式转换还原DNS数据包头ID设置外部DNS应答数据包向应用程序发送DNS响应数据包本地文件解析是找到对应IP?否设置DNS包头转换DNS数据包头ID设置外部DNS请求数据包向指定外部DNS转发请求设置应答结果发送DNS应答结果清除socket关闭套接字结束
五、主要数据结构
unsigned long upDNSaddr = inet_addr(DNS_SVR);
//外部DNS地址
unsigned short oID,nID,ID = 0,TYPE,CLASS,RDLENGTH,RDATA,flag,qdcount,ancount;
// oID,nID,ID为数据报ID // TYPE,CLASS,RDLENGTH,RDATA, flag,qdcount,ancount为报文的相应标志位
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为用户选项,isfind标志是否在本地文件找到记录的布尔变量 // TTL为生存周期,len 接收的数据报长度,leng发送的数据报长度 //strlen为保存接收到的sockaddr的长度
WSAData wsaData;
//套接口
WORD wVersionRequested;
//使用的套接口版本
struct sockaddr_in server,from,to,temp;
//server用于本地监听DNS数据报,from用于接收外部数据报
//to用于发送数据报,temp是保存发送请求的浏览器信息
char sendbuf[256],recvbuf[256];
//发送缓存和接收缓存
char *ptr = recvbuf
//以ptr的增减来达到在数组中指针移动的效果
六、测试用例以及运行结果
a)测试本地解析功能
请求一个本地DNS对照表中已有的某一记录,如2qq.cn:
在本地DNS对照表中找到记录,将相应的IP地址返回给用户:
调试信息级别0:dnsrelay
调试信息级别1:dnsrelay –d
调试信息级别2:dnsrelay –dd
b)测试中继功能:
请求一个本地DNS对照表中没有的记录,如www.xiexiebang.com。本地DNS没有找到相应记录,向外部web服务器转发请求,并接收相应的应答报文并转发给用户:
调试信息级别0:dnsrelay
调试信息级别1:dnsrelay –d
调试信息级别2:dnsrelay –dd c)
测试拦截功能:
请求一个不良网站,如www.xiexiebang.com:
向用户返回IP地址0.0.0.0,告知用户“域名不存在”的报错信息:
调试信息级别0:dnsrelay
调试信息级别1:dnsrelay –d
调试信息级别2:dnsrelay –dd
d)请求一个不存在的www.xiexiebang.com。当外部web服务器找不到相应的域名时返回超时信息,本地DNS服务器将此信息返回给用户。
调试信息级别0:dnsrelay
调试信息级别1:dnsrelay –d
调试信息级别2:dnsrelay –dd
e)请求一个不合法的域名,如123:
本地DNS服务器返回给用户“找不到该域名”的报错信息。
七、调试中遇到并解决的问题
1)使用socket连接的时候,刚开始只用了一个socket作为所有发送和接收的接口。在实际调试的过程中发现一个不能满足软件需求的实现,所以用一个socket负责发送数据报,另一个socket负责接收数据报。2)回应报文中域名是使用偏移指针的方式实现的,这是由于在域名段写入需要请求的域名时会与问题报文中的域名字段重复从而造成不必要的浪费,用偏移指针的方式既可以防止重复,也可以节省空间。
3)使用sendto函数时,一开始使用的是sizeof(sendbuf)来确定发送的数据报大小,但是实际操作中发现发送消息时只需要发送有用的部分,如果使用原来的方法会造成发送数据的冗余,需要精确确定发送数据的有效位数。
4)在编程过程中,对于指针的掌握不当造成了多次错误,例如在对于不同的标志位要转换成不同长度的指针进行赋值。
5)对于请求包的域名还原问题,需要注意数组下标与实际位数的区别。6)当请求的域名为不带www开头的域名时,本机会自动在其尾部追加“.localdomain”来形成新的域名,导致在本地解析工作中无法找到该域名对应的记录,从而转发给外部web服务器,这与本地解析工作是相违背的。所以后来每当在接收到写有“.localdomain”域名的时候,强行进行字符匹配并将其删除,从而完成本地解析工作。
八、心得体会
本次大作业为实现一个DNS中继服务器。通过完成本地域名解析、中继功能以及不良网站拦截等基本的三个功能,来实现用户访问外部服务器的需求。这次大作业的完成,需要我们阅读并了解RFC 1035文档。一开始的时候对RFC完全没有一个清晰地概念,只知道这是一个规格说明,而且初读其中的内容也觉得一头雾水。但后来在老师的提点下抓住了重点,然后一遍一遍反复的阅读,不懂的地方借助网络和图书资料,渐渐发现对DNS的原理和实现方法有了更加全面和深刻的理解,这对后期的程序编写起到了非常大的帮助作用。
通过本次网络实验,对小型网络应用程序的实现有了一定程度的理解,同时更加熟悉了winsock函数库。通过抓包分析UDP数据报文、DNS数据报文,对传输层和应用层的数据包发送和接收等工作原理也有了更深的理解。
在本次大作业中,让我感触最深的就是这三年来编程实力的反映。在编程的过程中就不断的被一些低级错误影响了软件实现的进度,而且对在大一大二学到的知识点,例如文件的读取,不同进制数的转换等掌握不牢,导致需要花额外的时间去弥补以前遗忘的知识。在最终验收的阶段,通过比较其他组同学的程序就可以很明显的看出,自己程序的功能上比较单一,实现的方法也没有他们来的精妙。继而通过老师质疑的几个问题,也可以发现我们的程序还存在许多不足,例如思考的方面不够全面,思考的角度不够多向。细节反应一个程序的健壮性,而我们没有尽可能的考虑每一个可能的情况,导致仍存在许多漏洞。所以这次的大作业告诉了我们,在以后的学习与实践中,要时刻注意“细节”的重要性。这个不仅要在软件分析的时候要注意,在编程的时候要注意,在调试测试的时候要注意,在最后维护阶段也不能放松。这次的收获想必对未来从事的网络工作很有益处。
无论程序好还是坏,最重要就是亲手实践。借鉴别人的好代码永远只是模范,只有自己动手才会实现突破与创新。我们会在以后的学习与实践中不断提高自己的编程能力,日臻完善。
第三篇:DNS服务器实验报告
网 络 工 程 实 验
实验名称:DNS服务(系统自带)
班级:计科一班
组长:李柯颖(41112045)
组员:马晓贤(41112033)马彬(41112036)
刘永军(41112012)高富雷(41112003)
张明东(41112016)
前 言
一、DNS服务器的概念
它是由解析器以及域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。DNS使用TCP与UDP端口号都是53,主要使用UDP,服务器之间备份使用TCP。
DNS最早于1983年由保罗·莫卡派乔斯(Paul Mockapetris)发明;原始的技术规范在882号因特网标准草案(RFC 882)中发布。1987年发布的第1034和1035号草案修正了DNS技术规范,并废除了之前的第882和883号草案。在此之后对因特网标准草案的修改基本上没有涉及到DNS技术规范部分的改动。
域名结构
通常 Internet 主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名。Internet 的顶级域名由 Internet网络协会域名注册查询负责网络地址分配的委员会进行登记和管理,它还为 Internet的每一台主机分配唯一的 IP 地址。全世界现有三个大的网络信息中心: 位于美国的 Inter-NIC,负责美国及其他地区; 位于荷兰的RIPE-NIC,负责欧洲地区;位于日本的APNIC,负责亚太地区。
解析器
解析器,或另一台DNS服务器递归代表的情况下,域名解析器,协商使用递归服务,使用查询头位。
解析通常需要遍历多个名称服务器,找到所需要的信息。然而,一些解析器的功能更简单地只用一个名称服务器进行通信。这些简单的解析器依赖于一个递归名称服务器(称为“存根解析器”),为他们寻找信息的执行工作。
服务器
提供DNS服务的是安装了DNS服务器端软件的计算机。服务器端软件既可以是基于类linux操作系统,也可以是基于Windows操作系统的。装好DNS服务器软件后,您就可以在您指定的位置创建区域文件了,所谓区域文件就是包含了此域中名字到IP地址解析记录的一个文件,如文件的内容可能是这样的:primary name server = dns2(主服务器的主机名是)
serial = 2913(序列号=2913、这个序列号的作用是当辅域名服务器来复制这个文件的时候,如果号码增加了就复制)
refresh = 10800(3 hours)(刷新=10800秒、辅域名服务器每隔3小时查询一个主服务器)
retry = 3600(1 hour)(重试=3600秒、当辅域名服务试图在主服务器上查询更新时,而连接失败了,辅域名服务器每隔1小时访问主域名服务器)
expire = 604800(7 days)(到期=604800秒、辅域名服务器在向主服务更新失败后,7天后删除中的记录。)
default TTL = 3600(1 hour)(默认生存时间=3600秒、缓存服务器保存记录的时间是1小时。也就是告诉缓存服务器保存域的解析记录为1小时)
二、设置类别
您可以把DNS服务器配置成以下3类之一: 1.主DNS服务器。2.辅DNS服务器。3.缓存DNS服务器。
三、DNS服务器的工作原理大致如下:
1、用户在浏览器里输入域名,例如www.xiexiebang.com,这个邮件地址只能表明收邮件人在msserver.com.cn域上拥有一个账户。可是仅仅知道这些并不够,因为电子邮件程序并不知道该域的邮件服务器地址,因此不能将这封邮件发送到目的地。而MX记录就是专门为电子邮件程序指路的,在DNS服务器中添加MX记录后电子邮件程序就能知道邮件服务器的具体位置(即IP地址)了。在主DNS服务器中添加MX记录的操作步骤如下所述:
步骤:1 在DNS控制台窗口中首先添加一个主机名为mail的主机记录,并将域名mail.msserver.com.cn映射到提供邮件服务的计算机IP地址上。2 在“正向查找区域”目录中右键单击准备添加MX邮件交换记录的域名,选择“新建邮件交换器(MX)”命令,如图所示。
1.2.3
打开“新建资源记录”对话框,在“邮件服务器的完全合格的域名(FQDN)”编辑框中输入事先添加的邮件服务器的主机域名(如mail.msserver.com.cn)。或单击“浏览”按钮,在打开的“浏览”对话框中找到并选择作为邮件服务器的主机名称(如mail),如图所示。
3.4 返回“新建资源记录”对话框,当该区域中有多个MX记录(即有多个邮件服务器)时,则需要在“邮件服务器优先级”编辑框中输入数值来确定其优先级。通过设置优先级数字来指明首选服务器,数字越小表示优先级越高。最后单击“确定”按钮使设置生效,如图所示。小提示:一般情况下“主机或子域”编辑框中应该保持为空,这样才能得到诸如user@msserver.com.cn之类的信箱地址。如果在“主机或子域”编辑框中输入内容(如mail),则信箱名将会成为user@mail.msserver.com.cn5 重复上述步骤可以添加多个MX记录,并且需要在“邮件服务器优先级”编辑框中分别设置其优先级。
实验六 给DNS服务器做个快速体检
你的内网DNS服务器工作状态正常吗?大家常用的测试方法是查看内网用户是否能使用域名浏览网站,但这种测试方法并不全面和科学。其实最简单和便捷的方式是使用nslookup+Ping命令的组合方式,通过简单的两步就能给本地企业网中的DNS服务器做个快速“体检”。
步骤:
第一步:首先使用nslookup命令来测试本企业网的DNS服务器,查看它是否能正常将域名解析成IP地址。这里以www.xiexiebang.com”
第六步:设置完毕后我们访问www.xiexiebang.com时就会自动根据是在内网还是外网来解析了。
命令提示符输入netsh winsock reset重启电脑
实验九 快速删除电脑IPv6 DNS地址
随着IPv6地址使用范围的越来越广,在电脑上进行IPv6 DNS地址的配置和删除也是常有的事,下面就介绍一种快速删除电脑IPv6 DNS地址的方法:
步骤:
1.1 在Win 7的“开始”中打开“运行”对话框,并在其中运行“cmd”命令,点击“确定”按钮。
2.2 在“CMD”命令行中执行命令“ipconfig/all”,查看电脑网卡上配置的ipv6 DNS地址。
执行完上面的命令后就能看到电脑网卡的IPv6 DNS地址配置情况,如下图。
3.4 然后在“CMD”命令行中执行命令“netsh interface ipv6 delete dnsservers “本地连接”2001:dn8:8000:1:202:120:2:101”,就可以把电脑网卡上的ipv6 DNS地址删除掉。
注意事项
删除电脑IPv6 DNS地址的命令格式,必须按要求输入,不能有任何的差错,否则不能正确执行。
实验十 怎样让别人无法修改DNS的内容
DNS设置在TCP/IP中,我们可以通过禁用TCP/IP来实现。
1.1 首先点击“开始”菜单,点击运行。2 在打开的运行框中输入gpedit.msc,按确定。
2.3 依次展开“用户配置管理模板网络网络连接”4 在右侧窗口中找到“禁用TCP/IP高级配置”。
3.5 双击打开将“已启用”选中,确定。
然后再强制执行组策略即可生效。
保护DNS服务器的几种方法
DNS软件是黑客热衷攻击的目标,它可能带来安全问题。下面是保护DNS服务器的几种方法。
禁用区域传输
区域传输发生在主DNS服务器和从DNS服务器之间。主DNS服务器授权特定域名,并且带有可改写的DNS区域文件,在需要的时候可以对该文件进行更新。从DNS服务器从主力DNS服务器接收这些区域文件的只读拷贝。从DNS服务器被用于提高来自内部或者互联网DNS查询响应性能。
然而,区域传输并不仅仅针对从DNS服务器。任何一个能够发出DNS查询请求的人都可能引起DNS服务器配置改变,允许区域传输倾倒自己的区域数据库文件。恶意用户可以使用这些信息来侦察你组织内部的命名计划,并攻击关键服务架构。你可以配置你的DNS服务器,禁止区域传输请求,或者仅允许针对组织内特定服务器进行区域传输,以此来进行安全防范。
使DNS只用安全连接
很多DNS服务器接受动态更新。动态更新特性使这些DNS服务器能记录使用DHCP的主机的主机名和IP地址。DDNS能够极大地减
轻DNS管理员的管理费用,否则管理员必须手工配置这些主机的DNS资源记录。
然而,如果未检测的DDNS更新,可能会带来很严重的安全问题。一个恶意用户可以配置主机成为台文件服务器、Web服务器或者数据库服务器动态更新的DNS主机记录,如果有人想连接到这些服务器就一定会被转移到其他的机器上。
你可以减少恶意DNS升级的风险,通过要求安全连接到DNS服务器执行动态升级。这很容易做到,你只要配置你的DNS服务器使用活动目录综合区(ActiveDirectoryIntegratedZones)并要求安全动态升级就可以实现。这样一来,所有的域成员都能够安全地、动态更新他们的DNS信息。
使用防火墙来控制DNS访问
防火墙可以用来控制谁可以连接到你的DNS服务器上。对于那些仅仅响应内部用户查询请求的DNS服务器,应该设置防火墙的配置,阻止外部主机连接这些DNS服务器。对于用做只缓存转发器的DNS服务器,应该设置防火墙的配置,仅仅允许那些使用只缓存转发器的DNS服务器发来的查询请求。防火墙策略设置的重要一点是阻止内部用户使用DNS协议连接外部DNS服务器。
在DNS注册表中建立访问控制
在基于Windows的DNS服务器中,你应该在DNS服务器相关的注册表中设置访问控制,这样只有那些需要访问的帐户才能够阅读或修改这些注册表设置。
HKLMCurrentControlSetServicesDNS键应该仅仅允许管理员和系统帐户访问,这些帐户应该拥有完全控制权限。在DNS文件系统入口设置访问控制
在基于Windows的DNS服务器中,你应该在DNS服务器相关的文件系统入口设置访问控制,这样只有需要访问的帐户才能够阅读或修改这些文件。
%system_directory%DNS文件夹及子文件夹应该仅仅允许系统帐户访问,系统帐户应该拥有完全控制权限。实验十一 在windows07 查看DNS服务器属性
步骤:
打开“控制面板”里的“管理工具”
点击“服务”,下拉列表框,找到“DNS client”
双击“DNS client”
可对其属性查看,或进行修改。
第四篇:襄阳电信宽带DNS服务器
襄阳电信宽带DNS服务器:
202.103.44.150
202.103.24.68
客服电话:10000
襄阳网通(联通)宽带DNS服务器:218.104.111.122
218.104.111.114
客服电话:10010 襄阳总公司:0710-3700663 襄阳铁通(移动)宽带DNS服务器:61.232.206.102
61.232.206.100
61.234.145.102
客服电话:10050
襄阳广电宽带DNS服务器:
10.0.20.1
10.0.20.3
客服电话:0710-3567110
第五篇:北邮计算机网络实践第三次实验报告
计算机网络技术实践
实验报告
实验名称 RIP和OSPF路由协议的配置及协议流程
姓 名___(-…-)_____________实 验 日 期:2014年4月11日 学 号_ 242_______实验报告日期:2014年4月16日 报 告 退 发:(订正、重做)
一.环境(详细说明运行的操作系统,网络平台,网络拓扑图)1.运行操作系统
由于本人电脑上的操作系统是WIN7旗舰版,尝试直接安装Dynamips模拟器,但一直没有成功。于是在电脑上安装了VMware Workstation,并安装WINXP虚拟操作系统。在WINXP虚拟操作系统上安装Dynamips模拟器,才顺利完成了实验环境的搭建。2.网络平台 Dynamips模拟器 3.网络拓扑图
F0/0PC11.1.242.1 255.0.0.0网络 1.0.0.0F0/0F0/0PC33.1.242.1 255.0.0.01.1.242.2 255.0.0.0DTE PPP6.1.242.2 255.0.0.0RT1S1/0网络 6.0.0.0网络 3.0.0.0DCE PPPClockrate:1152007.1.242.1 255.0.0.0S1/1DCE PPPClockrate:1152006.1.242.1 255.0.0.0S1/0F0/03.1.242.2 255.0.0.0F0/0网络 4.0.0.0F0/0网络 7.0.0.0S1/2S1/0网络 8.0.0.0DCE PPPDTE PPPRT3Clockrate:115200RT4DTE PPP8.1.242.2 255.0.0.05.1.242.2 255.0.0.08.1.242.1 255.0.0.0S1/1网络 5.0.0.0S1/14.1.242.2 255.0.0.0PC44.1.242.1 255.0.0.0DTE PPPS1/07.1.242.2 255.0.0.0F0/0网络 2.0.0.0RT22.1.242.2 255.0.0.0DCE PPPClockrate:1152005.1.242.1 255.0.0.0F0/0PC2
二.实验目的
复习和进一步掌握实验一二的内容。
学会设计较复杂的网络物理拓扑和逻辑网段。
掌握路由器上RIP协议的配置方法,能够在模拟环境中进行路由器上RIP协议的配置,并能通过debug信息来分析RIP协议的工作过程,并观察配置水平分割和没有配置水平分割两种情况下RIP协议工作过程的变化。
掌握路由器上OSPF协议的配置方法,能够在模拟环境中上进行路由器上OSPF协议的配置,并能够通过debug信息分析OSPF协议的工作工程。
三.实验内容及步骤(包括主要配置流程,重要部分需要截图)
1.实验前的基础设置(实验一、二)
2.物理拓扑设计
修改.net 文件,设计物理拓扑,修改后的.net文件见附录。3.逻辑网段设计
3.1.用list命令列出所有网络成员,如下图所示。
3.2.输入命令start/all启动所有网络成员
配置路由器以及PC的idle-pc value并保存。
3.3.同过telnet登陆到主机或路由器
打开八个控制台窗口,每个窗口都使用telnet登陆到路由器或主机上。例如登陆到PC1 的命令为telnet 127.0.0.1 3001,登陆到RT1的命令为telnet 127.0.0.1 3002 3.4.配置路由器之间的串口并启动串口
配置从底层向高层配置,先配置物理层的时钟信息,再配置数据链路层协议,最后配置网络层的IP协议,并开启串口。
在配置串口时,已选需要配置成为DCE端,另一端要配置成为DTE端。DCE端提供时钟,DTE端跟随时钟。所以只要在DCE 端配置时钟即可,配置了时钟的那端就是DCE端,没有配置时钟的那端就是DTE端。
在此实验中我将所有的串口的数据链路层都配置成PPP协议。如果不配置,默认的数据链路层采用的是HDLC协议。IP协议方面,注意串口两端的IP地址要在同一网段。no shutdown 启动窗口。
具体步骤以RT1和RT2之间的串口连接的配置为例
用这种方法将其他路由器对之间的串口连接,具体参数参见网络拓扑图。
3.5.配置主机和路由器之间的以太网连接接口并启动
主机和路由器之间通过以太网相连,以太网不用配置物理层和数据链路层,只要配置网络层IP协议即可。
以PC1和RT1为例。
同理配置好其他三个主机和路由器之间的以太网连接接口并启动。至此,同一网段中的设备已经可以进行数据传输了。测试同意网段中的设配的传输数据情况。以PC1和RT1以及RT1和RT2之间为例:
RT1 ping PC1:
PC1 ping RT1:
RT1 ping RT2:
RT2 ping RT1:
4.配置RIP协议。
4.1.为拓扑图中的主机配置默认路由
由于拓扑图中的网络比较复杂,主机采用配置默认路由的方式可以减少工作量,默认路由配置如下例。
4.2.配置RIP协议
以RT1为例,配置RIP协议,network为与RT1直连的网络,neighbor为
RT1的邻居路由器。
让窗口打印RIP协议调试信息,我们发现RT1在更新路由表。
4.3.检测不同网段中网络的联通情况
各路由器均已开启RIP协议,即各个路由器之间已经交换过信息。PC1 ping PC4
PC4 ping RT2
RT4 ping RT1
RT4 ping PC1
各网段路由器经过动态学习,已经获得了整个网络的拓扑,所以拓扑中的模块均能够ping通。
4.4.分析RIP协议工作过程。RT1:
RT2:
RIP协议基于距离矢量路由算法,它的基本工作原理是:每一个路由器维护一张路由表,该路由表以每一个目标网络为索引,记录到达该目标网络的时间开销或距离开销,以及对应的输出接口。所有使用RIP协议的路由器周期性地向外发送路由刷新报文,再接收到来自各个邻居路由器的路由表后,根据这些路由表来重新计算自己到达各个网络的最佳路由。
从上面的调试信息,我们可以看到RT2接收来自各个邻居路由的路由表,RT1向外发送路由刷新报文,更新路由表的三个最重要的动作。
4.5.比较禁止水平分割和打开水平分割两种情况下RIP协议交互过程的变化。
进入RT1的s1/0接口的配置模式,禁止水平分割(默认打开水平分割)。命令行为:RT1(config-if)#no ip split-horizon 有水平分割RT1的调试信息
禁止水平分割后RT1的调试信息
水平分割方法让路由器记住每一条路由信息的来源,也就是标记收到该路由信息的端口号,当本路由器向外广播路由信息时,不会将该路由信息向收到这条信息的端口上发送,从而可以避免一些路由循环产生。
有上面两个截图的比较,我们发现关闭水平分割后,从s1/0传来的网段1,2,3,4,5,6,7,8的信息又发给s1/0。此外,对于有水平分割的s1/0接口,传送的是已经筛选过的距离表。这就是关闭水平分割的区别。
虽然在上图中没有明显的区别,但是当链路出现故障时,水平分割就是一种防止出现无穷计算问题的高效同步的方法。
4.6.采用show ip route 观察路由器在RIP协议中学到的路由表项
我们以R1为例进行分析。RIP协议配置前的R1的路由表
我们发现路由表中只有与它直接相连的路由信息且都标注为C。启动RIP协议后RT1的路由信息。
比较学习前和学习后的路由表,我们发现多了标记为R的表项,并且现在路由知道了与其不相连的网段、主机和路由。
我们以第二行:R 2.0.0.0/8[120/1]via 7.1.242.2,00:00:08,Serial1/0为例说明: R表示此路由表项是通过RIP协议学习到的,而时间00:00:08表示学习到这个路由表项距离现在的时间,时间越小表示路由表项越新,它的可信度也就越高。而时间较大时表示这个路由表项是很久之前学习到的,现在网络状况可能已经发生了变化。
4.7.跟踪路由,观察RIP协议实验结果
我们观察PC1 ping PC4 的包所经过的路径,由下图可知路径为:1.1.242.1->1.1.242.2->6.1.242.1->8.1.242.2->4.1.242.1 *表示失败。
5.OSPF 协议配置和实验
5.1.删除各路由器上的RIP协议
在配置模式下输入no router rip
在特权模式下输入show ip route 查看删除RIP协议后的路由信息,由下图可知删除RIP协议后,路由器只认识和它直连的网络信息。
5.2.在路由器上配置OSPF协议
以RT1为例配置OSPF协议。
具体步骤为:进入OSPF配置模式->配置与RT1直连的网络并指明该网络所在的区域->进入路由串口(s)分别配置从接口发送hello包的时间间隔和认为通过该接口相连的邻居已经不存在的时间间隔。
当网络中所有路由器都已经配好OSPF协议后,在RT1中输入show ip route,如下图可知RT1已经知道了所有没有直接相连的网络。
5.3.检测OSPF路由结果
以PC1 ping PC4为例
开始时丢了两包,收到了三包,说明网络连接没有问题。
5.4.利用debug ip ospf event 打开调试信息,分析OSPF协议工作过程
以RT1为例
OSPF是基于链路状态算法的分层路由协议。在开启OSPF协议之后路由器之间交互的是链路状态信息,不过上图只有相邻链路Hello包的交互,这是因为OSPF的主要协议交互过程是在刚配置完OSPF协议时就进行了,而在网络运行过程中,如果没有链路状态的变化就没有交互链路状态信息。也就是说,一旦网络稳定,信息不再更新,则只会有Hello包。只有链路发生变化时,相应路由器才会广播改变的信息给其余路由器。
Hello协议是OSPF协议中比较重要的部分,用于检测邻居并维护邻接关系。
5.5.修改链路状态,观察广播信息的交互
5.5.1.通过debug ip osdf flood 打开RT1的洪泛状态
打开后,维持下面状态不变,知道链路状态出现变化。
可靠洪泛机制是OSPF的重要部分,在其某条链路状态发生变化时,会将变化的信息发送给同一域中的所有OSPF路由器,从而确保整个域内的路由器始终具有一致的链路状态数据库。
5.5.2.观察路由器端口失效时信息的交互
关闭与RT1直连的RT3的s1/0接口
RT1反应部分截图
我们发现,RT3的接口一关闭后,就收到了来自RT3的11.1.1.2的洪泛信息。OSPF路由器收到链路状态更新报文时,更新自己的链路状态数据库,然后采用SPF算法重新计算路由表。在重新计算过程中,路由器继续使用旧路由表,直到SPF完成新路由表的计算。
最终RT1端又会恢复链路改变前的平静状态,不会再有信息输出。但是即使链路状态没有发生变化,OSPF路由信息也会自动更新,默认时间为30分钟。
5.5.3.观察IP地址失效时信息的交互
删除与RT1直连的RT3的s1/0的IP地址
观察RT1的变化
我们发现RT1收到来自RT3 s1/2的洪泛信息。
5.6.利用各个路由器的OSPF的邻居路由器
命令行为:sh ip ospf neighbor。其中,Neighbor ID 表示邻居路由器的路由ID,路由ID是路由器在OSPF网络中的唯一标识。(是该路由器各IP地址中的一个)。Pri标识路由器的优先级,默认为1。State标识路由器的状态,FULL即开着。DOWN即该端口被shutdown了。Dead Time表示最后学习到路由信息的时间。Address标识邻居路由器与本路由器相连的接口的IP地址。Interface标识连接邻居路由器的本地接口。
四.实验结果(包括最终实验结果,需要截图)
详细实验结果见三中的实验步骤、分析与截图。
a)RIP协议
通过实验,我深入理解了RIP协议的工作原理。
RIP协议是基于距离矢量算法的内部动态路由协议。其基本工作原理是:每一个路由表维护一张路由表,记录到达该目标网络的时间开销或距离开销,以及对应的输出接口。所有路由器通过周期性地向外发送路由刷新报文,在接收到来自各个邻居路由器的路由表后,根据这些路由表来重新计算自己到达各个网络的最佳路由。
通过对比水平分割关闭前后的交互变化,真切理解到RIP协议通过水平分割来优化,避免路由循环的产生,提高效率。
b)OSPF协议
OSPF协议基于链路状态路由算法。在分层次的网络结构中,每个区域内部维持一张唯一的本域拓扑结构图,各域内部的路由器根据所在域的拓扑图各自计算路由,域边界路由器把本域的内部路由总结后向其他域进行扩散。
实验中还着重研究了OSPF的Hello协议和可靠泛洪机制。Hello协议用于检测邻居并维护邻接关系,可靠泛洪机制在链路状态发生变化时更新状态。
我们从邻居路由表中可以发现,路由器标识为端口IP中最大的IP地址。
debug时,可以看到OSPF协议中路由器先和邻居交互链路状态信息,交互描述信息DBD而非具体的路由信息,然后当路由器知道自己没有哪些信息而对方有时,会启动Database Require请求交互,然后再Exchange真正的路由信息,知道达到同步为止。
在点到点链路中,常选择IP地址较大的作为主路由,或者通过elect选举出多个成员中的主路由,其他路由需与主路由进行数据库同步。
五.实验中的问题及心得(需要认真写,不要写空话、套话)a)试验中遇到的问题
在创建物理链路状态时,由于没有经验,每个PC机的端口也写了slot0 = PA-C7200-IO-FE,导致系统根本启动不起来。经历数次失败的后,终于发现了问题。程序顺利启动。
在配置RIP协议后,发现各个路由器之间能够ping通而但PC与PC或者PC与非直连路由器之间无法传送数据。仔细回想实验步骤,发现PC没有配置路由,刚开始采用配置静态路由的方法,比较繁琐;后来学到配置默认路由来减少工作量。
b)实验总结
本次实验建立在实验一二的基础上,通过仿真环境下做具体的配置实践和观察,很好地复习了上学期计算机网络课程中所学的距离矢量路由(RIP)和链路状态路(OSPF)由算法。
通过实验,对运行在网络中各层的协议也有了更进一步的认识,知道了网络协议的分工与合作。对网络的分层结构有了具体的认识,过去书本上学到的知识很抽象,动手实践后认识更加深刻,有些理解错误的地方也更正了过来。
六.实验思考(需要认真写,不要写空话、套话)
本次实验做的时间较长,由于我的电脑装软件总是装不上,无奈之下装了虚拟机+XP操作系统。其间由于不熟悉虚拟机使用规范,虚拟机还死掉一次,无奈又重装。在做实验时,一步步跟着实验步骤来,一点点熟悉指令。也犯过致命的错误,仔细检查实验流程重要发现了问题并顺利解决了问题。到网上查找资料,实验过程也优化了很多。实验大概做了三遍,收获颇丰。对网络的分层结构有了更深的认识,明白了网络各层协议的分工合作。从物理层到数据链路层再到网络层,对数据的传输脑海中形成了清晰的流程。
在书写实验报告的过程中,学会了用Visio绘制精美的网络拓扑图,报告层次也更加规范,严谨。
七.附录
物理拓扑结构 autostart = false
[localhost] port = 7200
udp = 10000 workingdir =..tmp
[[router R1]]
image =..iosunzip-c7200-is-mz.122-37.bin
model = 7200
console = 3002
npe = npe-400
ram = 64
confreg = 0x2102
exec_area = 64
mmap = false
slot0 = PA-C7200-IO-FE
slot1 = PA-4T
f0/0 = PC1 f0/0
s1/0 = R2 s1/0
s1/1 = R3 s1/0
[[router R2]]
image =..iosunzip-c7200-is-mz.122-37.bin
model = 7200
console = 3004
npe = npe-400
ram = 64
confreg = 0x2102
exec_area = 64
mmap = false
slot0 = PA-C7200-IO-FE
slot1 = PA-4T
f0/0 = PC2 f0/0
s1/1 = R3 s1/1
[[router R3]]
image =..iosunzip-c7200-is-mz.122-37.bin
model = 7200
console = 3006
npe = npe-400
ram = 64
confreg = 0x2102
exec_area = 64
mmap = false
slot0 = PA-C7200-IO-FE
slot1 = PA-4T
f0/0 = PC3 f0/0
s1/2 = R4 s1/0
[[router R4]]
image =..iosunzip-c7200-is-mz.122-37.bin
model = 7200
console = 3007
npe = npe-400
ram = 64
confreg = 0x2102
exec_area = 64
mmap = false
slot0 = PA-C7200-IO-FE
slot1 = PA-4T
f0/0 = PC4 f0/0
[[router PC1]] model = 2621 ram = 20 image =..iosunzip-c2600-i-mz.121-3.T.bin mmap = False confreg = 0x2102 console = 3001
[[router PC2]] model = 2621 ram = 20 image =..iosunzip-c2600-i-mz.121-3.T.bin mmap = False confreg = 0x2102 console = 3003
[[router PC3]] model = 2621 ram = 20 image =..iosunzip-c2600-i-mz.121-3.T.bin mmap = False confreg = 0x2102 console = 3005
[[router PC4]] model = 2621 ram = 20 image =..iosunzip-c2600-i-mz.121-3.T.bin mmap = False confreg = 0x2102 console = 3008