pymumu / smartdns

A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT。
https://pymumu.github.io/smartdns/
GNU General Public License v3.0
8.45k stars 1.08k forks source link

一个奇怪的bug,unbound请求不一样 #201

Closed kkkgo closed 5 years ago

kkkgo commented 5 years ago

问题现象
我的53端口运行的是unbound,smartdns作为他的上游,然后查询www.baidu.com的时候,使用smartdns的端口查出来的结果是正常的,是本省的ip,然后使用53端口,也就是unbound去查的时候,结果就是美国或者香港的ip,可以确定的是ubound的上游的确是smartdns,我把smartdns里面的一组服务器去掉国外的服务器(本地的dnscrypt)就能正常查到省内的ip,或者直接用smartdns的端口查也没问题,我观察日志之后发现直接请求smartdns的端口和请求unboud的端口有区别: 请求unbound的dig表现是这样的:

; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18430 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.baidu.com. IN A

;; ANSWER SECTION: www.baidu.com. 605 IN CNAME www.a.shifen.com. www.a.shifen.com. 57 IN CNAME www.wshifen.com. www.wshifen.com. 120 IN A 103.235.46.39

而直接请求smartdns的表现是这样的: ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59344 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.baidu.com. IN A

;; ANSWER SECTION: www.baidu.com. 1077 IN CNAME www.a.shifen.com. www.a.shifen.com. 82 IN A 14.215.177.39

看到多了一个www.wshifen.com.,这很奇怪 运行环境 x86

  1. 运营商
    电信 重现步骤

  2. 上游DNS配置。
    server 119.29.29.29 server 202.96.134.133 server 202.96.128.166 server 127.0.0.1:553 (本地dnscrypt-proxy)

  3. 访问的域名。
    www.baidu.com

pymumu commented 5 years ago

smartdns只会返回一个CNAME,一个IP地址,代码上是这样。 也就是说,ubound请求返回的结果不是用的smartdns的结果。 检查一下ubound的配置吧。 可以看一下smartdns里面,有没有ubound请求smartdns的日志。

kkkgo commented 5 years ago

有的,而且这个国外ip也是出现在smartdns的日志里

pymumu commented 5 years ago

IP在日志里面不代表返回了这个ip,要看日志里面最后解析后的IP地址是哪个。

kkkgo commented 5 years ago

dig结果: ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.baidu.com. IN A

;; ANSWER SECTION: www.baidu.com. 0 IN CNAME www.a.shifen.com. www.a.shifen.com. 0 IN CNAME www.wshifen.com. www.wshifen.com. 0 IN A 103.235.46.39

pymumu commented 5 years ago

这个www.wshifen.com的IP地址就是103.235.46.39,查询114也是这个结果。

现在不知道ubound做了什么,baidu会去查询www.wshifen.com

是不是因为配置递归DNS的原因?

kkkgo commented 5 years ago

我用的就是默认unbound配置基本没有什么特殊的,我也很奇怪为啥会查到www.wshifen.com,但我把smartdns的DNS服务器去掉国外的组又不会查到这个结果

pymumu commented 5 years ago

我觉得还是unbound查询了这个地址,然后本地CNAME合并了导致的。

kkkgo commented 5 years ago

但是smartdns的dns里面没有国外的服务器的时候,查询结果就是正常的,加了国外的服务器才有这个结果,是不是在有国外的服务器的情况下smartdns返回的结果有啥不一样的或者多余的信息让ubound去请求了wshifen? 或者你可以搭个ubnound测试下,我用的都是默认的简单的配置,然后国外的dns用的dnscrypt-proxy

pymumu commented 5 years ago

到dnscrypt-proxy dig 看看www.baidu.com返回什么。

pymumu commented 5 years ago

另外,其实你要防污染,smartdns本身完全可以做到。

kkkgo commented 5 years ago

;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24706 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1220 ;; QUESTION SECTION: ;www.baidu.com. IN A

;; ANSWER SECTION: www.baidu.com. 35 IN CNAME www.a.shifen.com. www.a.shifen.com. 35 IN CNAME www.wshifen.com. www.wshifen.com. 35 IN A 103.235.46.39

pymumu commented 5 years ago

是不是你unbound也配置了dnsproxy作为上游了?

kkkgo commented 5 years ago

没有的,unbound只指定了smartdns上游,然后dnsproxy作为一个本地dns开别的端口给smartdns

kkkgo commented 5 years ago

其实我加入国外dns主要是补充国内dns有时候更新不及时用国外dns的结果来补充下,但就碰到这个奇怪的情况

pymumu commented 5 years ago

那就奇怪了,smartdns并没有返回www.wshifen.com啊,并且代码上,一定不会返回这个。 我这也配置了好几个国外DNS,没有遇到这种情况。

是否是unbound本地缓存导致?

kkkgo commented 5 years ago

我直接去请求smartdns的端口也不会有这个情况,但经过unbound请求就是这样的,我特意新开了一个debug的配置文件去前台运行unbound,应该不会是缓存问题,我一旦把smartdns的dns组去掉国外的dns,再运行unbonud和smartdns马上就能查到是国内的结果了。

pymumu commented 5 years ago

应该是unbound解析别名导致的 国内dns服务器不会返回www.wshifen.com这个别名,所以没问题。

当有国外的时候,unbound通过两次查询,查询到了www.wshifen.com了这个域名。 下面这个解释了原因。 www.baidu.com. 605 IN CNAME www.a.shifen.com. www.a.shifen.com. 57 IN CNAME www.wshifen.com. www.wshifen.com. 120 IN A 103.235.46.39

要看一下unbound是否有什么配置,避免去多次查询CNAME

kkkgo commented 5 years ago

目前还没找到相关unbound配置解决这个问题,smartdns这个查询返回结果的机制,是会返回所有服务器的cname结果而不是返回优选服务器那组的的cname结果?百度可能是针对不通地区DNS发布了不同的cname结果

omaidb commented 1 year ago

unbound上游DNS使用DOT或DOH,一直提示ssl错误。这个怎么解,哪位大佬有成功案例,可以参考下嘛

PikuZheng commented 1 year ago

unbound上游DNS使用DOT或DOH,一直提示ssl错误。这个怎么解,哪位大佬有成功案例,可以参考下嘛

我的一直正常。建议去unbound项目问 https://github.com/NLnetLabs/unbound 。另外你的unbound编译时添加ssl支持了吗?