功能要求
一. 设计一个DNS服务器程序,读入“域名-IP地址”对照表,当客户端查询域名对应的IP地址时,用域名检索该对照表,三种检索结果:
- 检索结果为ip地址0.0.0.0,则向客户端返回“域名不存在”的报错消息(不良网站拦截功能);
- 检索结果为普通IP地址,则向客户返回这个地址(服务器功能);
- 表中未检到该域名,则向因特网DNS服务器发出查询,并将结果返给客户端(中继功能),考虑多个计算机上的客户端会同时查询,需要进行消息ID的转换。
二. 超时处理:由于UDP的不可靠性,考虑求助外部DNS服务器(中继)却不能得到应答或者收到迟到应答的情形。
三. 多客户端并发:允许多个客户端(可能会位于不同的多个计算机)的并发查询,即:允许第一个查询尚未得到答案前就启动处理另外一个客户端查询请求(DNS协议头中ID字段的作用)。
模块划分
- 命令解析及初始化模块:用户从命令行打开dnsrelay.py时,解析用户的调试等级和后端配置,并对配置文件、外部DNS的IP地址是否正确,将配置文件内容读到内存,方便后续本地查找。
- DNS报头解析模块:解析DNS报头详细信息。
- 查询报文处理模块:对于查询报文,如果TYPE类型为非1,就直接进行ID转换并给DNS服务器;如果TYPE类型为1,就以域名为key从字典中查询对应的IP,找到了就返回相应信息(注意IP为0.0.0.0的情况),找不到就ID转换并转发给DNS服务器。
- 应答报文处理模块:对于来自DNS服务器的应答报文,返回到相应客户端。
- 超时处理模块:当一段查询报文超过一定时限,返回到客户端域名不存在消息。
文件解释: dnsrelay.py是源代码 dnsrelay.txt 是本地域名IP对照表