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和本文的,怎么本文的没有生效?国外的全走代理呢?把域名添加到accelerated-domains.china.conf 也是走的代理,这是为什么呢?

    1. cokebar 文章作者 回复

      chnroute方案开头说的就很清楚了 在chnroute中的IP(国内IP)不走代理 其他所有IP(国外IP)都走代理 和使用国内还是国外DNS没有直接关系

      1. 夏夕 回复

        可是用ChinaList可以使文件中的域名走国内的dns啊,然后国内dns解析一个国内ip,就能直接连接不走ss代理了。请问这样不能做到么?谢谢。

    2. cokebar 文章作者 回复

      只要是服务器在国外的,你用哪个DNS解析出来也都是国外IP啊

      1. 夏夕 回复

        原来如此,抱歉,昨晚忘回复了。用www.speedtest.net测速总是要走代理。
        我用ms自带的nslookup查看的,
        用192.168.1.1 dns查询 域名www.speedtest.net 别名解析到了 cs62.adn.xicdn.net,是澳大利亚的ip。
        用isp的dns解析到的是国内的ip,还有动漫花园的pt站,里面看到ip总是走了代理的。想请教一下怎么让他们不走代理?像黑白名单那样。

    3. cokebar 文章作者 回复

      本方案基于IP判断而不是域名, 对于多服务器,使用CDN的站点没法区分,IP太多。如果想基于域名,可以用gfwlist方案。

      1. 夏夕 回复

        嗯,刚试了试试gfwlist方案,怎么还是国外的全走代理,把chinadns都停用了。软件是shadowsocks-libev-spec,自己编译的。再试试重刷路由,重新设置一遍。

        1. cokebar 文章作者

          spec就是chnroute. 看清楚了gfwlist方案用的不是spec

  2. linxuan 回复

    博主,我是小白一个,有很多看不懂。
    【情况】现在手上有一个newifi mini,已经刷了pandora的系统,刷好自带shadowsocks和chinadns-c,“系统”-”软件包“里显示的版本分别是ChinaDNS-C 1.2.1 、 luci-app-shadowsocks 0.12+svn-r355-1 shadowsocks-libev 1.6.1-888c2438c3d91129fa76eac506b52b0cfed9dc44 。
    【我做的操作】配置好ss账号后,我把chinsdns-c里的”中国路由表全部复制到ss的“透明代理”-“ip白名单”里,
    我想实现的是仅gfwlist里的网站走ss代理,按这篇文章里的说明,下载了 foreign_list.conf,放在 /etc/dnsmasq.d里,修改了/etc/dnsmasq.conf,将 foreign_list.conf (GFWList)文件中所有的 127.0.0.1#5300 修改8.8.8.8#5353(5353是你文件里的默认,我没修改)。
    【存在的问题】twitter、ytb、fb等都能正常访问了,但是,上优酷部分电视剧显示“仅限中国地区播放……”。
    请教下,应该怎么解决?谢谢!

    1. cokebar 文章作者 回复

      ROM自带的包通常是作者自行修改 不适用于本文

      1. linxuan 回复

        啊。。。那我再想想办法。。。

  3. 引用: 正向翻墙科技备忘录 – 飞羽博客 三种shadowsocks在openwrt上的自动翻墙方案 | 一半君的备忘录

  4. void 回复

    你好,请问foreign_list.conf 这个文件以后要更新是到哪更新呢?还是到博主你这里来么?
    另博主头像是谁啊?

    1. cokebar 文章作者 回复

      自动生成脚本我放GitHub了,回头我看能不能弄成定期发布的

    2. cokebar 文章作者 回复

      头像是五更琉璃

  5. ivys.wen 回复

    cokebar 怎么没有介绍一下dnscrypt-proxy,我觉得用它做上游dns很不错啊。

  6. NintendoFans 回复

    参照博主的教程设置之后,能翻墙了,但是唯独youtube,twitter,facebook上不去。。

  7. 回复

    博主,请问dnadmasq增加了这两个本文的两个列表后,shadowsocks设置ignore list 是不是仍然保持/etc/ignore.list;ChinaDNS里CHNRoute file: /etc/ignore.list? 谢谢!

    1. cokebar 文章作者 回复

      是的。本文对dnsmasq的配置用来优化dns解析,而shadowsocks的ignore.list则是判断走不走代理的基础。

  8. lzs 回复

    foreign_list.conf加上就不能访问墙外网站了,不知道为什么

    1. cokebar 文章作者 回复

      1、list中DNS的IP指定有误或者无法连接或者存在DNS投毒; 2、list格式有问题

  9. Nemo 回复

    好久没来了,请教博主一个问题,我想用如下模式改善openwrt的路由问题:

    dnsmasq->pdnsd->chinadns(114和vps_dns)

    pdnsd主要设置global区为dnsmasq提供端口;设置server区为chinadns提供接口;pndsd的设置主要是缓存chinadns的解析;

    chinadns就不用说了,大家很熟悉了。。

    之所以没有直接用pdnsd取代dnsmasq,是担心改变太大,可能会彻底上不了网,

    请问博主上面的方法可行吗?另外博主是否可以详细写个dnscrypt-proxy和pcap_dnsproxy的博文…

    1. cokebar 文章作者 回复

      当然是可行的 不过我遇到的情况是chinadns出bug 或因网络原因(UDP封死) 无法解析国外域名时候,dnsmasq->chinadns->pdnsd这样来的 然后pdnsd用tcp查询可以解决udp不稳定和封死的情况。 我也建议这样做,因为chinadns并不是很稳定,有bug,很多人遇到,参考:https://github.com/aa65535/openwrt-chinadns/issues/21
      所以用pdnsd在chinadns的下一层为其做个缓冲

      1. Nemo 回复

        昨晚试了dnsmasq->pdnsd->chinadns,效果非常好,哈哈。

        你说的dnsmasq->chinadns->pdnsd,是不是chinadns的上游DNS配置成114和pdnsd?

        1. cokebar 文章作者

        2. 2like

          你说的dnsmasq->pdnsd->chinadns这个怎么配置能发一下吗?

        3. Nemo

          To 2like

          1,dnsmasq就不贴了,转发到chinadns.

          2,chinadns配置:
          config chinadns
          option enable ‘1’
          option chnroute ‘/etc/shadowsocks/ignore_nemo.list’
          option compression ‘1’
          option bidirectional ‘0’
          option server ‘114.114.114.114,127.0.0.1:port_pdnsd’
          option port ‘port_dnsmasq’

          3,pdnsd部分:
          global {
          perm_cache=4096;
          cache_dir=”/var/pdnsd”;
          # pid_file = /var/run/pdnsd.pid;
          run_as=”root”;
          server_ip = 127.0.0.1; # Use eth0 here if you want to allow other
          # machines on your network to query pdnsd.
          server_port = port_pdnsd;
          status_ctl = on;
          # paranoid=on; # This option reduces the chance of cache poisoning
          # but may make pdnsd less efficient, unfortunately.
          # query_method=udp_tcp;
          query_method = tcp_only;
          min_ttl=3w4d; # Retain cached entries at least 15 minutes.
          max_ttl=5w5d; # One week.
          timeout=10; # Global timeout option (10 seconds).
          neg_domain_pol=on;
          udpbufsize=1024; # Upper limit on the size of UDP messages.
          }

          server {
          # label= “chinadns”;
          label = “dodvps”;
          ip = vps_dns;
          port = vps_dns_port;
          # proxy_only=on; # Do not query any name servers beside your ISP’s.
          # This may be necessary if you are behind some
          # kind of firewall and cannot receive replies
          # from outside name servers.
          timeout=4; # Server timeout; this may be much shorter
          # that the global timeout option.
          uptest=none; # Test if the network interface is active.
          interface=wan; # The name of the interface to check.
          interval=10m; # Check every 10 minutes.
          purge_cache=off; # Keep stale cache entries in case the ISP’s
          # DNS servers go offline.
          edns_query=yes; # Use EDNS for outgoing queries to allow UDP messages
          # larger than 512 bytes. May cause trouble with some
          # legacy systems.
          # exclude=.thepiratebay.org, # If your ISP censors certain names, you may
          # .thepiratebay.se, # want to exclude them here, and provide an
          # .piratebay.org, # alternative server section below that will
          # .piratebay.se; # successfully resolve the names.
          }

          最后服务器的dsn代理也可以考虑用pdnsd.

          另外提出向博主一个问题,一直想替换chinadns的114为dnsmasq动态获取的本地isp或者上级路由器的dns都不成功,不知道是不是chinadns把局域网地址看成无效内网dns.

      2. huangjie 回复

        pdnsd已经位列old packages了。unbound可以代替它吗,还是有更好的

  10. Mu 回复

    1、单使用GFWList,其他全部走国内DNS
    2、单使用ChinaList,其他全部走国外DNS(或者ChinaDNS)

    大神,请教一下上面这两个问题。其他部分在哪里设置呢??

发表回复

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

请输入验证码 *