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

    博主您好,有一点不明白:

    我的 Shadowsocks UDP转发 本地端口是5151
    UDP转发地址是 8.8.4.4:53
    China DNS 的本地端口是 5353
    上游服务器是 202.96.134.33,127.0.0.1:5151
    DHCP/DNS 的 本地服务器是 127.0.0.1#5151
    DNS转发 是 127.0.0.1#5353
    foreign_list.con.txt 里填的是 127.0.0.1#53

    请问我这些有哪里做错了吗?谢谢!

    1. cokebar 文章作者 回复

      DHCP/DNS 的本地服务器是什么意思?
      foreignlist填127.0.0.1#53不就又转发到dnsmasq了,不死循环了

      1. Paul 回复

        DHCP/DNS 本地服务器。 指的是“网络—DHCP/DNS”页面里面的“本地服务器”

        那foreignlist应该填什么?

    2. cokebar 文章作者 回复

      那个local server 用来排除某些域名不转发。这里并不是让你填写DNS服务器地址的。

      1. Paul 回复

        那请问foreignlist里应该填什么呢?

        1. TheFirstCurse

          127.0.0.1#5151,是外IP直接用SS查询。

  2. huangjie 回复

    博主,目前最好的不依赖udp的dns过滤方式是哪个?
    长城宽带的udp基本是费了,联通的udp也会偶尔抽风。所以udp relay不太稳定。

    1. cokebar 文章作者 回复

      使用pdnsd用TCP转发。

  3. 2like 回复

    怎么验证成功没有?我在Windows下dig网站都是显示
    ;; Query time: 109 msec
    ;; SERVER: 172.16.16.1#53(172.16.16.1)
    ;; WHEN: Sun Dec 27 11:55:30 China Standard Time 2015
    ;; MSG SIZE rcvd: 205

  4. IT小白 回复

    谢谢作者!很感谢你!我才在路由器上实现了科学上网。
    这里有个小小的请求,能不能指导一下OPENWRT路由器如何定期更新foreign_list.conf和accelerated-domains.china.conf

    谢谢!

  5. 春夏秋冬 回复

    楼主的意思是不是说用Shadowsocks + ChnRoute 的方式也可以单使用GFWList,其他全部走国内DNS吗?那dnsmasq要不要换成dnsmasq-full版.

    1. cokebar 文章作者 回复

      如果你使用chnroute方案,chnroute中不走代理其余都走的白名单法,就不需要;此时在dnsmasq加入gfwlist(使用不含ipset的规则的列表)只是用来保证这些域名解析正确没有被污染。
      使用dnsmasq-full是为了实现GFWList名单中的域名走代理(黑名单法,利用dnsmasq-full操作ipset的功能,使用包含ipset规则的规则列表),同时也能保证不受dns污染。
      不使用full版本并不影响dns解析,但只有full版本可以操作ipset。

  6. dundavid 回复

    请教一个问题,这里没dnsmasq的设置是在本地openwrt路由器上面的设置还是在国外架设的dnsmasq设置? 谢谢

    1. dundavid 回复

      请教一个问题,这篇文章里面dnsmasq的设置是在本地openwrt路由器上面的设置还是在国外架设的dnsmasq设置? 谢谢

  7. 流年 回复

    博主这个foreign_list.conf文件在哪里拿?我怎么找不到?

    1. cokebar 文章作者 回复

      大大的超链接明明都给了你了

      1. 流年 回复

        (⊙o⊙)…!看着有条横线 没留意!谢谢版主

  8. 流年 回复

    我还有一点不明白想像博主请教一下
    我的 Shadowsocks UDP转发 本地端口是5151
    UDP转发地址是 8.8.4.4:53
    foreign_list.con.txt 里填的是 114.114.114.114#53吗?之前我端口填 5151 出现问题访问不了国外网站

    1. cokebar 文章作者 回复

      都foreign_list了你还填114是什么意思

      1. 流年 回复

        不是将这个文件里的127.0.0.1替换成114.114.114.114吗?难道我理解错了?还请博主指明

    2. cokebar 文章作者 回复

      foreign_list为gfwlist转换而来 全部是被封锁的域名 需要使用不会遭到DNS污染的国外DNS 填写114DNS这类国内DNS必然会遭受DNS投毒

  9. nanxiaobei 回复

    你好,我想问下,
    是不是 shadowsocks-libev-spec 不支持 ipv6 ?
    我用系统日志查看,dns 返回的 google.com 是日本的 ipv6 地址 ,
    但是打开以后就会成了香港的 google.com.hk,

    用电脑上的 shadowsocks windows 代理,打开的是 google.co.jp,
    唯一的解释似乎就是 shadowsocks-libev-spec 并没有代理 ipv6,
    所以根据我的电信 ipv6 地址判断给了 google.com.hk。
    但是 shadowsocks windows 可以代理 ipv6。

    纯好奇问一下。

      1. nanxiaobei 回复

        这个必须使用 shadowsocks-libev 对吗?
        在 shadowsocks-libev-spec 里不知道怎么修改…

  10. 春夏秋冬 回复

    博主:如果用结合GFWList与ChinaList,其余全部使用国内DNS或者国外DNS,抛弃ChinaDNS,那就是说不用安装chinadns,那如何解决dns污染,那安装shadowsocks时要不要带spec的版本.

    1. TheFirstCurse 回复

      是不用安装Chinadns,国内用国内解析,被q的用SS查询,带不带应该没有影响,因为是dnsmasq先处理后再到SS的。

发表回复

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

请输入验证码 *