DNS劫持的证据
昨天晚上想访问某著名视频网站, 上传一个小视频. 历经4个小时, 始终没有成功. 期间, 先后用了多种代理服务器, 及itshidden, ultravpn这种VPN程序. 本来, 按照我的理解, VPN的传输层加密加上OpenDNS, 应该可以成功穿墙.
最后发现, 穿墙失败的原因还是出在DNS解析上. 现在的GFW, 应该不仅限于篡改、劫持境内DNS服务器的主机记录. 至少, 下面的实验表明, 境内任何主机发往境外任何IP的DNS协议报文, 都会被GFW劫持(至少北京网通是这样). 并且对敏感主机记录的查询请求, GFW会伪造一个DNS的响应, 给你错误的网站IP地址.
这就使得用诸如OpenDNS, SecureDNS之类的境外DNS也不管用了, 它可能完全收不到你发的某些报文. 这也是我用itshidden和ultravpn不能访问某视频网站的原因.
事实上, GFW甚至不关心你用的境外DNS服务器是否存在, 在下面的实验里, 我分别向几个瞎编的IP发送DNS查询请求, 都能成功收到解析出的IP地址. 实验如下:
- 就爱你一生一世
- 不爱你一生一世
- 不信气不死你
- 就要气死你
如果瞎编一个DNS服务器的地址, 都能收到DNS响应的话, 说明这个响应一定是伪造的.
当然, 在实验中, 我发现了IP地址也不是随便填的. 例如设置为下面两个, 就完全收不到DNS响应. 这个结果还算正常:
- 我要死我要死
- 我不要死我就要死
我的推测是, 要么上面的地址段本身属于中国地区, 不走GFW, 要么GFW不屑于劫持发送到上面地址段的报文. (未经确认)
我在实验中同时发现, GFW的报文伪造能力相当粗糙. 稍微修改下DNS查询的类型, 伪造的报文就出问题了. 见下面两个例子:
- mx记录查询
- ns记录查询
上面的出错信息表明, 如果DNS查询不是关于主机A记录的, 如MX和NS记录, GFW伪造出来的报文格式都不对.
最后, 通过实验, 我进一步确认了, GFW的这一功能, 是安装在国内到国际的出口上。发往国内的DNS的请求就没有发现劫持和伪造的痕迹.
- 设成国内一个不存在的DNS, 如网易机房的一个不存在的IP
那我们应该怎么办呢? 应该说, 这种劫持方法并不是没有任何空子可钻.
首先, 我们可以修改hosts文件, 让那些敏感网站的IP解析完全不走DNS协议. 这是最近很流行的做法, 这种做法的缺点是人工工作量比较大. 还有一种做法是, 让DNS协议也通过VPN的加密信道发出去. 因为同是VPN方案的Hotspot Shield就可以完美的访问youtube和其他敏感站点, 我猜测是这些VPN为了提升用户体验, 没有让DNS请求也走VPN的加密信道(未经证实), 如果DNS请求本身加密了, GFW应该无从伪造.
我想象中技术上比较优雅的方案, 应该是本地运行一个DNS服务器, 通过HTTPS的方法与境外架设的服务器同步DNS记录, 这样既不用人工维护hosts文件, 也不用依赖于某个VPN. 残念…
最近评论