TCP 方式查询解决 DNS 污染问题

本文适用于通常的UDP方式DNS查询不可用、不稳定或者无法正常解决DNS污染的情况,适用于但不限于以下情况:

1、你的ISP可能会封杀国外的大部分UDP通讯(如教育网)

2、UDP通讯不稳定,DNS解析经常卡住

3、代理服务器不支持代理UDP协议,又遇到长城宽带这种坑爹ISP时;

TCP方式查询,请搭配shadowsocks等代理效果更佳,使用shadowsocks代理路由器的TCP流量,使得TCP的DNS查询也能走shadowsocks代理,更加稳定安全。上面的第三条的情况可能必须这么做才能解决问题(没有长宽的网络环境无法测试)。

一. 使用dns-forwarder

dns-forwarder的安装可参考:《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网》一文中的安装部分,到文中提到的地址,下载安装dnsforwarder_x.x.xx_xxxx.ipk,luciappdnsforwarder_x.x.xx_all.ipk即可。

配置也很简单,luci界面,“服务”→”DNS 转发”(英文界面是DNS Forwarder),如图配置:

dns-forwarder

然后将上级DNS请求转发至127.0.0.1:5311端口即可。同时请确保你的代理设置中,8.8.8.8是走代理的。


二. 使用unbound

首先安装unbound:

然后修改 /etc/unbound/unbound.conf 文件,把以下内容相关的条目的注释取消,并按如下形式修改:

启动unbound:

接着将DNS请求发送至unbound的端口即可。同时请确保你的代理设置中,8.8.8.8是走代理的。


三. 使用pdnsd

可以直接在Luci界面中,切至软件包配置页面,刷新列表后,键入pdnsd点击安装即可。(注:由于pdnsd软件早已停止更新,新版OpenWrt/LEDE的官方源中已经移除了pdnsd,OpenWrt CC及之前版本用户可以到BB版本的下载页面下载;LEDE用户需要自行编译。

配置/etc/pdnsd.conf,文件配置分为数个区域,主要修改global区域和server区域,其他区域保留默认值即可。具体的配置文件详情请查阅官方文档:pdnsd Documents

给pdnsd设置开机启动:

也可以在Luci的启动项配置页面找到pdnsd,将开机自动从禁用改成启用。接着,你需要将路由器的DNS请求转发至pdnsd上来,在上游DNS中填入:127.0.0.1:PORT,其中port是pdnsd监听端口,上面的配置文件中写的是25252。同时请确保你的代理设置中,8.8.8.8是走代理的。

最后,重启一下路由,应该就好了。

54 条评论

  1. 引用: Shadowsocks + GfwList 实现 OpenWRT 路由器自动翻墙 - ShadowSocks

  2. 引用: Shadowsocks + Redsocks 实现 OpenWRT 路由器自动翻墙 - ShadowSocks

  3. Nemo 回复

    为了避免裸的TCP查询被GFW干扰,博主参考http://dnscrypt.org/再写一篇博文吧。

    1. cokebar 文章作者 回复

      TCP还干扰的话不如裹上shadowsocks了

    2. cokebar 文章作者 回复

      话说开了shadowsocks,本来TCP国外的就走了SS了

  4. 老王 回复

    用的长宽,好坑。
    也可以在Luci的启动项配置页面找到pdnsd,将开机自动从禁用改成启用。接着,你需要将路由器的DNS请求转发至pdnsd上来
    这个在界面上怎么找到pdnsd 我好像找不到 也找不到pdnsd的界面安装包,求教 博主。感谢,阅读你的博客受益良多!

    1. cokebar 文章作者 回复

      pdnsd没有开发luci-app,只能使用配置文件配置。LUCI中,系统-启动项中调整开机启动的设置。或者使用 /etc/init.d/pdnsd enable 设定pdnsd的开机启动

  5. 小明 回复

    使用了pdnsd,无法上dropbox、youtubu,原因是无法使用dnsmasq的国外名单,部分dns被污染,何解?

  6. 小明 回复

    不好意思,是我没理解原理,理解原理之后就很好处理,取得很好的效果了

    还是采用dnsmasq作为路由器的dns服务

    原理:访问域名 ->路由器的dnsmasq会先看是否在自己的list清单,并遵循清单的处理方式,如果不在清单的会交给chinadns处理,chinadns对于国外ip会有一定的误判,同时直接去访问国外dns会不稳定,所以在chinadns和国外dns服务器中加了pdnsd一层,让pdnsd通过tcp走ss代理去获取国外dns服务器结果并返回chinadns,这样可以不用再国外的vps上搭建自己的dns服务,可以直接采用8.8.8.8

    这样理解不知道对不对?

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

  8. zeroi 回复

    博主,我用的长城宽带,现在只能做到chrome配合switchsharp翻墙,怎麽都搞不定透明翻墙,请问有神魔好的建议?

    1. cokebar 文章作者 回复

      使用Shadowsocks的UDP转发,或者TCP方式,解决DNS污染

  9. F 回复

    想请教一下作者使用 Unbound 方式是要关闭 Shadowsocks 里的 UDP 转发对吗?然后在 ChinaDNS 的上游服务器处填写 223.5.5.5,127.0.0.1:5454,照这样做只能打开国内的网站

    1. cokebar 文章作者 回复

      检查unbound配置是否正确 是否正确的运行起来了
      PS:推荐pdnsd

      1. F 回复

        感谢你的帮助!我装的 15.05 没有 pdnsd 软件包,后来找了一个别人编译的版本不能正常使用,才试了 unbound 的方案,这篇教程有些地方看得不太懂,使用 unbound 的话 chinadns 该如何设置呢?我也看过你的另一篇教程,都跟着做过没有成功。因为非理工科出身遇到这些问题不知道怎么解决,还真不知道怎么看 unbound 是否运行起来了,unbound 的配置我是拷贝你的代码粘贴到配置文件的最后面,找了好多相关的教程都没有解决

  10. U 回复

    作者你好,目前我是遇到了2这种情况,正想利用你所提供的方法来解决问题.文章中有些问题要请教作者你的,到目前为止我还是看不懂原理
    1. pdnsd.conf文件配置中server区域的上游dns填写公共国外或者公共国内都行吧?例如本人想填google的DNS(8.8.8.8)那端口该填什么? 53或443?假如填国内的114难道就不会被污染吗?毕竟是国内的dns.
    2.既然是通过TCP来解析,那么SS那头的UDP转发可以关闭或还是照旧?

    1. cokebar 文章作者 回复

      1.这篇文章配置文件文本是从我另一篇文章里面复制过来改了一下 有些注释没改过来。防污染当然不能用国内DNS,用google dns的话端口写53,或者端口那行注释掉。
      2. ss的UDP转发可以关闭。

发表回复

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

请输入验证码 *