(最新DNS解析的改善方法已经合并至《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网》的DNS配置部分,本文为旧版本)
本人博客中提到的自动科学上网路由器方案,大都使用了ChinaDNS提供防污染、优化解析的DNS服务,不过实际使用中还是会遇到很多的误判情况,一是多见于存在海外CDN服务器的国内网站,导致访问国内站点走代理;二是某些ISP的DNS存在劫持现象导致ChinaDNS无法正确处理导致无法爬墙。而这里就是探讨改善这种情况的方法。
这里的思路为:
1、利用GFWLIST,保证被墙网站走国外DNS解析;
2、利用ChinaList,保证List中的国内域名走国内DNS解析(涵盖的网址还是非常多的);
在这里要感谢一下dnsmasq-chinalist的作者!Github页面:
https://github.com/felixonmars/dnsmasq-china-list
3、不在上述List中的站点再交由ChinaDNS判断。
经过这3类情况的分别处理,应该能够正确处理绝大部分网站的解析了。
进入正题吧,该方法利用dnsmasq对上述情况进行区分。
修改 /etc/dnsmasq.conf ,去除你之前自定义的规则,在最后加入 conf-dir=/etc/dnsmasq.d ,新建并进入目录 /etc/dnsmasq.d ,下载 accelerated-domains.china.conf 和 foreign_list.conf 两个文件后复制两个文件到 /etc/dnsmasq.d 目录。
PS:两个文件都会有更新,建议隔段时间更新一下。
分别修改两个文件,利用批量替换功能修改:
将 accelerated-domains.china.conf (ChinaList)文件中所有的的114.114.114.114修改为自己ISP的DNS或者其他效果更好的国内DNS的IP地址(也可以保留114DNS),格式为:
1 |
server=/0-6.com/IP |
将 foreign_list.conf (GFWList)文件中所有的 127.0.0.1#5300 修改为自己所用国外DNS,格式为:
1 |
server=/.lsxszzg.com/IP#PORT |
如果你使用shadowsocks的UDP转发来提供国外DNS解析,UDP转发的端口号为5300,那么就是默认的 127.0.0.1#5300 ,如果你使用一个非标端口的国外DNS服务,如3.4.5.6,端口5353,那么就改为 3.4.5.6#5353 。注意不要使用国外公共DNS,因为会被污染!
接着,确保luci中的配置填写的是ChinaDNS的地址:
最后重启dnsmasq服务:
1 |
/etc/init.d/dnsmasq restart |
当然,如果你觉得用不着分这么清楚,你也可以根据自己的情况,采用如下方案:
1、单使用GFWList,其他全部走国内DNS
2、单使用ChinaList,其他全部走国外DNS(或者ChinaDNS)
3、结合GFWList与ChinaList,其余全部使用国内DNS或者国外DNS,抛弃ChinaDNS
PS1:本人遇到的特殊情况,移动铁通网络,google-analytics.com遭DNS劫持(联通电信应该会解析到谷歌仅剩的若干个北京或者上海服务器,可正常连接,这两个ISP的用户如果正常解析到北京或者上海服务器就不用管了),导致部分使用了Google Analytics的站点一直转圈无法加载完成(虽然不影响页面正常内容的显示)。之前是没劫持的不过那几个服务器没几个能连上的所以解决方法还是让其走国外DNS解析,在foreign_list.conf中将其添加进去后问题解决。
引用: 小米路由器Mini 配置自动FuckGFW路由器 | Sweet
引用: Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙 | 清风明月
引用: Note for Router Fix – Jeff's space
引用: 小米路由器MINI配置科学上网 | 静觅