DNS解析污染原理——要么修改包,要么直接丢弃你的网络包

Posted 将者,智、信、仁、勇、严也。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DNS解析污染原理——要么修改包,要么直接丢弃你的网络包相关的知识,希望对你有一定的参考价值。

DNS/域名解析

可以看到dns解析是最初的一步,也是最重要的一步。比如访问亲友,要知道他的正确的住址,才能正确地上门拜访。

dns有两种协议,一种是UDP(默认),一种是TCP。

udp 方式,先回应的数据包被当做有效数据

在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 方式,有时有效,可能被rest

再用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

 

本地DNS软件

  • 修改hosts文件
    相信大家都很熟悉,也有一些工具可以自动更新hosts文件的。
  • 浏览器pac文件
    主流浏览器或者其插件,都可以配置pac文件。pac文件实际上是一个JS文件,可以通过编程的方式来控制dns解析结果。其效果类似hosts文件,不过pac文件通常都是由插件控制自动更新的。只能控制浏览器的dns解析。
  • 本地dns服务器,dnsmasq
    在linux下,可以自己配置一个dnsmasq服务器,然后自己管理dns。不过比较高级,也比较麻烦。

顺便提一下,实际上,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

 

路由器智能DNS

基于OpenWRT/Tomoto的路由器可以在上面配置dns server,从而实现在路由器级别智能dns解析。现在国内的一些路由器是基于OpenWRT的,因此支持配置dns服务器。
参考项目:

1
https://github.com/clowwindy/ChinaDNS





以上是关于DNS解析污染原理——要么修改包,要么直接丢弃你的网络包的主要内容,如果未能解决你的问题,请参考以下文章

Git 基础教程 之 撤销修改

网站访问原理与GFW原理简述

网站访问原理与GFW原理简述

DNS 域名劫持域名污染

DNS污染和DNS劫持的解决办法

Ingress 原理及实例