shadowsocks/ChinaDNS

query[AAAA] ipv6解析,返回值的问题

datewu opened this issue · 8 comments

你好:
很喜欢你开发的chinadns,不过有关ipv6地址有点不明白你的处理方式。(具体就是src/chinadns.c的低811行 return 0 的做法) 。

直接返回 0 的话,会出现下面这个问题:

网络环境是:安装了chinadns和shadowsocks的openwrt下

案例重现

客户反馈《懂球帝》这款app,连接翻墙路由器后出现无法加载的问题,连接普通路由器一切正常

解决问题

结果反复测试,发现客户反馈连接翻墙路由器无法连接《懂球帝》的问题只在ios机型上出现,不会在Android机型上出现。

ios下的日志如下:

root@OpenWrt:~# logread -f | grep dong
Tue Jul  7 07:27:43 2015 daemon.info dnsmasq[1102]: query[AAAA] api.dongqiudi.com from 10.10.90.229
Tue Jul  7 07:27:43 2015 daemon.info dnsmasq[1102]: forwarded api.dongqiudi.com to 127.0.0.1
Tue Jul  7 07:27:43 2015 daemon.info dnsmasq[1102]: query[A] api.dongqiudi.com from 10.10.90.229
Tue Jul  7 07:27:43 2015 daemon.info dnsmasq[1102]: forwarded api.dongqiudi.com to 127.0.0.1
Tue Jul  7 07:27:43 2015 daemon.info dnsmasq[1102]: reply api.dongqiudi.com is 119.254.110.102
Tue Jul  7 07:27:44 2015 daemon.info dnsmasq[1102]: query[AAAA] api.dongqiudi.com from 10.10.90.229
Tue Jul  7 07:27:44 2015 daemon.info dnsmasq[1102]: forwarded api.dongqiudi.com to 127.0.0.1
Tue Jul  7 07:27:45 2015 daemon.info dnsmasq[1102]: query[AAAA] api.dongqiudi.com from 10.10.90.229

Android下的日志如下:

root@OpenWrt:~# logread -f | grep dong
Tue Jul  7 07:41:10 2015 daemon.info dnsmasq[1102]: query[A] api.dongqiudi.com from 10.10.90.217
Tue Jul  7 07:41:10 2015 daemon.info dnsmasq[1102]: forwarded api.dongqiudi.com to 127.0.0.1
Tue Jul  7 07:41:10 2015 daemon.info dnsmasq[1102]: reply api.dongqiudi.com is 119.254.110.102
Tue Jul  7 07:41:13 2015 daemon.info dnsmasq[1102]: query[A] data.dongqiudi.com from 10.10.90.217
Tue Jul  7 07:41:13 2015 daemon.info dnsmasq[1102]: forwarded data.dongqiudi.com to 127.0.0.1
Tue Jul  7 07:41:13 2015 daemon.info dnsmasq[1102]: reply data.dongqiudi.com is 119.254.110.102
Tue Jul  7 07:41:14 2015 daemon.info dnsmasq[1102]: query[A] img.dongqiudi.com from 10.10.90.217
Tue Jul  7 07:41:14 2015 daemon.info dnsmasq[1102]: forwarded img.dongqiudi.com to 127.0.0.1
Tue Jul  7 07:41:15 2015 daemon.info dnsmasq[1102]: reply img.dongqiudi.com is <CNAME>

分析日志内容,提出如下的解决方案。

解决方案

修改src/chinadns.c关于ipv6的返回值。

结果

解决方案通过。

希望

能解释一下china-dns有关ipv6处理的思路是什么?

ps: 另外还有《keep》等几款app,也会出现这个问题。

返回 0 表示不过滤这条结果,即对 IPv6 结果直接返回给 DNS 客户端。可以用 -v 打一下 chinadns 的 log。

关闭路由器的IPv6地址获取,关闭DHCPv6 ra
目测并不是ChinaDNS的问题,部分ISP开始了IP v6的支持能够获取地址但经常实际不能访问,openwrt默认开启IP v6支持导致客户端获取IP v6地址,而正好这游戏服务器有aaaa记录,本着高版本优先选择走了IP v6导致无法连接。
至于安卓端,有些ROM把IP v6关掉了故而未受影响

换用普通路由正常是因为不支持IP v6

@cokebar ,并不是这样的。

  1. 普通路由器是支持ipv6的;
  2. 刷过openwrt(14.07)的路由器,不装chinadns包的时候,和普通路由器一样也是可以正常解析访问ipv6;
  3. 你好像正好说反了,根据我这边的log看,openwrt未安装chinadns时是有Active DHCPv6 Leases的,安装了chinadns包后Active DHCPv6 Leases为空

不管怎么引起的关IP v6肯定是对的,就目前国内IP v6的建设情况而言,IP v6可能引起各种奇葩问题。
要么采用域名黑白名单,利用China domain list和gfwlist在dnsmasq环节做个分流,国内域名不要走ChinaDNS

还有你应该开-v看一下chinadns的log 然后dig测试一下 看一下api.dongqiudi.com的解析结果到底如何
还有也要测试一下客户机和路由器对该域名ipv6地址的访问情况。
有的版本的openwrt的ipv6支持有些诡异 我遇到过很多次 能够获取IPv6地址 但路由器可以ping通ipv6 LAN中设备却不行 无法正确的路由 十分诡异 我对ipv6也是一知半解 不知如何解决

如果楼主是把返回 0 改为返回 1 的话,起到的效果正是过滤所有的 IPv6 结果。

I configure 223.5.5.5(alidns) and 8.8.8.8 as the upstream servers and I would get the same result in China.
I checked the log, it is the alidns reply such answers for AAAA reocrds of www.google.com
I highly recommend to filter out such invalid answer, which server would answer ::1(localhost) for a domain query ?