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. 咸鱼 回复

    请教进入正题后那些”修改“、’下载”、”复制”、”批量替换“等操作具体是怎样做的?有教程的吗?

    1. cokebar 文章作者 回复

      WinSCP一个软件搞定 之前没用过么

      1. 咸鱼 回复

        找不到winscp的具体使用教程,很多命令不知道怎用,导致了不知道怎样复制命令行,一个一个字符打太麻烦了

  2. Nemo 回复

    先点赞,再测试。

  3. mazk 回复

    Chinadns不是根据chinalist判断的么?误判是什么情况?

    1. cokebar 文章作者 回复

      ChinaDNS根据解析出的IP判断(Chnroute list,是国内IP列表) 当一个国内站点存在国外服务器时候 国内DNS解析了国内IP 国外DNS解析了国外IP ChinaDNS会采用国外IP 此时误判发生 变成了走代理的访问
      ChinaDNS也只能这样 要是上述情况优先国内IP 则会出现如果国内DNS将污染域名劫持至国内IP时 无法规避DNS投毒
      此处的ChinaList是国内域名列表 手机了数千个国内网站的域名 涵盖率还是很高的 通过dnsmasq强制这些域名使用国内DNS解析避免上面的情况

      1. mazk 回复

        在dnsmasq上配置大量的域名规则性能不佳……restart的时候就卡住了……查看系统日记貌似规则会一次性加载(起码日记是都有的)所以想问问有木有提高性能方法

        1. cokebar 文章作者

          我这里完全没有卡住的现象 很迅速 2秒内重启完毕 dig测试延迟也很小

  4. Jerry 回复

    发现不管怎么搞 U2B和GoogleDrive仍然访问不了!到底是怎么回事呢?
    Google其它服务都能正常访问了,就是这两个死活连不上

    1. cokebar 文章作者 回复

      光这样说我也不知道你什么原因啊。提供一些信息才能给你排查。包括连接不上时候浏览器提供的错误类型、DNS解析结果等。还有如果之前配置过hosts请清空

  5. Nemo 回复

    博文中:

    下载 accelerated-domains.china.conf 和 foreign_list.conf 两个文件后复制两个文件到 /etc/dnsmasq.d 目录

    请问:
    accelerated-domains.china.conf 和 foreign_list.conf 不用改文件名吗?dnsmasq怎么知道什么时候该用那个conf文件?dnsmasq在luci界面中没有对这2个文件的指定,/etc/dnsmasq.conf 有 conf-dir=/etc/dnsmasq.d,也只是对路径的指定。。。

    1. Nemo 回复

      应该不会被固化到dnsmasq的ipk文件中了吧?

    2. cokebar 文章作者 回复

      conf-dir就是配置文件目录的意思啊 里面所有的文件都会被包含

      1. Nemo 回复

        所有的文件都会被包含,那就是和文件名没有关系,对吧,那么dnsmasq会解析这2个文件,形成内存里面的2张表;推测那张表是墙内,那张表是墙外的处理,估计是抽取2个标准域名判断出来的,比如baidu.com和google.com,对吧。

  6. Nemo 回复

    根据Github上dnsmasq-china-list的作者,他的配置是

    accelerated-domains.china.conf放在/etc/dnsmasq.d/
    bogus-nxdomain.china.conf放在/etc/dnsmasq.d/
    google.china.conf放在/etc/dnsmasq.d/(可选)

    dnsmasq-update-china-list放入/usr/bin/(可选)

    博主说的foreign_list.conf 来源于gfw list ipset rules for dnsmasq,跟bogus-nxdomain.china.conf的内容完全不一样,看的有点糊涂了。

    1. cokebar 文章作者 回复

      我只是用了他的Chinalist列表没用其他的 方案不同

    2. cokebar 文章作者 回复

      bogus-nxdomain.china.conf是国内运营商的nxdomain劫持,就是那种输入了错误域名跳转提示那种

  7. SS 回复

    看了你的这么多篇路由翻墙的文章。发觉始终没能解决我的实际问题。可能是我的理解能力有问题。
    请问那一开始写的三种翻墙方法,哪个是可以基于域名来定黑白名单走Shdowsocks的?
    我试了两晚,感觉dns解析应该ok的了,但是哪个域名该走代理却不能随心控制。
    感觉唯一能搞到的地方只有SS忽略列表ip设置那里?不能用域名?

    1. cokebar 文章作者 回复

      GFWList方案 List中的域名走代理。说黑白名单不明确。你是要特定域名不走代理还是特定域名走代理?
      话说三篇我开头都大概说了方案的思路,chnroute方案我也说了是根据IP判断的,既然根据IP判断就不可能能精确控制域名。GFWList本身就是域名列表

      1. SS 回复

        GFWList方案里面也有个dnsmasq_list.conf 啊,会不会和这里的 foreign_list.conf 混了?

        1. cokebar 文章作者

          GFWList方案本身无本篇所述问题 不适用这一篇的方法

      2. SS 回复

        看来我之前把两个混在一起了,我再试试。
        GFWList方案里的shadowsocks里面的代理方式要选哪个?全局代理、忽略列表还是用手工代理?
        我是直接在luci里设置的。

        1. cokebar 文章作者

          额 GFWList方案你都没好好看吧。。。spec版本的shadowsocks是chnroute方案,GFWList方案请使用非spec版本

        2. SS

          请问DHCP/DNS里的解析文件原始设置是什么的?我之前用chinadins时把这个弄丢了。
          另外我想用dig检测,提示dig not found,请问要装什么?

    2. SS 回复

      感谢。终于搞定翻墙了。
      发觉用新版redsocks2自带的shadowsocks来做gfwlist方案貌似行得通?虽然redsocks自身的那些检测方案用不上黑白名单也没用,但其余按照方案里面的设置dnsmasq和防火墙,测试wikiwiki.jp确实是用dnsmasq_list.conf里的地址走了。这货虽然没墙,之前国内ip直走每隔几分钟就来一次人机检验,但是用SS走就不用检。我自身的水平其实只会用别人的固件。感觉每更新一次都要删了他的spec版本然后又装过再设置实在很麻烦,如果能用redsocks2来跑gfwlist方案那就省上不少功夫。

      另外博主提供的dnsmasq_list.conf里巴哈姆特的怎么只有.2.bahamut.com.tw而没.bahamut.com.tw?不然很多版面都框架全没。。。

      1. cokebar 文章作者 回复

        这个自动生成无法做到很完美,因为原gfwlist是正则匹配。。无法等价转化为dnsmasq的规则,遇到这种情况只能手动改了

  8. Max 回复

    有么有办法通过计划任务,自动更新accelerated-domains.china.conf并自动替换114.114.114.114为指定的DNS?

    1. cokebar 文章作者 回复

      自己写个bash脚本加到crontab就行了,注意处理一下下载失败的意外情况就行

      1. Max 回复

        不好意思。。。没有这方面的基础,靠Google研究了半天还是没弄明白。。。不知道能不能麻烦你帮忙写一个?谢谢。

    2. cokebar 文章作者 回复

      你是不是江苏南通的?有一个IP不断地在下载服务器的foreign list.conf文件 已经屏蔽IP段。是不是你写的脚本有问题

      1. Max 回复

        不是我。。。大概是谁crontab定时没设置好,太频繁了。。

        1. cokebar 文章作者

          坑爹啊 这种文件以后再也不放自己服务器上了

        2. cokebar 文章作者

          唉 这些人啊。。。 用不好还坑我 我已经删了文件了 那些人只能收到404 上不去网不怪我

  9. Toby 回复

    博主,请教一下Dnscrypt怎么样,据说是可以解决DNS污染,不知道和ChinaDNS相比哪个效果好一点?

    1. cokebar 文章作者 回复

      需要服务端支持,意味着要么你需要自己配置服务器要么你就得用opendns。。延迟很高

  10. Max 回复

    对不住你。。。是我多嘴贴出来。。。不好意思啊。。。

    1. cokebar 文章作者 回复

      不怪你 你的脚本对会用的人很有用

发表回复

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

请输入验证码 *