plan: add zone-wise acl control

plan: fix config example
This commit is contained in:
Luna Yao
2026-04-06 11:54:01 +02:00
parent 0b6ff1ecd7
commit 07376eb690
+32 -16
View File
@@ -1,15 +1,21 @@
目标 ## 目标
---
`instance/dns_server` 重写为单独的 `dns` 模块,为如下的配置项提供支持: `instance/dns_server` 重写为单独的 `dns` 模块,为如下的配置项提供支持:
```toml ```toml
[dns] [dns]
name = "localhost" # optional, replaces hostname, default to system hostname name = "localhost" # optional, replaces hostname, default to system hostname
domain = "localdomain" # optional, replaces tld_dns_zone, default to et.net domain = "localdomain" # optional, replaces tld_dns_zone, default to et.net
[[dns.zone]] # this policy applies to all zones with origin "example.com"
broadcast = true # optional, propogate this config to all connected peers, default to false [dns."example.com".import]
whitelist = ["*"]
blacklist = []
disabled = true # optional, whether to reject zones with this origin from connected peers, default to false
recursive = true # optional, apply this policy to all subzones, default to false
origin = "example.com" [[dns.zone]]
origin = "example.com" # required, name of the zone
ttl = 3600 # optional, default to 0 ttl = 3600 # optional, default to 0
records = [ records = [
"www 60 IN A 123.123.123.123", "www 60 IN A 123.123.123.123",
@@ -20,7 +26,12 @@ forwarders = [
"1.1.1.1", "1.1.1.1",
] # optional, forward DNS requests to these servers ] # optional, forward DNS requests to these servers
# same zone, but not broadcasted # this policy applies to the current zone block
[dns.zone.export] # if present, export this zone to connected peers
whitelist = ["*"]
blacklist = []
# same zone, but not exported
[[dns.zone]] [[dns.zone]]
origin = "example.com" origin = "example.com"
@@ -28,7 +39,9 @@ forwarders = [
"tcp://192.168.0.53:5353", "tcp://192.168.0.53:5353",
] ]
``` ```
可能会支持的配置 可能会支持的配置
```toml ```toml
[dns] [dns]
addresses = [ addresses = [
@@ -49,8 +62,8 @@ listeners = [
<details> <details>
<summary><h2>计划和进展</h2></summary> <summary><h2>计划和进展</h2></summary>
protobuf ## protobuf
---
- `ZoneConfigPb`:包含所有 Zone 配置,以及一个 ID,该 ID 在读取 TOML 时生成 - `ZoneConfigPb`:包含所有 Zone 配置,以及一个 ID,该 ID 在读取 TOML 时生成
- `DnsConfigPb`:包含 `name``domain` 和需要广播的 `ZoneConfigPb` - `DnsConfigPb`:包含 `name``domain` 和需要广播的 `ZoneConfigPb`
- `DnsMessageId`: 标记 DnsClient 和它发送的 RPC 消息,避免乱序,包含:instance id, sequence number - `DnsMessageId`: 标记 DnsClient 和它发送的 RPC 消息,避免乱序,包含:instance id, sequence number
@@ -58,9 +71,10 @@ protobuf
- `DnsPersistentConfig`: 用于 DnsServer 的长期接口,包含:id、listeners 和 addresses - `DnsPersistentConfig`: 用于 DnsServer 的长期接口,包含:id、listeners 和 addresses
- `DnsHeartbeat`: DnsClient 发送的心跳,包含:id - `DnsHeartbeat`: DnsClient 发送的心跳,包含:id
DnsClient ## DnsClient
---
对于每个实例,它启动时读取 TOML 配置,然后用这个配置启动一个 DnsClient ,它需要做到: 对于每个实例,它启动时读取 TOML 配置,然后用这个配置启动一个 DnsClient ,它需要做到:
1. 启动时(配置更新时?)向 DnsServer 发送 listeners 和 addresses 1. 启动时(配置更新时?)向 DnsServer 发送 listeners 和 addresses
2. 使用自己的 name 和 domain 创建一个专用 zone,让 name 指向自身 IP,并监听 IP 地址变化事件(为 DNS 一致性避免使用 127.0.0.1 作为 IP,若没有 IP 则不创建这个 zone) 2. 使用自己的 name 和 domain 创建一个专用 zone,让 name 指向自身 IP,并监听 IP 地址变化事件(为 DNS 一致性避免使用 127.0.0.1 作为 IP,若没有 IP 则不创建这个 zone)
3. 每次获得 PeerRouteInfo 时,读取其中的 dns 字段(和一些别的身份标记字段),这是个 protobuf message (DnsConfigPb),保存了远程 Peer 的 dns 配置(不含 addresses 和 listeners),接收后它需要: 3. 每次获得 PeerRouteInfo 时,读取其中的 dns 字段(和一些别的身份标记字段),这是个 protobuf message (DnsConfigPb),保存了远程 Peer 的 dns 配置(不含 addresses 和 listeners),接收后它需要:
@@ -68,8 +82,8 @@ DnsClient
2. 检查 2., 3.i. 中得到的 zone、PeerRouteInfo 报告的 zone、本机 TOML 配置中的 zone 是否有变化,将所有有变化的 zone 报告给 DnsServer,如果没变化就不要上报 2. 检查 2., 3.i. 中得到的 zone、PeerRouteInfo 报告的 zone、本机 TOML 配置中的 zone 是否有变化,将所有有变化的 zone 报告给 DnsServer,如果没变化就不要上报
4. 每隔一小段时间向 DnsServer 发送心跳 4. 每隔一小段时间向 DnsServer 发送心跳
DnsServer ## DnsServer
---
每个 EasyTier 实例都会启动一个 DnsClient,但是一台机器上的所有实例共享一个唯一的 DnsServer。 每个 EasyTier 实例都会启动一个 DnsClient,但是一台机器上的所有实例共享一个唯一的 DnsServer。
每个实例启动时: 每个实例启动时:
@@ -98,16 +112,16 @@ DnsServer 需要做到:
另外任何关于系统 DNS 的操作,清理都参考现有的 magic dns。 另外任何关于系统 DNS 的操作,清理都参考现有的 magic dns。
问题 ## 问题
---
- [ ] [minor] the ttl option isn't working because of https://github.com/hickory-dns/hickory-dns/pull/3450 - [ ] [minor] the ttl option isn't working because of https://github.com/hickory-dns/hickory-dns/pull/3450
- [minor] address 路由绑定必须在有 tun 的实例上做;listener 绑定则与 tun 无关,现有竞选机制无法保证有 tun 的实例能优先启动 DnsServer - [minor] address 路由绑定必须在有 tun 的实例上做;listener 绑定则与 tun 无关,现有竞选机制无法保证有 tun 的实例能优先启动 DnsServer
- 或许让 DnsClient 控制关于 address 的路由和 filter,并通过 RPC 转发 DNS 请求?有两个问题:DnsServer 必须得知 addresses 否则无法进行环路检测;多个 DnsClient 同时修改 resolv.conf 添加自己得 address 容易出问题 - 或许让 DnsClient 控制关于 address 的路由和 filter,并通过 RPC 转发 DNS 请求?有两个问题:DnsServer 必须得知 addresses 否则无法进行环路检测;多个 DnsClient 同时修改 resolv.conf 添加自己得 address 容易出问题
- 或许不妨假设大多数情况下一台机器上所有实例的 no_tun 设置相同,这时候这个问题实际上不存在 - 或许不妨假设大多数情况下一台机器上所有实例的 no_tun 设置相同,这时候这个问题实际上不存在
- [minor] DnsServer 更新 zone 的时候需要更精细的合并/去重控制 - [minor] DnsServer 更新 zone 的时候需要更精细的合并/去重控制
TODO ## TODO
---
- [x] 配置解析 - [x] 配置解析
- [ ] 用 OSPF 传播需要广播的配置 - [ ] 用 OSPF 传播需要广播的配置
- [ ] 用 DNS RPC 更新收到的配置,合并相同的域,延迟低的 peer 配置优先 - [ ] 用 DNS RPC 更新收到的配置,合并相同的域,延迟低的 peer 配置优先
@@ -128,7 +142,9 @@ TODO
- related to https://github.com/EasyTier/EasyTier/issues/1645 - related to https://github.com/EasyTier/EasyTier/issues/1645
- related to https://github.com/EasyTier/EasyTier/issues/1764 - related to https://github.com/EasyTier/EasyTier/issues/1764
- related to https://github.com/EasyTier/EasyTier/issues/1814 - related to https://github.com/EasyTier/EasyTier/issues/1814
--- ---
- (maybe) related to https://github.com/EasyTier/EasyTier/issues/937 - (maybe) related to https://github.com/EasyTier/EasyTier/issues/937
- (maybe) related to https://github.com/EasyTier/EasyTier/issues/1873 - (maybe) related to https://github.com/EasyTier/EasyTier/issues/1873