第一篇:计算机网络课程设计 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服务器 环境
操作系统随意,语言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服务(系统自带)
班级:计科一班
组长:李柯颖(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”
可对其属性查看,或进行修改。
第四篇:计算机网络课程设计实验报告
计算机网络课程设计报告
姓名:王
齐
学号:1105010404
班级:计算机四班
指导老师:张会福
湖南科技大学计算机科学与工程学院
2014年02月
实验一:
一、设计题目
网络聊天程序的设计与实现
二、实验目的
1、加深对计算机网络通信系统工作原理的理解
通过编写计算机程序实现、模拟网络的某些功能,使自己理解并掌握计算机网络基本工作原理及过程。
2、提高网络编程和应用的能力
提高实际编程能力和灵活运用所学知识解决问题的能力。培养调查研究、查阅技术文献、资料、手册及编写技术文档的能力,理论运用于实践的能力。
三、课程设计要求
1、仔细分析每一个实验的具体内容、步骤和要求,按设计要求完成任务。
2、程序设计需要完成的程序流程图、说明文档和源程序清单。
3、提交课程设报告(包含课程设计名称、课程设计题目、课程设计内容、课程设计步骤、调试过程、课程设计结果以及结果分析、心得体会)、程序源文件、可执行文件。
四、程序原理
在计算机通信系统中,有两种通信方式:面向连接的TCP和面向报文的UDP。
TCP:传输控制协议。TCP提供可靠交付的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复、并且按序到达。所以服务器和客户端的通讯使用TCP来完成。确保服务器作为“中转站”能够得到、存储、转发正确的客户信息。
UDP:用户数据报协议。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。因为客户端之间的通讯(聊天)对数据正确性的要求不是太高,偶尔出错也不会有太大的影响。
本课程设计采用TCP方式来实现网络聊天程序。
五、课程设计步骤
1、TCP网络聊天程序
TCP传输控制提供可靠的,有保证的通信质量,是面向连接的通信。因此,在通信之前,通信双方就得采用建立连接。TCP通信采取C/S(客户机/服务器)模式。需要分别编写客户端程序和服务器端程序。
1)服务器端程序编写步骤:
a)加载套接字库,创建套接字(WSAStartup()/socket()); b)绑定套接字到一个IP地址和一个端口上(bind()); c)将套接字设置为监听模式等待连接请求(listen()); d)请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept()); e)用返回的套接字和客户端进行通信(send()/recv()); f)返回,等待另一连接请求;
g)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。2)客户端程序编写步骤:
a)加载套接字库,创建套接字(WSAStartup()/socket()); b)向服务器发出连接请求(connect()); c)和服务器端进行通信(send()/recv());
d)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
2、UDP网络聊天程序
与TCP不同,UDP在通信时并不要双方建立连接,它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和OICQ就是使用的UDP协议。因此,本设计同样采用UDP连接方式。
程序编写步骤:
a)加载套接字库,创建套接字(WSAStartup()/socket()); b)绑定套接字到一个IP地址和一个端口上(bind()); c)发送和接收数据(sendto()/recvfrom());
d)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
六、程序流程图
TCP
七.实验总结(错误与解决方法)
1.必须先初始化Winsock DLL库,否则会显示错误代码:
WSASYSNOTREADY 网络通信依赖的网络子系统还没有准备好。
WSAVERNOTSUPPORTED 所需的Windows Sockets API的版本未由特定的Windows Sockets实现提供。
2.窗口接收到数据包含“烫烫烫”,解决办法即用memset函数初始化数组: memset(sendBuf,0,sizeof(sendBuf));memset(recvBuf,0,sizeof(recvBuf));
3.使用该程序时注意先打开服务器,再打开客户端,否则无法正确连接。
4.注意引入ws2_32.lib库文件。
实验二:
一.题目:PING程序的设计与实现 二.实验目的:
PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。
三.实验原理:
ping的原理: Ping命令的主要作用是检测网络上主机的状态。要是在几年前,我们还可以下如此断言,如果不能Ping通某台主机,那么也就无法Telnet或者FTP到这台主机,但随着互联网的安全意识的增加,出现了访问控制清单的路由器和防火墙,由于ICMP报文是在IP数据包中被传输的,而到达一台主机不仅取决于IP层是否到达,还取决于使用何种协议和端口。
四.PING程序的实现过程
要实现ping程序,需要实现以下步骤:
1.创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字属性。
2.创建并初始化ICMP封包。
3.调用sendto函数向远程主机发送ICMP请求。
4.调用recfrom函数接受ICMP响应
五.核心模块的流程图:
六.相关截图:
1.PING本机:
2.Ping局域网:
七:实验总结(错误与解决方案)
1.按照指导书上的代码输入并成功编译运行,在CDM命令提示窗口使用该EXE时,返回Request Timed Out “request time out”这提示除了对方可能装有防火墙或已关机以外,还有就是本机的IP不正确和网关设置错误。①、IP不正确:
IP不正确主要是IP地址设置错误或IP地址冲突,这可以利用ipconfig /all这命令来检查。在WIN2000下IP冲突的情况很少发生,因为系统会自动检测在网络中是否有相同的IP地址并提醒你是否设置正确。在NT中不但会出现“request time out”这提示而且会出现“Hardware error”这提示信息比较特殊不要给它的提示所迷惑。
②、网关设置错误:这个错误可能会在第四个步骤出现。网关设置错误主要是网关地址设置不正确或网关没有帮你转发数据,还有就是可能远程网关失效。这里主要是在你Ping外部网络地址时出错。错误表现为无法Ping外部主机返回信息“Request timeout”。
实验三:
一.实验题目:
基于IP多播的图形界面会议程序
二.实验目的
理解IP多播原理,并熟悉IP多播协议。
运用IP多播知识,设计一个图形界面的网络会议程序。
三.设计要求
1、理解IP多播原理,熟悉IP多播协议。
2、了解IP多播的编程步骤。
3、用VisualC++实现局域网IP多播。
四.设计原理
IP多播地址和多播组
IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。
五.设计步骤
接收功能实现步骤:
(1)、创建一个SOCK_DGRAM类型的Socket。
(2)、将此Socket绑定到本地的一个端口上,为了接收服务器端发送的多播数据。(3)、加入多播组。(4)、接收多播数据。
发送功能实现步骤:
(1)、创建一个SOCK_DGRAM类型的Socket。(2)、加入多播组。(3)、发送多播数据。
多线程相关代码: InitSocket();RECVPARAM *pRecvParam=new RECVPARAM;pRecvParam->sock=m_socket;pRecvParam->hwnd=m_hWnd;//创建接收线程
HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);//关闭该接收句柄,释放其引用计数
CloseHandle(hThread);
程序截图:
六.实验总结(错误以及解决方案)
1.不能同时实现接收和发送功能:经查阅资料发现这是由于接收和发送功能的源代码中都有加入多播组程序段,一个程序不能多次加入同一个多播组。后来共同加入多播组程序段,不再让接收和发送功能分别运行加入多播组程序段。
2.当编辑框内当前显示内容满了之后,垂直滚动条不能自动下跳,需要手动拉下去,调用编辑框类的LineScroll函数和GetLineCount(); m_edit_recv.LineScroll(m_edit_recv.GetLineCount());
第五篇:DNS实验报告
DNS实验报告
实验环境:两台2003服务器。一台xp客户端 实验目的:在xp客户端上可以正向反向拼通ip和域名 实验步骤:
第一步:在控制面板中添加DNS服务器,然后打开正向查找区域
做辅助服务器的时候区域名称必须和主机保持一致,下一步:在主机上把DNS服务器改成本地回环
然后在客户端上把DNS改成主服务器的IP
然后用命令拼通,nslookup sjk.axl.com可以得到服务器的ip,用nslookup同样也可以
反向和这个同理