Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

--no-ipv6 修改: 不过滤、过滤所有、按域名tag过滤、按ip测试结果过滤 #157

Closed
zfl9 opened this issue Apr 2, 2024 · 5 comments

Comments

@zfl9
Copy link
Owner

zfl9 commented Apr 2, 2024

先说一些背景信息:


正在开发的 chinadns-ng 2.0 可配置最多 8 组【域名tag, 上游group, ipset/nftset.group】。

每个“组”都有 3 个可配置的信息,即:域名列表.txt将查询转发给什么上游将ip添加到哪个set(可选)。

若还不理解,可将这 3 个信息与 dnsmasq 的 --server=/domain/dns_server--ipset=/domain/setname 做类比。


  • 其中 2 组先前就已存在:

    • tag:chn:域名列表是--chnlist-file,上游group是--china-dns,ipset.group是--add-tagchn-ip
    • tag:gfw:域名列表是--gfwlist-file,上游group是--trust-dns,ipset.group是--add-taggfw-ip
  • 注意,tag:none 并不在这 8 组内,因为 tag:none 域名是未匹配任何列表的域名,此类域名有不同的处理逻辑:

    • 上游group是--china-dns--trust-dns(没有verdict缓存时,同时转发,有verdict缓存时,转发给特定group)
    • 对于ipset/nftset,只有ip test操作(chnroute/chnroute6,决定是否采纳china上游的结果,并记录verdict缓存)
  • 剩下的 6 个“组”是 2.0 新增的,每个“组”都有 3 个信息可配置,具体的:

    • 域名tag:给“组”起一个名字,不能是chngfwnone。域名(后缀)从用户提供的txt文件加载。
    • 上游group:这“组”域名 要转发给什么上游 DNS,允许配置多个,格式同 --china/trust-dns
    • ipset.group:若未空,则表示不需要收集ip;不为空则表示需要将ip添加到给定的ipset/nftset。

额外的这 6 个自定义“组”,可用于某些特殊需求,比如:

  • 公司的域名,走公司内网专用的 DNS 服务器。
  • DDNS 域名,用域名提供商的 DNS 服务器,尽快感知到 IP 变更。
@zfl9
Copy link
Owner Author

zfl9 commented Apr 2, 2024

因为新增了 tag,同时考虑到之前的 no-AAAA 逻辑有些许复杂,决定对 no-AAAA(ipv6) 功能进行重写。

注意:此修改将破坏与旧版本的兼容性,因为 --no-ipv6 的 rules 格式变了。


不过滤、过滤所有:

  • 未提供此选项:不过滤任何 AAAA 查询。
  • 未给出 rules:过滤所有 AAAA 查询。

rules 格式修改:

  • 与原先一样,支持多个 rule,但为了可读性,不再使用缩写,多个 rule 之间用逗号隔开。

按 tag 过滤,有以下 rule:

  • tag:chn:过滤 tag:chn 域名的 AAAA 查询
  • tag:gfw:过滤 tag:gfw 域名的 AAAA 查询
  • tag:none:过滤 tag:none 域名的 AAAA 查询
  • tag:xxx:过滤 tag:xxx 域名的 AAAA 查询,xxx 是指用户自定义的 tag 名字(见上面的说明)

按 tag 过滤 在 query 阶段进行,query 请求不会被转发到 upstream。


按 ip test 结果过滤,有以下 rule:

  • ip:china:若 response 中有 china ip,则过滤此 response。
  • ip:non_china:若 response 中有 non-china ip,则过滤此 response。

按 ip 过滤 在 response 阶段进行,IP 数据库是 chnroute6(ipset-name6 选项)。

@zfl9 zfl9 changed the title --no-ipv6 修改: 不过滤、过滤所有、按域名tag过滤、过滤非大陆ip的响应。 --no-ipv6 修改: 不过滤、过滤所有、按域名tag过滤、按ip测试结果过滤。 Apr 2, 2024
@zfl9 zfl9 changed the title --no-ipv6 修改: 不过滤、过滤所有、按域名tag过滤、按ip测试结果过滤。 --no-ipv6 修改: 不过滤、过滤所有、按域名tag过滤、按ip测试结果过滤 Apr 2, 2024
@zfl9 zfl9 mentioned this issue Apr 2, 2024
16 tasks
@muziling
Copy link

muziling commented Apr 2, 2024

这个设计初衷的使用方法是什么。比如先加载chn 地址到ipset组里,然后chinadns-ng用这个组实现防污染, 并且把解析后的IP打标放到新的ipset组里,然后透明代理转发这个新的组流量到代理服务器?

@zfl9
Copy link
Owner Author

zfl9 commented Apr 2, 2024

你是问新增的6组tag?还是新的no-aaaa规则?

@zfl9
Copy link
Owner Author

zfl9 commented Apr 2, 2024

设计的初衷就是为了对 域名列表 进行细分,方便某些需求,比如你说的 公司域名、腾讯域名 走特定的上游dns。至于要不要 add to set,看需求,这个是可选的(对于内置tag、自定义tag都是如此)。

因为默认情况下,只有两组(chn和gfw),对应的上游dns也是两组(china-dns、trust-dns)。

如果我没记错的话,你在 #144 里面讨论过一个情景,就是腾讯系域名想走腾讯的DNS服务器,防止微信转圈之类的。以及公司域名走公司自己的DNS(比如某些公司域名并未在互联网上注册,仅内部可见)。


优先级

自定义的域名tag(域名列表)的优先级 高于内置tag(gfwlist/chnlist),内置tag的优先级规则没变,默认gfwlist优先,可使用--chnlist-first切换为chnlist优先。

若相同的域名(后缀)存在于多个自定义tag的域名列表内,则优先级规则是:

  • 按命令行选项(包括来自配置文件的选项)顺序,后声明的自定义tag(域名列表)具有更高的优先级。

这 8 组 tag 的上游组可以不同(大部分情况下),当然也允许有相同的。ipset/nftset也是同理。

具体用途看你们的需求,怎么组合都行,要不要 add ip to set(以及 add 到哪个 set)都是可配置的。

总之,核心逻辑并没有发生本质上的变化(也就是你说的“防污染”、分流等功能),只是允许更加细微的控制:

  • 某些域名,我想转发给不同于 china-dns、trust-dns 所配置的 DNS 服务器 去解析。
    • ipset/nftset 信息可不配置,表示不需要收集这些域名的 ip。
    • 如果配置了,也可以与 --add-tagchn-ip、--add-taggfw-ip 的相同。
    • 也可以与 --add-tagchn-ip、--add-taggfw-ip 的不同,具体看你需求。

@zfl9
Copy link
Owner Author

zfl9 commented Apr 13, 2024

见最新版本。

@zfl9 zfl9 closed this as completed Apr 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants