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.46k stars 1.08k forks source link

关于domain-rules -delete,不知道是bug还是我对该设定的理解有误 #1286

Closed o0HalfLife0o closed 10 months ago

o0HalfLife0o commented 1 year ago

问题现象
domain-set设置域名相关规则后需要对该域名部分子域名做白名单处理, 比如对google.com设置-rr-ttl 1,但dl.google.com除外, 在使用domain-set的delete功能后,连续dig得到的结果ttl都是1,而不是默认设置的最低600

smartdns来源以及版本 41rc3

涉及的配置(注意去除个人相关信息) gfw.txt google.com

direct-list.txt dl.google.com

custom.conf

rrl-ttl-min 600
domain-set -name gfw -type list -file /etc/smartdns/domain-set/gfw.txt
domain-rules /domain-set:gfw/ -c none -n fakedns -no-serve-expired -rr-ttl 1
domain-set -name direct -type list -file /etc/smartdns/domain-set/direct-list.txt
domain-rules /domain-set:direct/ -delete
domain-rules /domain-set:direct/ -n chn
PikuZheng commented 1 year ago
domain-rules /domain-set:direct/ -delete
domain-rules /domain-set:direct/ -n chn

同一条规则 应该写在同一行 即

domain-rules /domain-set:direct/ -delete -n chn

但是我觉得你遇到的问题应该是今天另一个issue提到的,无法区分 *.google.com 和 google.com 的问题

o0HalfLife0o commented 1 year ago

@PikuZheng 写在同一行后,这条规则完全不生效,解析结果还是来自fakedns,而不是chn

PikuZheng commented 1 year ago

我感觉是写了两条 后一条覆盖了前一条

o0HalfLife0o commented 1 year ago

@PikuZheng 如果只保留delete,dig结果也还是fakedns,而不是默认dns组,所以不清楚delete到底delete了什么

PikuZheng commented 1 year ago

在我的理解 domain-rule /www.google.com/ 和 domain-rule /google.com/ 是两条不同的规则。所以 domain-rule /www.google.com/ -delete 并不会使得 domain-rule /google.com/ 匹配不到。

理论上子域名应该单独写入匹配规则,使新的规则覆盖旧的。或许可以试试 domain-rules /domain-set:direct/ -c ping -n chn -rr-ttl 600 ?

o0HalfLife0o commented 1 year ago

@PikuZheng 我现在就是这么做,但是有个问题, -no-serve-expired没法覆盖

PikuZheng commented 1 year ago

是的,本质上还是无法区分根域名和子域名的问题。我设规则时就(一刀切)设 .cn 走国内,但是自己的 .cn ddns就变得尴尬了

o0HalfLife0o commented 1 year ago

@PikuZheng smartdns的规则比如address, nameserver等都是后一条覆盖前一条做例外白名单,所以看到domain-rules -delete删除对应的规则,就以为是把多个规则的例外白名单简写成-delete 域名匹配的问题,如果正则太废资源,那限制域名匹配范围扩大应该比现在的匹配方式更省资源,也可以解决很多问题,比如https://github.com/pymumu/smartdns/issues/1285#issue-1595477740 ,也不知道@pymumu 会不会考虑

PikuZheng commented 1 year ago

@PikuZheng smartdns的规则比如address, nameserver等都是后一条覆盖前一条做例外白名单,所以看到domain-rules -delete删除对应的规则,就以为是把多个规则的例外白名单简写成-delete 域名匹配的问题,如果正则太废资源,那限制域名匹配范围扩大应该比现在的匹配方式更省资源,也可以解决很多问题,比如#1285 (comment) ,也不知道@pymumu 会不会考虑

相同规则( domain-rule /google.com/)才会后一条覆盖前一条,所以设计上 -delete应该删相同规则(我没看源码,猜测的)。 domain-rule /google.com/, domain-rule /www.google.com/ 是两条,实践上是按照顺序匹配的(先子域名再主域名最后根域名)。 所以 domain-rule /www.google.com/ -delete 后,domain-rule /google.com/ 还在并且是生效状态。

pymumu commented 1 year ago

-delete是删除对应域名的所有规则,这条规则要在前面的配置文件中创建过。

这里可以做成添加一条忽略父亲规则的规则。效果类似删除了继承的规则?