OpenWRT 自动科学上网路由器 DNS 解析的改善 (旧)

(最新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),格式为:

foreign_list.conf (GFWList)文件中所有的 127.0.0.1#5300 修改为自己所用国外DNS,格式为:

如果你使用shadowsocks的UDP转发来提供国外DNS解析,UDP转发的端口号为5300,那么就是默认的 127.0.0.1#5300 ,如果你使用一个非标端口的国外DNS服务,如3.4.5.6,端口5353,那么就改为 3.4.5.6#5353 。注意不要使用国外公共DNS,因为会被污染!

接着,确保luci中的配置填写的是ChinaDNS的地址:

dnsforwarder

最后重启dnsmasq服务:

当然,如果你觉得用不着分这么清楚,你也可以根据自己的情况,采用如下方案:

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中将其添加进去后问题解决。

 

152 条评论

  1. 春夏秋冬 回复

    我在没安装chinadns情况下,用tcp方法解决DNS污染,国外网站不管有没有被墙,都会走ss.这样SS量就会加大,有没有方案,让国外不被墙的网站走国内的DNS

    1. cokebar 文章作者 回复

      chnroute方案根据IP地址判断是否走ss,即使用国内DNS只要IP是国外依然走ss。推荐你使用gfwlist方案

    2. toma62299781 回复

      朋友你好,我对你tcp方案很感兴趣,能讲下实现方法么?谢谢~

      1. cokebar 文章作者 回复

        善用右上角的搜索框

        1. toma62299781

          哦哦,谢谢了。我觉得那位春夏秋冬的tcp解决方案很适合我。没想到作者你这里也有,就没去搜索啦~

  2. 引用: 小米路由器Mini 配置自动FuckGFW路由器 | Sweet

  3. arfaWong 回复

    请问accelerated-domains.china.conf 这个文件要怎么更新?执行了他那个py文件好像也没有用。想把这个放到op里做定时任务。

      1. arfaWong 回复

        wget 之后再自己手动改ip? 🙁

        1. cokebar 文章作者

          sed批量替换

      2. arfaWong 回复

        根据你的gfwlist2dnsmasq,写了一个python脚本 🙂

  4. 引用: Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙 | 清风明月

  5. churchmice 回复

    现在解析正确的DNS大概以下几种方法:
    1. 用ss-tunnel,经常出现解析不到的情况,不知道是否ss-tunnel的UDP转发有问题,我相同的设置,公司网络没问题(电信企业宽带),家里就不行(长宽)
    2. 自己搭建vps用非53端口,这个现在也被GFW关照了,也挂了
    3. 使用tcp模式查询,装pdnsd,上游dns用8.8.4.4,同时把8.8.4.4.加入代理列表,这个一切正常
    4. chinadns,不是很稳定
    5. dnscrypt-proxy,时好时坏,用tcp查询的话,dig能看到返回的结果,但是dnsmasq不认,报bad addresss
    6. 墙内建一个无污染的DNS(比如我公司的DNS就是无污染的),但是实验显示现在DNS污染已经不仅仅在墙上了,一切骨干网络上也会污染,我墙内查询公司的无污染DNS返回的还是被污染过的IP,所以这方法也不行

    最终用了方案3,一切正常,虽然说tcp损失点性能,但是我只有被墙的网站才走pdnsd,而且pdnsd还可以设置缓存,我一般都缓存一天.

  6. mk47 回复

    po主你好,foreign_list.conf 现在要通过什么方式更新,太老旧了

      1. mk47 回复

        感谢,我在vps用了后不知道生成到哪里了,tmp里没conf文件

  7. root 回复

    你好。我用了UDP转发和ChinaDNS的方案,正常工作,现在按照本文操作 “结合GFWList与ChinaList,其余全部使用国外DNS,抛弃ChinaDNS” 的话,是不是需要按照 “3、Shadowsocks + GfwList ”的方案重新设置 ipset 并 取消勾选 “忽略解析文件”并设置gfwlist为 UDP转发的端口呢?
    谢谢。

    1. cokebar 文章作者 回复

      除过DHCP/DNS设置里面DNS转发那一项,其余只需完全按照本文的方法配置即可(本文是结合了chinalist和gfwlist,其余走chinadns)。至于DNS转发那一项,本文填的127.0.0.1#5353是转发到chinadns里去了,如果不想用chinadns,这里直接填入isp的dns或者国外公共dns即可。

      1. root 回复

        不好意思,还是不太能理解,可否再帮我理一下思路。。。 谢谢。
        我卸载掉chinadns后,域名部分肯定是按照dnsmasq的配置来走的,gfwlist走ss,chinalist直连,其他列表外的走dnsmasq的转发填的UDP转发的端口,这个我理解了。可是这样卸载掉chinadns后,shadowsocks的 IP 包是怎么走的呢?

        1. mk47

          更新chinadns_chnroute.txt文件,在ss底部排除路径那点custom,输入/etc/chinadns_chnroute.txt.

        2. cokebar 文章作者

          如果使用aa65535版本的shadowsocks,那么shadowsocks只根据忽略列表来判断是否走代理,国外IP走代理,只要解析的是国外IP。至于GFWList方案,根本用不着使用此文章的方法。

      2. root 回复

        openwrt跑了两天后感觉很卡。。 又刷回dd了。。。。

  8. 引用: Note for Router Fix – Jeff's space

  9. 引用: 小米路由器MINI配置科学上网 | 静觅

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

请输入验证码 *