smartdns icon indicating copy to clipboard operation
smartdns copied to clipboard

开启测速后. 解析结果和IPSET 结果有异常BUG.

Open mark-syctnet opened this issue 2 years ago • 5 comments

问题现象
开启测速后. 结果反馈是不是速度最快的结果,是最先回复的SERVER中最快的结果.并非多个SERVER的比较结果.但缓存却是多个SERVER的比较结果. 如同时开启了IPSET的话(此时IPSET中的记录是最先回复的SERVER的结果).同时因为缓存的问题.导至第2次用户查询是从缓存中直接给的用户的结果, 因此缓冲中的数据不会出现在IPSET中列表中. 这样就导至 把指定域名的IP加入IPSET列表中的功能存在BUG.

运行环境 [root@ns1 sbin]# ./smartdns -v smartdns 1.2022.06.15-0904 阿里云新加坡的VCS 一台 . 系统是 CENOST7 X86_64 注:因为测试原因配置. .8.8.8.8的延迟会过大于180ms ,这样基本上是先收到114.114.114.114结果 .

sudo tc qdisc add dev eth0 root handle 1: prio sudo tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 180ms sudo tc filter add dev eth0 protocol ip parent 1:0 u32 match ip dst 8.8.8.8 flowid 1:3

smartdns.conf 配置如下: log-file /var/log/smartdns254.log bind 0.0.0.0:254 bind-tcp 0.0.0.0:254 cache-size 3000 log-level debug log-size 150k server 8.8.8.8:53 server 114.114.114.114:53 speed-check-mode ping #speed-check-mode none ipset /com/abc

#####测试过程

  1. 第一次DIG www.baidu.com 的结果; dig @127.0.0.1 -p 254 www.baidu.com

[root@ns1 ~]# dig @127.0.0.1 -p 254 www.baidu.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> @127.0.0.1 -p 254 www.baidu.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15030 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION: ;www.baidu.com. IN A

;; ANSWER SECTION: www.baidu.com. 600 IN CNAME www.a.shifen.com. www.a.shifen.com. 600 IN A 110.242.68.4

;; Query time: 145 msec ;; SERVER: 127.0.0.1#254(127.0.0.1) ;; WHEN: Sat Jun 18 09:13:25 CST 2022 ;; MSG SIZE rcvd: 74

----- 同时的smartdns的LOG

[root@ns1 ~]# tail -f /var/log/smartdns254.log [2022-06-18 09:12:55,706][NOTICE][ smartdns.c:269 ] smartdns starting...(Copyright (C) Nick Peng [email protected], build:Jun 15 2022 09:04:48) [2022-06-18 09:12:55,707][DEBUG][ fast_ping.c:1082] ping 2001::, id = 1 [2022-06-18 09:12:55,707][DEBUG][ fast_ping.c:860 ] from 2001::: error is Network is unreachable [2022-06-18 09:12:55,707][DEBUG][ fast_ping.c:393 ] ping 2001:: end, id 1 [2022-06-18 09:12:55,707][ INFO][ dns_server.c:5043] IPV6 is not ready, disable IPV6 features [2022-06-18 09:12:55,707][ INFO][ dns_client.c:1098] add server 8.8.8.8:53, type: udp [2022-06-18 09:12:55,707][ INFO][ dns_client.c:1098] add server 114.114.114.114:53, type: udp [2022-06-18 09:13:25,279][DEBUG][ dns_server.c:3993] recv query packet from 127.0.0.1, len = 42 [2022-06-18 09:13:25,279][DEBUG][ dns_server.c:4001] request qdcount = 1, ancount = 0, nscount = 0, nrcount = 0, len = 42, id = 15030, tc = 0, rd = 1, ra = 0, rcode = 0 [2022-06-18 09:13:25,279][ INFO][ dns_server.c:4017] query server www.baidu.com from 127.0.0.1, qtype = 1 [2022-06-18 09:13:25,279][ INFO][ dns_server.c:3036] RULE-MATCH, type: 3, domain: www.baidu.com, rule: com [2022-06-18 09:13:25,279][DEBUG][ dns_client.c:530 ] send query to group default [2022-06-18 09:13:25,279][DEBUG][ dns_client.c:2844] send query to server 114.114.114.114 [2022-06-18 09:13:25,279][DEBUG][ dns_client.c:2844] send query to server 8.8.8.8 [2022-06-18 09:13:25,279][ INFO][ dns_client.c:3136] send request www.baidu.com, qtype 1, id 1 [2022-06-18 09:13:25,279][ INFO][ dns_server.c:3036] RULE-MATCH, type: 3, domain: www.baidu.com, rule: com [2022-06-18 09:13:25,279][DEBUG][ dns_client.c:530 ] send query to group default [2022-06-18 09:13:25,279][DEBUG][ dns_client.c:2844] send query to server 114.114.114.114 [2022-06-18 09:13:25,279][DEBUG][ dns_client.c:2844] send query to server 8.8.8.8 [2022-06-18 09:13:25,279][ INFO][ dns_client.c:3136] send request www.baidu.com, qtype 28, id 2 [2022-06-18 09:13:25,348][DEBUG][ dns_client.c:1968] recv udp packet from 114.114.114.114, len: 101, ttl: 147 [2022-06-18 09:13:25,348][DEBUG][ dns_client.c:1611] qdcount = 1, ancount = 3, nscount = 0, nrcount = 0, len = 101, id = 1, tc = 0, rd = 1, ra = 1, rcode = 0, payloadsize = 512 [2022-06-18 09:13:25,348][DEBUG][ dns_client.c:1622] domain: www.baidu.com qtype: 1 qclass: 1 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2685] query result from server 114.114.114.114:53, type: 0 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2391] name: www.baidu.com ttl: 1196 cname: www.a.shifen.com [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2202] domain: www.a.shifen.com TTL:261 IP: 110.242.68.4 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2082] ping 110.242.68.4 with icmp, order: 0, timeout: 880 [2022-06-18 09:13:25,348][DEBUG][ fast_ping.c:1082] ping 110.242.68.4, id = 2 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2202] domain: www.a.shifen.com TTL:261 IP: 110.242.68.3 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2082] ping 110.242.68.3 with icmp, order: 0, timeout: 880 [2022-06-18 09:13:25,348][DEBUG][ fast_ping.c:1082] ping 110.242.68.3, id = 3 [2022-06-18 09:13:25,348][DEBUG][ dns_client.c:1968] recv udp packet from 114.114.114.114, len: 126, ttl: 147 [2022-06-18 09:13:25,348][DEBUG][ dns_client.c:1611] qdcount = 1, ancount = 1, nscount = 1, nrcount = 0, len = 126, id = 2, tc = 0, rd = 1, ra = 1, rcode = 0, payloadsize = 512 [2022-06-18 09:13:25,348][DEBUG][ dns_client.c:1622] domain: www.baidu.com qtype: 28 qclass: 1 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2685] query result from server 114.114.114.114:53, type: 0 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2566] name:www.baidu.com ttl: 1196 cname: www.a.shifen.com [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2577] domain: www.baidu.com, qtype: 28, SOA: mname: ns1.a.shifen.com, rname: baidu_dns_master.baidu.com, serial: -2088787295, refresh: 5, retry: 5, expire: 2592000, minimum: 3600 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:2656] dualstack result: domain: www.baidu.com, ip: , type: 28, ping: -1 [2022-06-18 09:13:25,348][DEBUG][ dns_server.c:932 ] cache www.baidu.com qtype:28 ttl: 0 [2022-06-18 09:13:25,423][DEBUG][ dns_server.c:1947] from 110.242.68.4: seq=1 time=749, lasttime=-1 id=15030 [2022-06-18 09:13:25,423][ INFO][ dns_server.c:1542] result: www.baidu.com, qtype: 1, rtt: 749, 110.242.68.4 [2022-06-18 09:13:25,423][DEBUG][ dns_server.c:1341] reply www.baidu.com qtype: 1, rcode: 0, reply: 1 [2022-06-18 09:13:25,423][DEBUG][ dns_server.c:692 ] result: www.baidu.com, rtt: 749, 110.242.68.4 [2022-06-18 09:13:25,423][DEBUG][ dns_server.c:932 ] cache www.baidu.com qtype:1 ttl: 600 [2022-06-18 09:13:25,423][DEBUG][ dns_server.c:1065] Cache CNAME: www.a.shifen.com, qtype: 1, speed: 749 [2022-06-18 09:13:25,423][DEBUG][ dns_server.c:1304] IPSET-MATCH: domain: www.baidu.com, ipset: abc, IP: 110.242.68.4 [2022-06-18 09:13:25,424][DEBUG][ fast_ping.c:393 ] ping 110.242.68.4 end, id 2 [2022-06-18 09:13:25,427][DEBUG][ dns_server.c:1947] from 110.242.68.3: seq=1 time=787, lasttime=749 id=15030 [2022-06-18 09:13:25,427][DEBUG][ fast_ping.c:393 ] ping 110.242.68.3 end, id 3 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1968] recv udp packet from 8.8.8.8, len: 127, ttl: 107 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1611] qdcount = 1, ancount = 4, nscount = 0, nrcount = 0, len = 127, id = 1, tc = 0, rd = 1, ra = 1, rcode = 0, payloadsize = 512 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1622] domain: www.baidu.com qtype: 1 qclass: 1 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2685] query result from server 8.8.8.8:53, type: 0 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2391] name: www.baidu.com ttl: 1039 cname: www.a.shifen.com [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2391] name: www.a.shifen.com ttl: 272 cname: www.wshifen.com [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2202] domain: www.wshifen.com TTL:139 IP: 45.113.192.102 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2082] ping 45.113.192.102 with icmp, order: 0, timeout: 768 [2022-06-18 09:13:25,461][DEBUG][ fast_ping.c:1082] ping 45.113.192.102, id = 4 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2202] domain: www.wshifen.com TTL:139 IP: 45.113.192.101 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2082] ping 45.113.192.101 with icmp, order: 0, timeout: 767 [2022-06-18 09:13:25,461][DEBUG][ fast_ping.c:1082] ping 45.113.192.101, id = 5 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1399] result: www.baidu.com, qtype: 1, hasresult: 1, id 1 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1968] recv udp packet from 8.8.8.8, len: 152, ttl: 107 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1611] qdcount = 1, ancount = 2, nscount = 1, nrcount = 0, len = 152, id = 2, tc = 0, rd = 1, ra = 1, rcode = 0, payloadsize = 512 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1622] domain: www.baidu.com qtype: 28 qclass: 1 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:2685] query result from server 8.8.8.8:53, type: 0 [2022-06-18 09:13:25,461][DEBUG][ dns_client.c:1399] result: www.baidu.com, qtype: 28, hasresult: 1, id 2 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:1341] reply www.baidu.com qtype: 28, rcode: 0, reply: 0 [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:722 ] result: www.baidu.com, qtype: 28, return SOA [2022-06-18 09:13:25,461][DEBUG][ dns_server.c:932 ] cache www.baidu.com qtype:28 ttl: 0 [2022-06-18 09:13:25,462][DEBUG][ dns_server.c:1947] from 45.113.192.102: seq=1 time=12, lasttime=749 id=15030 [2022-06-18 09:13:25,462][DEBUG][ fast_ping.c:393 ] ping 45.113.192.102 end, id 4 [2022-06-18 09:13:25,463][DEBUG][ dns_server.c:1947] from 45.113.192.101: seq=1 time=14, lasttime=12 id=15030 [2022-06-18 09:13:25,463][DEBUG][ dns_server.c:1341] reply www.baidu.com qtype: 1, rcode: 0, reply: 0 [2022-06-18 09:13:25,463][DEBUG][ dns_server.c:692 ] result: www.baidu.com, rtt: 12, 45.113.192.102 [2022-06-18 09:13:25,463][ INFO][ dns_server.c:559 ] result: www.baidu.com, id: 15030, index: 1, rtt: 12, 45.113.192.102 [2022-06-18 09:13:25,463][ INFO][ dns_server.c:559 ] result: www.baidu.com, id: 15030, index: 2, rtt: 14, 45.113.192.101 [2022-06-18 09:13:25,463][DEBUG][ dns_server.c:932 ] cache www.baidu.com qtype:1 ttl: 600 [2022-06-18 09:13:25,463][DEBUG][ dns_server.c:1065] Cache CNAME: www.wshifen.com, qtype: 1, speed: 12 [2022-06-18 09:13:25,463][DEBUG][ fast_ping.c:393 ] ping 45.113.192.101 end, id 5 [2022-06-18 09:13:34,436][DEBUG][ fast_ping.c:1209] icmp type faild, 3:0 [2022-06-18 09:13:34,436][DEBUG][ fast_ping.c:1284] recv ping packet from 205.210.31.23 failed. [2022-06-18 09:15:55,608][DEBUG][ fast_ping.c:1082] ping 2001::, id = 6 [2022-06-18 09:15:55,608][DEBUG][ fast_ping.c:860 ] from 2001::: error is Network is unreachable [2022-06-18 09:15:55,608][DEBUG][ fast_ping.c:393 ] ping 2001:: end, id 6

#######同时IPSET列表的结果: [root@ns1 ~]# ipset list abc Name: abc Type: hash:ip Revision: 1 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16544 References: 0 Members: 110.242.68.4 [root@ns1 ~]#

  1. 第2次查询的过程和结果: (是缓存结的结果.并且和第一次查询不一样)

    [root@ns1 ~]# dig @127.0.0.1 -p 254 www.baidu.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> @127.0.0.1 -p 254 www.baidu.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3013 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION: ;www.baidu.com. IN A

;; ANSWER SECTION: www.baidu.com. 388 IN CNAME www.wshifen.com. www.wshifen.com. 388 IN A 45.113.192.102 www.wshifen.com. 388 IN A 45.113.192.101

;; Query time: 0 msec ;; SERVER: 127.0.0.1#254(127.0.0.1) ;; WHEN: Sat Jun 18 09:16:57 CST 2022 ;; MSG SIZE rcvd: 89

-------- 同时的smartdns的LOG [2022-06-18 09:16:57,659][DEBUG][ dns_server.c:3993] recv query packet from 127.0.0.1, len = 42 [2022-06-18 09:16:57,659][DEBUG][ dns_server.c:4001] request qdcount = 1, ancount = 0, nscount = 0, nrcount = 0, len = 42, id = 3013, tc = 0, rd = 1, ra = 0, rcode = 0 [2022-06-18 09:16:57,659][ INFO][ dns_server.c:4017] query server www.baidu.com from 127.0.0.1, qtype = 1 [2022-06-18 09:16:57,659][ INFO][ dns_server.c:3036] RULE-MATCH, type: 3, domain: www.baidu.com, rule: com [2022-06-18 09:16:57,659][DEBUG][ dns_server.c:2566] name:www.baidu.com ttl: 0 cname: www.wshifen.com

---- IPSET的结果:(并无加上 45.113.192.102和 45.113.192.101) [root@ns1 ~]# ipset list abc Name: abc Type: hash:ip Revision: 1 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16544 References: 0 Members: 110.242.68.4 [root@ns1 ~]#

mark-syctnet avatar Jun 18 '22 01:06 mark-syctnet

目前程序设计ipset只有在第一次获取到结果的时候会设置,缓存命中不会设置 #944 查询时返回的不是全部上游测速结果而是最快应答上游的测速结果,还需要作者确认一下是不是这么设计的 @pymumu

PikuZheng avatar Jun 18 '22 01:06 PikuZheng

修正了,最新代码。

pymumu avatar Jun 18 '22 02:06 pymumu

@pymumu 查询时返回的不是全部上游测速结果而是最快应答上游的测速结果, 是这个设计的吗?

有没有办法设定上游结果优先级的办法. 如对上游发送请求时等待一个延迟的办法(相当TC 加一定延迟的方法).来控制尽量那个上游优先收到回应.

mark-syctnet avatar Jun 18 '22 14:06 mark-syctnet

用traffic control为出接口数据报增加人为延迟? 这和DNS加速原则背道而驰啊。不如您找找有没有更可靠的上游吧

PikuZheng avatar Jun 18 '22 15:06 PikuZheng

@pymumu 查询时返回的不是全部上游测速结果而是最快应答上游的测速结果, 是这个设计的吗?

有没有办法设定上游结果优先级的办法. 如对上游发送请求时等待一个延迟的办法(相当TC 加一定延迟的方法).来控制尽量那个上游优先收到回应.

是所有结果的最快地址,但为了体验,某些响应过慢的dns结果可能不会第一次就给客户端,而是放到后续缓存中备下次查询使用。

pymumu avatar Jun 18 '22 16:06 pymumu