OpenWRT防止DNS污染

话说写了这么多和谐的东西,不是给我封了吧…

那天家里停电,回来的时候发现路由器爬不了梯子了,手动重启shadowsock也不行,但是用ss的客户端还是可以访问的,现在是openwrt上有问题,DNS用的是8.8.4.4,当时想应该不会被污染吧,找了一圈都没有找到原因,于是在openwrt上装了个dig试试DNS解析,opkg install bind-dig,查了一个fb,果然dns被污染了,被解析到了一个159.106.121.75的IP上.以为是dnsmasq的dns服务器IP没有配置对,搞了一大圈,虽然没有效果,指定dns server 解析

dig @8.8.4.4 www.facebook.com

居然也被污染了,心想可能是8.8.4.4被劫持了,那换一个私有的dns服务器来解析总可以吧,把linode的dns 的IP来试试居然还是不行,这…已经非常明显了..一定是dns解析的53端口被劫持了..

换一个opendns的5353端口试试

dig @208.67.222.222 -p 5353 www.facebook.com

解析正常..操蛋的电信,居然把53端口上的所有流量都劫持了,不知道什么时候又会弹出小广告出来.但是为什么停电了之后就被劫持了,之前都没有发现呢.原来之前科学上网用的是ipset,把gfwlist域名的IP都缓存起来了,所以一直能取到正确的IP,停电之后路由重启,缓存数据丢失,重新从8.8.4.4解析的时候,由于端口被劫持,所以解析出了错误的IP,存在缓存里由ss请求的也是错误的IP,所以就没有办法科学上网了

我们都知道dns解析用的是UDP,是明文的数据,端口都能给劫持了,其它流量的嗅探不是信手拈来了(这样的话之前用dns解析上和谐网站的情况不是被发现了…好怕怕..)所以调整dns端口不是最好的办法.好在opendns提供了dns加密访问的服务,需要安装dnscrypt-proxy对本地的dns请求进行转发

基本原理是,让所有的dns请求由dnscrypt-proxy加密转发,而OpenWRT用的是dnsmasq作为dns的缓存组件,可以查看/etc/resolv.conf发现OpenWRT的DNS服务IP是指向127.0.0.1的,而dnsmasq绑定了53端口,所以这个dns解析流是

browser-> 127.0.0.1:53(dnsmasq)->127.0.0.1:xxxx(dnscrypt-proxy) ->加密数据-> opendns server

由于是加密数据,所以嗅探起来会比较难,我们暂且认为是安全的

OpenWRT官方有提供/etc/config/dnscrypt-proxy的包.直接安装opkg install dnscrypt-proxy就可以了,安装完成后,配置数据监听的端口/etc/config/dnscrypt-proxy

20151212171948

设置为开机自启动,并且启动

/etc/init.d/dnscrypt-proxy enable

/etc/init.d/dnscrypt-proxy start

 

修改dnsmasq配置,让它请求到dnscrypt-proxy上

/etc/config/dhcp

20151212172431

重启dnsmasq

/etc/init.d/dnsmasq restart

如果一切正常的话,访问opendns的官网https://www.opendns.com/welcome/ 会出现如下图

20151212172740

 

最后让我意外的是,如果DNS正常解析的话,墙内是可以上twitter的…….

Leave a Reply

Your email address will not be published. Required fields are marked *