# dns 中继服务器
## 一、系统功能设计:
一个 dns 中继服务器,实现代理所有的 Windows 的有关 dns 域名 ip 查询的功能。具体功能有:
1、拦截功能:拦截所有 Windows 的 dns 查询包,并中继代理,若该包存在对照表中,则该包在中继器处拦截并在此处生成应答包直接发送给 Window 端;拦截所有 dns 服务器返回的应答包,并存储进缓存中,以实现后来的查询转发功能。
2、转发功能:若该查询包中域名未在对照表中,则作为 Windows 与 dns 服务器的中继,实现二者消息的转发沟通。
3、缓存功能:从 dns 服务器拦截的包中获取所需信息,在缓存中查询或、更新或新建。
4、分析与输出功能:分析拦截下的包,并按照输出要求输出包的解析情况。
## 二、模块划分
a)全局变量模块:存放程序运行所需的全局变量
b)获取命令行参数模块:用于实现获取以随机顺序传入命令行的参数。
c)Main 函数模块:统筹整个系统,为全局变量赋值,并初始化 Windows 下的 socket 编程。
d)拦截转发模块:拦截从 Windows 来的查询包以及从 dns
服务器来的应答包,并交给下一步解析模块以及缓存模块做解析和缓存。
e)包解析模块:
i.解析查询包:从 Windows 查询包中取出域名和查询方式,为下一步在是否做拦截工作、直接生成响应包发回 Windows 端、在缓存直接访问 dns 服务器来查询做准备;
ii.解析应答包:从 dns 服务器返回的应答包中取出所需的域名,ip,查询方式,TTL 等所需信息,为下一步存入缓存做准备。
f) 缓存模块:
i. 查询缓存模块:在缓存中查询从拦截转发模块中拦截的从 Windows 来的请求包的解析数据是否存在与缓存中且未超时。若是则取出缓存,返还 Windows,不再转发请求;若无或超时则向 dns 服务器转发请求包,并等待回复。
ii.写/更新缓存模块:根据上一步查询模块中缓存是否已经存在且超时,来决定是更新还是新建一个从 dns 服务器返回的应答包的解析数据的缓存记录,并在缓存记录修改超过五条以上时,写文件中以长久存储。
g)解析输出模块:根据输出的模式,输出从 dns 服务器或是本地缓存记录中取出的应答包的解析情况。
## 三、流程图:
![](https://www.writebug.com/myres/static/uploads/2021/12/6/5141199ca3ef55b673fc4623c2f1e5c5.writebug)
## 四、遇到的问题
1.在初版程序中,程序可以成功拦截与对照表中域名匹配的 Windows 端的查询包但是拦截方式是通过 dns 服务器端超时处理,通过改进,我们成功在程序中修改 RCODE、RDATA 生成与对照表中 ip 地址一致的域名的响应包,通过使 RCODE=3 实现向客户端返回“域名不存在”的报错消息。
2.由于对题意理解不清,我们的初版程序无法实现对于“IP 地址--域名”对照表中非拦截网站的中继功能(我们的中继功能是依赖缓存中保存的信息实现)。通过改进,我们成功的实现了,在“IP 地址--域名”对照表中查询到匹配网址后,对于 IPV4 包构造一个响应包实现服务器功能,对于 IPV6 包继续进行向 DNS 服务器查询,实现中继功能。
3.解析数据包时,个别字段只占 1bit,而数据类型至少占 8bit(UINT8)。需要对其作具体的位运算。如 getQR(charpacket[],intlen);getRCODE(charpacket[],intlen);
4.获取域名时,根据 RFC1305 协议文本获取域名长度。在 RDATA 字段中根据 TYPE 的不同解析过程也不同。如对于 CNAME 类型在一些情况下会以 0xc016 结尾,在此时需要特判,使其输出正确结果。为了提升 getNAME 函数的安全性增加(int)board 限制边界防止越界情况。
5.在 char*getNAME(charpacket[],intlen,int*n,charname[],intboard,intFLAG_CNAME);中出现过无法将解析的字符串存入 answer 的情况,之后发现是因为只是将字符串存入该函数内部的数组中,返回数组指针。而在返回函数后数组中的内容退栈,指针所指的内容为空。为解决该问题在签名中加入 charname[]数组,将解析的内容保存下来。
6.在调试输出部分,由于需要分级输出,逻辑处理冗余复杂。为了简化逻辑根据数据包(报头部分、问题部分、资源部分)的三部分,分别将相应的解析、输出部分独立出来。如:voidheaderExtract(char*packet,intlen,
Answer*answer)’;voidheaderOutput(Answer*answer);
7.在系统中,同一时间可能有不止一个程序在调用 dns 请求,而单线程无法解决这个问题。使用多线程后,又存在线程同步的问题。解决方案是,添加几个简单的线程同步锁,保证文件和缓存在同一时间只有一个线程在写,同一时间可以有多个线程在读,并且在读的时候不能写,在写得时候不能读。
8.在 Windows 发的请求包中,有些包会出现未知错误,导致这种包发给 dns 服务器不会有任何回复。当初想这种情况时,线程中的 recvfrom 函数会一直卡死,导致线程无法退出,造成资源浪费。
解决方法:使用 select 函数,为 fd 描述符集设置一个超时时间,当有消息传来或是超时时间到时,跳出 select 函数,从而完成线程回收。
9.从生成的文件中读取数据时会发生错误,原因时生成文件中保存的数据长度不准确,可能有会有少数字节的偏差。解决办法:重新安排生成文件的各个记录的格式,利用 socket 准确读取出记录中数据部分的长度,从而将其完整准确读出。
## 五、测试用例以及运行结果:
1)对不良网站拦截如下:拦截 [www.yysky.net](http://www.yysky.net/)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/4b9739556ce05df4065f6ccdac7bcb33.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/17fcd7ae1634262637ee1219144e4d55.writebug)
2)对在“IP 地址--域名”对照表中指定了 IP 的网站中继如下(对与 IPV6 地址会继续向 DNS 服务器中继查询)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/825afe499c9851423481ae145af81de3.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/0eb63518d5c2daa16c73a082fa897ebd.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/3b502588aceebc7337469aa8c9be729f.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/7a6c5be99b650c499535eddccbb63bab.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/67c3bc2e592462dfbf6ff4a5d30daa7b.writebug)
3)对于不在“IP 地址--域名”对照表中的网站中继查询(也可以实现 IPV6 转发)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/3ad0741ffafd4ed5ed20c987ce94f3a5.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/406fe468206118594b981997d9f2e995.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/f4db025a5f8037a4a9d6aa8eb39938c9.writebug)
## 六、实验总结与心得体会:
在进行了一学期的计算机网络理论课程的学习之后,
我们从理论出发,进行了该次 DNS 中继服务器实验的具体实践。该实验的完成累计用时约一周,整个实验过程中使用腾讯会议平台召开了三次小组会议,实验前,我们各自回顾了计算机网络理论课程中的知识点,在回顾过程中把握各个知识点与该次实验的联系,其中主要从应用层、传输层、网络层三个模块对相关知识点进行了归纳总结,例如需要的应用层 DNS 的域名的知识点等,之后我们对本次实验的核心任务及相关知识点进行了梳理,并进行了第一次会议,通过第一次会议,我们将该次实验分成了
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
一个dns中继服务器,实现代理所有的Windows的有关dns域名ip查询的功能。拦截所有Windows的dns查询包,并中继代理,若该包存在对照表中,则该包在中继器处拦截并在此处生成应答包直接发送给Window端;拦截所有dns服务器返回的应答包,并存储进缓存中,以实现后来的查询转发功能。
资源推荐
资源详情
资源评论
收起资源包目录
100012723-基于C语言实现一个DNS中继服务器.zip (24个子文件)
dns_relay
dns_relay
cache.c 2KB
parma.h 135B
globals.h 3KB
dnsrelay.txt 152KB
dns_relay.vcxproj.filters 2KB
analyse.h 460B
cache.h 340B
analyse.c 3KB
debugOutput.h 478B
x64
Release
dns_relay.log 3B
dns_relay.vcxproj 7KB
debugOutput.c 6KB
dns_relay.vcxproj.user 595B
forward.h 143B
ip_domain.txt 2KB
forward.c 10KB
globals.c 1KB
socket.c 3KB
prama.c 1KB
LICENSE 1KB
dns中继服务器实验报告.pdf 855KB
《计算机网络》课程设计 高占春 [email protected] Tel.13701053226(1).pdf 2.82MB
dns_relay.sln 1KB
README.md 13KB
共 24 条
- 1
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7658
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功