求助——DNS代理服务器问题
在做一个爬虫,为了避免DNS解析阻塞带来的瓶颈,提高爬虫的爬行速度,设计DNS代理服务器,来解决客户端DNS阻塞的问题,在爬虫客户端和DNS服务器中间加设了DNS代理服务器
DNS代理服务工作内容:
1 监听53端口的来自爬虫客户端发出的DNS解析请求UDP报文
2 将报文转发给DNS服务器
3 监听53端口的来自DNS服务器发出的DNS解析回复
4 将DNS回复转发给请求的爬虫客户端
面临的问题:
目前DNS代理服务器上已经用JAVA实现了:53端口的DNS请求的监听,以及DNS请求的转发,但是发现爬虫客户端并不能识别DNS代理服务器转发来自DNS服务器的回复
实现的过程是这样的:代理服务器监听53端口的数据报,第一次收到数据报后,将报文再发给DNS服务器,然后在接收DNS代理服务器的UDP反馈数据报,同样将数据报在发给爬虫客户端。但是爬虫客户端不能识别接收到的数据报
测试过程:
在爬虫客户端,将网卡的DNS服务器设为代理服务器网络地址,使用windows自带的DNS工具NSLOOKUP 请求解析 www.baidu.com 的域名
在客户端通过网络抓包工具,捕捉到了整个过程,发现了发送给DNS代理服务器的在53端口上的UDP数据包,和收到的代理服务反馈的UDP数据包,解析包的内容,其中也包含解析的IP地址,但是NSLOOKup工具就是不能接受或识别返回的数据包,浏览器也不能识别,依然显示域名服务器无响应。
在DNS代理服务器上也通过使用抓包工具,将整个过程的数据包抓取下来分析,该有的数据都有,数据包的内容也与不使用DNS代理所抓数据进行比对,没有发现异常的地方。
问题可能的推测:
1 由于代理服务器返回超时,导致爬虫客户端判断超时放弃接收数据,而此时恰好代理服务器将数据发来,不知道有没有这么巧
2 通过对数据包的分析对比发现,ipv4 header 中flag 部分有出入,收到的DNS服务器发来的数据包中ipv4 header 的flag 部分为do not fragment 但是爬虫客户端收到的DNS代理服务器发来的转发数据包中该部分为fragment,不能确定是不是这个原因;根据对OSI分层协议的理解,DNS是建立在UDP传输协议上的,应该只和UDP协议相关,而与其之下的IP层不相关。所以推测不是这个原因。但是关于UDP数据包,数据已经做了详细的比对没有发现,爬虫客户端与DNS代理段收到的回复数据有什么不同
3 DNS欺骗的防护策略,可能基于DNS协议本身,有某种防止DNS转发的机制,使得不可以只用非权威的DNS代理,因为找RFC1035文档也没有找到相关内容所以不知道的具体是如何实现的
请求大家帮助
------解决方案--------------------
端口问题,httpclient 在请求DNS解析时这个数据报并不是从本机的53端口发出的,而是一个随机的端口