本文共 2444 字,大约阅读时间需要 8 分钟。
可以看到dns解析是最初的一步,也是最重要的一步。比如访问亲友,要知道他的正确的住址,才能正确地上门拜访。
dns有两种协议,一种是UDP(默认),一种是TCP。
在linux下可以用dig来检测dns。国内的DNS服务器通常不会返回正常的结果。
下面以google的8.8.8.8 dns服务器来做测试,并用wireshark来抓包,分析结果。 1 | dig @8.8.8.8 www.youtube.com |
dns-udp-youtube
从wireshark的结果,可以看到返回了三个结果,前面两个是错误的,后面的是正确的。
但是,对于dns客户端来说,它只会取最快回应的的结果,后面的正确结果被丢弃掉了。因为中间被插入了污染包,所以即使我们配置了正确的dns服务器,也解析不到正确的IP。
再用TCP下的DNS来测试下:
1 | dig @8.8.8.8 +tcp www.youtube.com |
dns-tcp-youtube-reset
从wireshark的结果,可以看出在TCP三次握手成功时,本地发出了一个查询www.youtube.com的dns请求,结果,很快收到了一个RST回应。而RST回应是在TCP连接断开时,才会发出的。所以可以看出,TCP通讯受到了干扰,DNS客户端因为收到RST回应,认为对方断开了连接,因此也无法收到后面正确的回应数据包了。
再来看下解析twitter的结果:
1 | dig @8.8.8.8 +tcp www.twitter.com |
结果:
1 2 3 4 5 | www.twitter.com. 590 IN CNAME twitter.com. twitter.com. 20 IN A 199.59.150.7 80 twitter.com. 20 IN A 199.59.150.7 twitter.com. 20 IN A 199.59.149.230 twitter.com. 20 IN A 199.59.150.39 |
这次返回的IP是正确的。但是尝试用telnet 去连接时,会发现连接不上。
1 | telnet 199.59.150.7 80 |
但是,在国外服务器去连接时,可以正常连接,完成一个http请求。可见一些IP的访问被禁止了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ telnet 199.59.150.7 80 Trying 199.59.150.7... Connected to 199.59.150.7. Escape character is '^]'. GET / HTTP/1.0 HOST:www.twitter.com HTTP/1.0 301 Moved Permanently content-length: 0 date: Sun, 08 Feb 2015 06:28:08 UTC location: https://www.twitter.com/ server: tsa_a set-cookie: guest_id=v1%3A142337688883648506; Domain=.twitter.com; Path=/; Expires=Tue, 07-Feb-2017 06:28:08 UTC x-connection-hash: 0f5eab0ea2d6309109f15447e1da6b13 x-response-time: 2 |
想要获取到正确的IP,自然的黑名单/白名单两种思路。
下面列出一些相关的项目:
1 2 3 | https://github.com/holmium/dnsforwarder https://code.google.com/p/huhamhire-hosts/ https://github.com/felixonmars/dnsmasq-china-list |
顺便提一下,实际上,kubuntu的NetworkManager会自己启动一个私有的dnsmasq进程来做dns解析。不过它侦听的是127.0.1.1,所以并不会造成冲突。
1 | /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf |
基于OpenWRT/Tomoto的路由器可以在上面配置dns server,从而实现在路由器级别智能dns解析。现在国内的一些路由器是基于OpenWRT的,因此支持配置dns服务器。
参考项目:
1 | https://github.com/clowwindy/ChinaDNS |
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7462657.html,如需转载请自行联系原作者