daeuniverse/dae

[Proposal] remove `must_*` and add `dns` as a builtin outbound

Opened this issue · 8 comments

Proposal

提案

把 must_* 去掉,由 isdns 匹配规则和显式的 dns outbound 替代原有功能,相关变更有

  1. 去掉 must_* 以及 *(must) outbound
  2. 添加 isdns 匹配规则
  3. 添加 dns outbound

一些可能的变种

  1. isdns 可以命名为 is_dns 或者其他更合适的名字, 甚至直接用 dport(53) 替代 (如果我们认为这个判断标准已经足够并且在未来不太会发生变化的话)
  2. 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

  1. 将一些 implicit 的逻辑给 explicit 地暴露到配置中,增强了相关配置的可理解性。
  2. 可能能提供一些额外的灵活性 (暂时没想到具体的例子)

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