[Proposal] remove `must_*` and add `dns` as a builtin outbound
Opened this issue · 8 comments
Proposal
提案
把 must_* 去掉,由 isdns
匹配规则和显式的 dns
outbound 替代原有功能,相关变更有
- 去掉
must_*
以及*(must)
outbound - 添加
isdns
匹配规则 - 添加
dns
outbound
一些可能的变种
isdns
可以命名为is_dns
或者其他更合适的名字, 甚至直接用dport(53)
替代 (如果我们认为这个判断标准已经足够并且在未来不太会发生变化的话)dns
可以命名为builtin_dns
或者其他更合适的名字
Use Cases
比如原来的配置:
# implicit: isdns -> dns
pname(mosdns) -> must_rules
可以替换成
isdns && !pname(mosdns) -> dns
类似地
# implicit: isdns -> dns
pname(mosdns) -> must_my_group
可以替换成
isdns && !pname(mosdns) -> dns
pname(mosdns) -> my_group
或者
pname(mosdns) -> my_group
isdns -> dns
Potential Benefits
- 将一些 implicit 的逻辑给 explicit 地暴露到配置中,增强了相关配置的可理解性。
- 可能能提供一些额外的灵活性 (暂时没想到具体的例子)
Scope
No response
Reference
No response
Implementation
No response
Thanks for opening this issue!
从语义上,这样的拆分是较为成功的。但从实际出发,dae 不希望 dns 流量绕过 dns 模块,从而带来 domain 内核侧分流失败的问题。
另外,显式让用户考虑 dns 的问题会使得语法变得复杂,dae 的设计原则应当保持入门简单,扩展丰富的特点。
尽管目前 must_* 的语义并不易理解,但在大多数场景下它对于入门来说不会引入负担,用户不需要理解 dns 模块的数据流向,仅在遇到困难时查询特定文档。
must_* 不易理解的问题的确引人关注,如果这些问题都能够妥善解决,我不介意支持这些修改。
那么这样呢: 当检测到配置中不存在 -> dns
路由规则的情况下,隐式地在最前面加一条 isdns -> dns
。 这样你觉得可行么?
@luochen1990 这是一个好主意,但我建议通过显式给出 isdns -> no_inherent_hijack 使得隐式规则失效。这应该是个固定语句,任何其他的语句指向该出站都需要报错。
@mzz2017 那我感觉可以做成一个选项,可以就放 dns 下面
dns {
implicit_hijack: true # 默认 true 以兼容之前的行为,改成 false 以手动选取流量路由到 dns outbound
}
用 enable_manual_hijack 吧,开启之后 isdns 和 dns 出站才可使用。
或者中间的词汇有更好的选择吗
那就 enable_explicit_hijack ? 或者 disable_implicit_hijack ? 我感觉后者好一点,因为它更显著的效果是 disable
@luochen1990 可以