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. c 回复

    之前按照Shadowsocks + ChnRoute的方式一直在用,这两天突然翻不动了,各种重启也无果,
    然后上来看到这篇文章,再加上刚好最近买的ss支持udp转发,就照着做了下
    然后发现翻起来有点慢,有的网站或者国外网站干脆打不开….
    不知道是哪里出了问题…
    会是SS太慢的问题么

    1. c 回复

      诶刚把这些设置去掉,没做任何防污染措施。又能行了 = =

    2. cokebar 文章作者 回复

      不要使用114DNS

      1. c 回复

        我之前的确用的114,最近帮个与改用的北京联通的dns,,,

    3. c 回复

      刚刚过了会又不行,重启了下chinadns dnsmasq貌似就没事了 (虽然我也不知道到底是重启哪个起的作用= =

      1. cokebar 文章作者 回复

        使用自己ISP的DNS,如果不知道,查看WAN口自动获取的DNS地址,系统状态中可以看到。不要使用网上搜索到的,不一定一样

        1. c

          嗯嗯明白了。感谢。
          有问题再来烦扰 orz

  2. Leyar 回复

    Hello,如果使用的自建 DNS 服务器,我测试了下几个国内地址没发生误判,
    这种情况还需要进行现在文中的操作么?

    1. keiven 回复

      自己的DNS 建议不要用53 端口,否则一样会被污染。我广州电信,亲测!

  3. Sxx1314 回复

    楼主 建议你直接把 列表更新到 coding 或者csdn 之类国内的代码托管 github也行 这样方便直接路由设置计划任务自动下载啊 人力太麻烦了

  4. Sxx1314 回复

    不过好像也是n久没更新的列表。。。。

  5. 韩少西 回复

    你好,我按照这些步骤做好之后,Mac上面的地图应用还是加载不出来,一片空白,我看Chinalist已经把关于地图的域名都加进去了,dnsmasq我也重启了,路由器也重启了,想问一下,是哪里出错了?电脑的dns缓存我也清除了。谢谢。

    1. cokebar 文章作者 回复

      先找出所有相关域名包括CDN域名,再检查获取的IP是国内还是国外,以此为思路。你的问题我不可能重现因为我没有Mac设备只能提供个思路。关键在于找出:是国内DNS解析的可用还是国外的,是走代理可用还是不走可用

      1. 韩少西 回复

        算啦算啦,放弃了,平常也不用。谢谢哈。

  6. Song 回复

    你好,我想问一下,如何抛弃ChinaDNS只用你提供的这两个规。
    关闭ChinaDNS插件服务,然后把”DNS转发”清空就可以么?“忽略解析文件”的对号要不要去掉呢?

    1. cokebar 文章作者 回复

      需要。而且忽略解析文件去掉后还要把之前的解析文件路径填进去。

      1. Song 回复

        已经不记得默认解析文件是什么了…… /tmp/resolv.conf.auto是个这么?
        在这看到的https://github.com/shadowsocks/openwrt-shadowsocks/issues/21

  7. Allen 回复

    这个周末看了楼主的问题,获益匪浅。在下有个问题想请教一下:我按你之前文章所讲的使用 pdnsd 替换了dnsmasq,希望获得缓存优化的效果,这个 Chinalist 列表在 pdnsd 里面也能被支持吗?如果不行,用dnsmasq做 pdnsd 的前级是不是可以?谢谢。

    1. cokebar 文章作者 回复

      pdnsd的格式不同,但可以转化

  8. 艾斯 回复

    博主你好,这种情况下应该不需要chinadns了。因为chinadns的初衷是国内域名走国内的dns,其他域名走国外dns。既然你这里已经对国内域名列表了,因此直接在dnsmasq中指定这部分域名使用国内的dns即可,其他全部域名直接指定走本地shadowsocks转发的国外dns。
    可以参考chinadns的github页面所说,chinadns就是为了避免维护一个经常变化的国内域名列表才诞生的:
    The second way is to maintain a list of domains of which you want to resolve from local DNS or foreign DNS. This list changes too often, taking too much effort to maintain.

    ChinaDNS automatically queries local DNS servers to resolve Chinese domains and queries foreign DNS servers to resolve foreign domains. It is smart enough to work only with a Chinese IP range file, which doesn’t change often.

    1. cokebar 文章作者 回复

      保留ChinaDNS是比较保守的做法 因为chinalist的覆盖率肯定是很有限的 毕竟站点太多了 对于非list中的站点继续采用chinadns判断一次会再做一次分类 更精确 更保守一些。
      不过单使用chinalist应对国内常用站点完全足够了 要不用ChinaDNS的话我建议采用文末提到的chinalist+gfwlist配合的方法 然后不在两个列表的走国内DNS 毕竟大多数访问的国外站点很有限 针对国内网站采用国内DNS要好一些 避免一些国内网站访问缓慢

    1. cokebar 文章作者 回复

      泰国IP。。。 这个URL我这里无论直连还是走代理都是HTTP 403 无权访问

      1. Song 回复

        是个漫画图片站,应该是动态的IP,我每次刷新都会换IP,估计还定期清空。
        我遇到的情况是,走带ss的路由器A就无法加载大图。
        直接连A上一级路由器,无ss就正常。
        换了一个网络环境,另一个有ss的路由器B下也能正常打开图片。

        1. Song

          补充
          关闭路由器ss插件就恢复正常……
          忽略列表已更新 无效
          udp转发开关 无影响
          udp中继 未开启过

        2. Song

          又测试了一下,是有ss的路由器就会出问题,应该是根据IP判断的,可惜我找不到这个站的判断规则……

    2. cokebar 文章作者 回复

      如果是chnroute方案 那么只要是国外IP就会走代理

      1. Song 回复

        我直接没装chinaDNS插件,或许是服务器那面php判断的?这个真的感觉有些无解-_-#

        1. cokebar 文章作者

          走不走代理和ChinaDNS没关系

  9. 回复

    你好,我按照教程安装配置了chinadns和本文讲的这个,但是,打开优酷土豆提示,本视频仅限中国大陆,请问这个怎样可以解决呢?

    1. cokebar 文章作者 回复

      请确认chinadns的chnroute文件和shadowsocks的忽略文件的配置正确,并且该文件内容正确(应该是数千行的IP段的列表,文件大小在80KB左右)
      同时可以测试一下解析是否正确:nslookup static.youku.com,看下返回的IP是否为国内

      1. 回复

        感谢博主的解答,我看了下忽略文件只有60KB左右,重新做了下调整,然后重启路由器,刷新dns后可以了,谢谢

发表回复

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

请输入验证码 *