smartdns icon indicating copy to clipboard operation
smartdns copied to clipboard

smardns 跨平台 Rust 版实现问题请教

Open mokeyish opened this issue 2 years ago • 27 comments

@pymumu 大佬, 我不熟悉 c,看 c 代码费劲。 在实现 rust 过程中有些问题,向您请教一下。

问题:

  1. address 规则中忽略,具体行为是这个域名直接不返回?报 no_records 错误么?
  2. bogus-nxdomain 和 ignore-ip 区别是什么?
  3. dualstack-ip-selection 是 ipv4 查询,发现 ipv6 更快,当前 ipv4 直接返回 SOA? 反之也是如此么?
  4. dualstack-ip-selection-threshold 指的是测速的超时时间么?还是相差超过这个值,执行优选?

mokeyish avatar Feb 18 '23 01:02 mokeyish

  1. 只是忽略规则。如果有父规则则应用父规则,没有则无规则。
  2. bogus-nxdomain是结果只要包含有列表中的IP,就返回NXDOMAIN错误码给客户端。ignore-ip,则是丢弃匹配的IP。
  3. 当前默认情况下,无论快慢,只要有IPV4,都会返回IPV4,IPV6则会进行选择。不主动fallback到IPV6是因为当前有些软件不支持IPV6,当然也可以强制开启fallback ipV6的功能dualstack-ip-allow-force-AAAA yes
  4. 对,单位是毫秒。当前默认应该是15ms。其实这个值当前还可以调小,尽量优先IPV4,IPV4的网络会比V6要好一些。

pymumu avatar Feb 18 '23 01:02 pymumu

谢谢,再确认下

  • 1、 子父规则?我从你的 README 上看到的是,bind 监听地址一级规则,优先级是最高的,然后是 domain-rule/address 这两个是相同优先级吧,具体是?
  • 3、 这个 fallback 是怎么实现的? 接收到的请求都是有明确的 record_type 的,请求 ipv6 发现 ipv6 不行,这个时候处理逻辑是?
  • 4、 是超时时间对吧? 15 ms 几乎没用,很容易超过这个时间

mokeyish avatar Feb 18 '23 02:02 mokeyish

子父规则是指子父域名,www.abc.com 忽略规则,就找 abc.com 的规则?

mokeyish avatar Feb 18 '23 02:02 mokeyish

  1. RULE1,RULE2,RULE3三个分别就是父子规则。 com RULE1 a.com RULE2 www.a.com RULE3
  2. 给客户端发送SOA
  3. 这里15ms是指的ping时延的差异,像qq.com, 163.com等。我这里IPV4和IPV6的ping时延是差不多的,所以大部分情况都是使用IPV6。

pymumu avatar Feb 18 '23 03:02 pymumu

大佬,smartdns 是不是有自动 fallback 机制?指定分组查询失败转默认分组默认分组失败转系统的 resolv.conf 配置?

感觉像是有的,具体是怎样的逻辑?

mokeyish avatar Feb 26 '23 01:02 mokeyish

大佬,smartdns 是不是有自动 fallback 机制?指定分组查询失败转默认分组默认分组失败转系统的 resolv.conf 配置?

感觉像是有的,具体是怎样的逻辑?

不应该有。 你说的可能是没有从默认分组中排除的上游,且没指定分组的查询,会走这个上游分组

PikuZheng avatar Feb 26 '23 02:02 PikuZheng

没有fallback

pymumu avatar Feb 26 '23 03:02 pymumu

那看样子,我也得把这个 fallback 去掉了。

mokeyish avatar Feb 26 '23 06:02 mokeyish

  1. 只是忽略规则。如果有父规则则应用父规则,没有则无规则。

这个说的好像不太对,我代码实现是按你上面说的。 https://github.com/mokeyish/smartdns-rs/blob/9eab50f8ee001d9ed248feb666d9f57b01e304e6/src/dns_mw_addr.rs#L54

如果是这样,子域名忽略,还是用了父域名的屏蔽规则,跟下面的说法对应不上:

图片

mokeyish avatar Mar 11 '23 00:03 mokeyish

忽略后就会停止找父规则,不是跳过的意思,代码上其实就是增加了一条忽略父规则的规则

pymumu avatar Mar 11 '23 01:03 pymumu

嗯嗯,我等等再调整一下。

还有个问题,bind server 上的,这两个选项,哪个优先级高?no_rule_soa? 图片

mokeyish avatar Mar 11 '23 01:03 mokeyish

看这里: https://github.com/pymumu/smartdns/blob/3c7b86eea755cf726a49d452a7b43ceeb01f2a06/src/dns_server.c#L496-L555

pymumu avatar Mar 11 '23 01:03 pymumu

好的,谢谢,看来是 no_rule_soa 优先级更高。感觉 c 代码可读性较弱😂,那些 return 0,-1, -2 一下子看不明白什么含义,我的习惯是换成枚举,c 好像也有枚举啊,忘了😅

mokeyish avatar Mar 11 '23 02:03 mokeyish

  1. 这里15ms是指的ping时延的差异,像qq.com, 163.com等。我这里IPV4和IPV6的ping时延是差不多的,所以大部分情况都是使用IPV6。

@pymumu 请问大大,dualstack-ip-selection-threshold可以设置为0吧?如果设置为0,是否只要V4比V6哪怕快1毫秒,也会返回V4;如果设置为1,是否差距在1ms以内的仍返回v6? 例如v4是14ms,v6是15ms,当dualstack-ip-selection-threshold设为0时,会返回V4,当设为1时,返回V6?

GuiDeJuShi avatar Mar 12 '23 06:03 GuiDeJuShi

是这样

pymumu avatar Mar 12 '23 07:03 pymumu

@pymumu 大佬,先前我已经加上监听 HTTPS 以及 TLS 了, 配置方式是:

bind-https ::443 -server-name dns.exmaple.com -ssl-certificate /etc/certs/dns.exmaple.com.crt -ssl-certificate-key /etc/certs/dns.exmaple.com.key

近期看到你这边也加上了监听 TLS,是全局的,

图片

但我有个问题,server_name 上面没有,你是放哪了?还是直接用了 IP?

mokeyish avatar Mar 15 '23 13:03 mokeyish

证书目前只考虑一份证书多个端口使用,每个端口使用单独的证书应该不是太常用,如果后面有的话,再增加参数设置到每个端口。

server_name,服务端没有校验server name,也没有使用,所以就没有参数设置。

pymumu avatar Mar 15 '23 14:03 pymumu

明白了,我这边 TLS 也没用 server_name,但是 HTTPS 用了。

mokeyish avatar Mar 15 '23 14:03 mokeyish

图片

@pymumu 大佬,问你个问题,

我 nslookup 很少用,dig 用的更多,在 windows 上,服务监听成功了,dig 可以查询,nslookup 第一查报超时错误,第二次索性直接 UnKnown can't find qq.com: No response from server (dig 查询依旧是正常的)是怎么回事啊?你有遇过到么?

mokeyish avatar Mar 21 '23 15:03 mokeyish

图片

@pymumu 大佬,问你个问题,

我 nslookup 很少用,dig 用的更多,在 windows 上,服务监听成功了,dig 可以查询,nslookup 第一查报超时错误,第二次索性直接 UnKnown can't find qq.com: No response from server (dig 查询依旧是正常的)是怎么回事啊?你有遇过到么?

看起来像是smartdns多网卡问题。bind :53@以太网,nslookup数据似乎不是从这个网口进去的

PikuZheng avatar Mar 22 '23 00:03 PikuZheng

看看是不是ip v6服务端没启用

pymumu avatar Mar 22 '23 03:03 pymumu

看看是不是ip v6服务端没启用

修复了,是查询了 ipv6 , 上游返回了 soa,被当成错误了。

mokeyish avatar Mar 22 '23 12:03 mokeyish

这里是普通的哈希查找?还是最小完美哈希(MPHF)?

图片

如果是完美哈希,一次哈希计算就能找到规则了,没必要后缀查找。

mokeyish avatar Apr 12 '23 15:04 mokeyish

子域名是没法用hash匹配的

pymumu avatar Apr 12 '23 15:04 pymumu

子域名是没法用hash匹配的

为啥不能呢?只要是域名就可以计算哈希啊。那你是用什么匹配的?字典树?

完美哈希的话计算域名完美哈希值,这个值就是偏移量,直接找到规则了。因为规则是静态的,可以应用 mph。

mokeyish avatar Apr 12 '23 23:04 mokeyish

子域名是没法用hash匹配的

为啥不能呢?只要是域名就可以计算哈希啊。那你是用什么匹配的?字典树?

完美哈希的话计算域名完美哈希值,这个值就是偏移量,直接找到规则了。因为规则是静态的,可以应用 mph。

比如域名 www.blog.sina.com.cn 要匹配到规则 /cn/,需要计算hash并查找5次?

PikuZheng avatar Apr 13 '23 01:04 PikuZheng

smartdns当前用的Suffix tree算法,域名查找时间复杂度O(1),也就是只要循环一次域名的字符串,就能找到规则。 如果用hash,只能分段hash,这样有些字符要重复查询,并且如果hash冲突了,还要遍历。

https://stackoverflow.com/questions/245878/how-do-i-choose-between-a-hash-table-and-a-trie-prefix-tree

pymumu avatar Apr 13 '23 01:04 pymumu

测试了一下后缀树速度还不如直接 hashmap。可能家用场景几万个域名,用不上前缀树。

mokeyish avatar Feb 29 '24 10:02 mokeyish

trie数对于字符串处理的时间复杂度是要小于hashtable的。理论上处理域名的性能是要高于hashtable的。 特别是域名不存在的情况,hash每次都要计算hash值,时间复杂度至少是O(k),但trie的话,如果找不到,时间复杂度可能就是O(1)

另外一点就是,hashtable不支持模糊匹配。trie可以模糊匹配。所以smartdns的address规则利用了次特性,简单支持了前缀*通配。

rust应该是有现成的后缀树。

pymumu avatar Feb 29 '24 12:02 pymumu