北京网通几个月以前开始拦截 DNS, 对不能解析的域名都给出网通某些服务器的地址,这些服务器就会重定向你的浏览请求到他的广告客户那里.最常见的是一个什么 bobodogs.com ,这名字听起来就显得非常下道,网页看起来也比较恶.于是决定把它干掉.

搞掉他最简单的方式当然是用别地方的 DNS 或者自己架,但是中国网络环境并不是非常的好,自己架的 DNS 只有自己访问,缓存命中率非常低,很多请求都要直接去查询,感觉非常慢.用别处 DNS 倒是没有这个问题,但是很多大网站会根据访问 DNS 的地址来给出不同的镜像,有时候就会给你一个访问速度很慢的,因此还是要用本地的用的人多的 DNS 才好。

我用的是 linksys 的无线路由器,里面跑了一个 OpenWRT,程序都可以自己编译,本来打算去修改 dns 转发代码,如果看到结果是北京网通那些机器的 IP ,就直接返回 NXDOMAIN。没想到仔细读了一下 dnsmasq 的源代码,发现里面原来已经有这个功能了,Verisign 维护的根域名服务器也会干类似的事情,因此 dnsmasq 里面作了一个思路完全一样的实现,只要将这些 IP 都加到 dnsmasq 的命令行上面,就可以实现封掉域名劫持的效果。

观察访问记录能看出来,北京网通的转发服务器范围是 202.108.251.201-211 ,另外还有一个 202.106.195.20 , 登录进 linksys 的 shell 以后,编辑 /etc/init.d/S50dnsmasq
将 args= 一行改成

args="-B 202.106.195.20 -B 202.108.251.201 -B 202.108.251.202 -B 202.108.251.203 -B 202.108.251.204 …..

在原来的参数前面加上 -B , 每个地址需要一个 -B 参数指明, dnsmasq 不支持按网段封禁,好在不多,只有十几个,暂时还可以忍受。

然后 killall dnsmasq
/etc/init.d/S50dnsmasq

打开浏览器随便打个错误网址,IE 可以正常显示找不到 DNS 服务器。唉,为了恢复这个标准行为还要花这么大力气,上个网可真够难的。