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. 海涛 回复

    执行/etc/init.d/unbound start时出现这个错误:
    /etc/unbound/unbound.conf:616: error: syntax error
    read /etc/unbound/unbound.conf failed: 1 errors in configuration file
    [1421385009] unbound[3591:0] fatal error: Could not read config file: /etc/unbound/unbound.conf

    1. cokebar 文章作者 回复

      syntax error 配置文件格式错误 616标明了错误的行号
      以后遇到这种问题希望能先自行查找下资料 至少不懂可以google翻译一下

      1. finalwolf 回复

        老大,我也出现了同样的问题,查了一下是语法错误? 我是复制你的代码进去的,去掉了注释那些条目,具体应该怎么改呢?菜鸟还望老大多多指导!

        1. cokebar 文章作者

          看清楚是 取消下列相关内容的注释

        2. cokebar 文章作者

          Google一下注释是啥意思 取消注释是啥意思
          unbound配置文件里面 “#”开头的是注释 注释的内容程序会忽略 取消注释 去掉”#” 让配置生效

          算了你别管注释不注释了 你把这个配置文件删除 然后卸载unbound并且重装 然后在新的默认配置文件末尾直接加上那几行就行了

  2. xuefliang 回复

    已试,对服务器端不支持UDP转发时出现的DNS污染有效,多谢!

  3. xuefliang 回复

    用dnsmasq-full替代自带的dnsmasq后,发现无法访问facebook、twitter,其余翻墙正常,且用dig未发现DNS污染情况,使用自带dnsmasq访问facebook、twitter正常,不知为何?

    1. mij1661jim 回复

      是否是你在dnsmasq.conf里的server是默认的8.8.8.8和 8.8.4.4,改为127.0.0.1#5300(chinadns的端口)试试,另外要加上no_resolv。 我也不知道是否是最优设置,也不清楚为什么luci里dhcp那里的设置不起作用,反正是有效的。不知@cokebar楼主有什么更优化的设置

    2. cokebar 文章作者 回复

      查查这两个网站的解析结果吧。不知道你用的那种翻的方案

  4. xuefliang 回复

    第四种解决方案,我确实没有在dnsmasq.conf里设置为127.0.0.1#5300,谢谢提醒!

    1. mij1661jim 回复

      不知楼主有无安装dnsmasq full版本。使用上倒没问题,但感觉装了以后很不稳定,有时候路由器重启后,wifi设备会无法连接,(即使有信号);有线都无法连接。不过一旦连上以后就没问题了。猜测有可能和dhcp有关。
      不知道楼主有没有什么提示,如果不行的话,只能换回默认版本了。。。不会设定。。。

      1. cokebar 文章作者 回复

        我装了full版本同样出现过此问题 应该是DHCP有点问题 估计是设备上之前的DHCP记录和新的冲突 新设备连入是没有问题的 但之前在dnsmasq下连过的设备貌似就会出现这个现象 此时在PC上尝试使用系统自带的诊断功能试试,不行的话在cmd上释放掉之前的IP:ipconfig /release 然后重启电脑试试

        1. mij1661jim

          我是路由器重启后,所有的wifi设备都无法连接,connecting…失败。有线ping不通。感觉是路由器本身的问题
          不知道iphone和android设备上如何释放。。。

      2. cokebar 文章作者 回复

        路由上重启dnsmasq试试 我是只要连上一次后面就好了

        1. mij1661jim

          路由器都ping不通啊,我是要重启几次。

      3. cokebar 文章作者 回复

        手动设置IP就行了

  5. bosscat 回复

    这是我的运行结果,求指点!
    root@OpenWrt:~# /etc/init.d/unbound start
    [1423233709] unbound[1846:0] error: can’t bind socket: Address already in use
    [1423233709] unbound[1846:0] debug: failed address 0.0.0.0 port 5454
    [1423233709] unbound[1846:0] fatal error: could not open ports

    1. cokebar 文章作者 回复

      端口被占用

      1. bosscat 回复

        换过几次端口了,都出现一样的结果。

  6. 晓南晚风 回复

    无奈墙太高,做成tcp搞成功了,谢谢博主的方法!!!tcp查询速度还是有点慢。。。

    1. cokebar 文章作者 回复

      unbound貌似有点问题 延迟奇高 可以试试pdnsd

    2. jack 回复

      速度不慢呀,可能你的路由器配置比较低吧,我3700v4速度很快。

  7. 晓南晚风 回复

    据说opendns也支持tcp查询,但是在我这里不行,不知道什么原因?

  8. jack 回复

    这个方法很好,应该放到你的方案4里面。他支持服务器没开通udp的,速度并不慢。通用性更高。这里提醒一下,不要直接复制上面的代码,字体有点奇怪。我是自己一个个输入才成功的,否则会出现找不到unbound.conf的提示。

  9. john 回复

    推荐使用 dnscrypt 软件加密 dns查询,使用 https协议。现在支持加密的公共dns节点还是很多的,封掉一个换一个就是了。

    1. cokebar 文章作者 回复

      这里是考虑到openwrt路由器的使用才这样选择的 pdnsd是比较理想的 适合UDP不稳定或者被封杀的 dnscrypt也是可选择的 不过pdnsd带有的缓存功能更加强大 加上目前大部分情况TCP查询就够了 而且配置了shadowsocks的话TCP查询时候会走shadowsocks 已经达成加密了

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

发表回复

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

请输入验证码 *