smartdns
smartdns copied to clipboard
smardns 跨平台 Rust 版实现问题请教
@pymumu 大佬, 我不熟悉 c,看 c 代码费劲。 在实现 rust 过程中有些问题,向您请教一下。
问题:
- address 规则中忽略,具体行为是这个域名直接不返回?报 no_records 错误么?
- bogus-nxdomain 和 ignore-ip 区别是什么?
- dualstack-ip-selection 是 ipv4 查询,发现 ipv6 更快,当前 ipv4 直接返回 SOA? 反之也是如此么?
- dualstack-ip-selection-threshold 指的是测速的超时时间么?还是相差超过这个值,执行优选?
- 只是忽略规则。如果有父规则则应用父规则,没有则无规则。
- bogus-nxdomain是结果只要包含有列表中的IP,就返回NXDOMAIN错误码给客户端。ignore-ip,则是丢弃匹配的IP。
- 当前默认情况下,无论快慢,只要有IPV4,都会返回IPV4,IPV6则会进行选择。不主动fallback到IPV6是因为当前有些软件不支持IPV6,当然也可以强制开启fallback ipV6的功能
dualstack-ip-allow-force-AAAA yes - 对,单位是毫秒。当前默认应该是15ms。其实这个值当前还可以调小,尽量优先IPV4,IPV4的网络会比V6要好一些。
谢谢,再确认下
- 1、 子父规则?我从你的 README 上看到的是,bind 监听地址一级规则,优先级是最高的,然后是 domain-rule/address 这两个是相同优先级吧,具体是?
- 3、 这个 fallback 是怎么实现的? 接收到的请求都是有明确的 record_type 的,请求 ipv6 发现 ipv6 不行,这个时候处理逻辑是?
- 4、 是超时时间对吧? 15 ms 几乎没用,很容易超过这个时间
子父规则是指子父域名,www.abc.com 忽略规则,就找 abc.com 的规则?
- RULE1,RULE2,RULE3三个分别就是父子规则。 com RULE1 a.com RULE2 www.a.com RULE3
- 给客户端发送SOA
- 这里15ms是指的ping时延的差异,像qq.com, 163.com等。我这里IPV4和IPV6的ping时延是差不多的,所以大部分情况都是使用IPV6。
大佬,smartdns 是不是有自动 fallback 机制?指定分组查询失败转默认分组?默认分组失败转系统的 resolv.conf 配置?
感觉像是有的,具体是怎样的逻辑?
大佬,smartdns 是不是有自动
fallback机制?指定分组查询失败转默认分组?默认分组失败转系统的 resolv.conf 配置?感觉像是有的,具体是怎样的逻辑?
不应该有。 你说的可能是没有从默认分组中排除的上游,且没指定分组的查询,会走这个上游分组
没有fallback
那看样子,我也得把这个 fallback 去掉了。
- 只是忽略规则。如果有父规则则应用父规则,没有则无规则。
这个说的好像不太对,我代码实现是按你上面说的。 https://github.com/mokeyish/smartdns-rs/blob/9eab50f8ee001d9ed248feb666d9f57b01e304e6/src/dns_mw_addr.rs#L54
如果是这样,子域名忽略,还是用了父域名的屏蔽规则,跟下面的说法对应不上:

忽略后就会停止找父规则,不是跳过的意思,代码上其实就是增加了一条忽略父规则的规则
嗯嗯,我等等再调整一下。
还有个问题,bind server 上的,这两个选项,哪个优先级高?no_rule_soa?

看这里: https://github.com/pymumu/smartdns/blob/3c7b86eea755cf726a49d452a7b43ceeb01f2a06/src/dns_server.c#L496-L555
好的,谢谢,看来是 no_rule_soa 优先级更高。感觉 c 代码可读性较弱😂,那些 return 0,-1, -2 一下子看不明白什么含义,我的习惯是换成枚举,c 好像也有枚举啊,忘了😅
- 这里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?
是这样
@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?
证书目前只考虑一份证书多个端口使用,每个端口使用单独的证书应该不是太常用,如果后面有的话,再增加参数设置到每个端口。
server_name,服务端没有校验server name,也没有使用,所以就没有参数设置。
明白了,我这边 TLS 也没用 server_name,但是 HTTPS 用了。

@pymumu 大佬,问你个问题,
我 nslookup 很少用,dig 用的更多,在 windows 上,服务监听成功了,dig 可以查询,nslookup 第一查报超时错误,第二次索性直接 UnKnown can't find qq.com: No response from server (dig 查询依旧是正常的)是怎么回事啊?你有遇过到么?
@pymumu 大佬,问你个问题,
我 nslookup 很少用,dig 用的更多,在 windows 上,服务监听成功了,dig 可以查询,
nslookup第一查报超时错误,第二次索性直接UnKnown can't find qq.com: No response from server(dig 查询依旧是正常的)是怎么回事啊?你有遇过到么?
看起来像是smartdns多网卡问题。bind :53@以太网,nslookup数据似乎不是从这个网口进去的
看看是不是ip v6服务端没启用
看看是不是ip v6服务端没启用
修复了,是查询了 ipv6 , 上游返回了 soa,被当成错误了。
这里是普通的哈希查找?还是最小完美哈希(MPHF)?

如果是完美哈希,一次哈希计算就能找到规则了,没必要后缀查找。
子域名是没法用hash匹配的
子域名是没法用hash匹配的
为啥不能呢?只要是域名就可以计算哈希啊。那你是用什么匹配的?字典树?
完美哈希的话计算域名完美哈希值,这个值就是偏移量,直接找到规则了。因为规则是静态的,可以应用 mph。
子域名是没法用hash匹配的
为啥不能呢?只要是域名就可以计算哈希啊。那你是用什么匹配的?字典树?
完美哈希的话计算域名完美哈希值,这个值就是偏移量,直接找到规则了。因为规则是静态的,可以应用 mph。
比如域名 www.blog.sina.com.cn 要匹配到规则 /cn/,需要计算hash并查找5次?
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
测试了一下后缀树速度还不如直接 hashmap。可能家用场景几万个域名,用不上前缀树。
trie数对于字符串处理的时间复杂度是要小于hashtable的。理论上处理域名的性能是要高于hashtable的。 特别是域名不存在的情况,hash每次都要计算hash值,时间复杂度至少是O(k),但trie的话,如果找不到,时间复杂度可能就是O(1)
另外一点就是,hashtable不支持模糊匹配。trie可以模糊匹配。所以smartdns的address规则利用了次特性,简单支持了前缀*通配。
rust应该是有现成的后缀树。