2015年12月21日星期一

没有GFW的互联网,从一个正常的DNS开始。

GFW干尽坏事,千方百计阻止中国人民自由地使用互联网。首要的手段就是进行DNS污染——在输入域名以后,给一个错误的IP地址。由于DNS是个古老的服务,并没有考虑到这种攻击,也就缺乏能够应对的手段。感谢上帝,智慧的中国人民发明了各种各样的梯子来跨过防火墙,那么也就有了将DNS恢复正常的办法——自己建立DNS服务器,国内的网站还是使用ISP给的DNS,国外的网站全部通过翻墙通道从国外获取IP地址。

自己建立一个没有污染的DNS服务器,不仅可以正常使用互联网,还可以隐藏自己访问国外网站的踪迹,并且在有大规模DNS故障的时候(已经发生了至少三次全国性DNS故障导致无法上网)自己仍然可以联网。下面谈谈思路以及实现:

这篇文章 提到了自己建立递归DNS服务器,根据DNS递归查询原理,国外的域名都会向国外的DNS发起查询,只要这个查询结果不被GFW篡改,就可以获得准确的IP地址。那么,建立这样的一个机制:一个递归DNS服务器,它上面所有对国外IP发起的通讯,尤其是DNS查询,走VPN或其他翻墙手段出去。文章中的办法是使用VPN,但是近年来VPN频频被干扰。大家用的翻墙手段是各种各样,这些手段都有一个共性:在本机会有一个socks5的代理。因此,只要在原文章里的办法上加一些改进,让DNS查询这种UDP通讯能够从SOCKS代理出去,那么就可以有效地抵抗污染。

 这个技术有两个关键点:
1) UDP包能够转发到socks5代理。
2) socks服务器支持UDP转发。

实现第一点是本文的核心。有如下一些步骤:
1) 采用IP分流技术,从APNIC获取中国大陆IP地址段,用路由的方式规定国外IP段都走到一个虚拟网卡去。
2) 使用tun2socks软件,建立一个虚拟网卡设备:tun,用来接收分流过来的数据包,包括TCP和UDP包,并将这些包转发到socks代理端口去。
3) socks代理将这些包都转发到socks服务器。这个socks代理,可以是Shadowsocks,更可以是Tor等翻墙软件所建立的。

实现第二点,以最常见的Shadowsocks来说, 服务器上安装Python版本的Shadowsocks是不支持UDP转发的,只有Shadowsocks-libv才可以实现。Tor也是支持的(?)

建立递归DNS服务器之后,还需要设定缓存,如果使用BIND作为递归服务器,是没有缓存的,只好再建立一个Dnsmasq之类的纯转发和缓存DNS,用户计算机的DNS设定为Dnsmasq,再由它去问BIND。这样显得结构很复杂,也不太容易在一台计算机上建立好,因此还可以使用其他DNS软件,如PowerDNS等来做递归和缓存服务器。

没有评论:

发表评论