外观
DNS 与任播
本文讲怎么用共享 DNS 组提供权威 DNS,以及多节点订阅同组如何构成 anycast。模型从节点级 dns_zones 演进为共享 dns_groups——节点经 Node.dns_group_id 订阅一个组。表结构见 ../reference/database.md,schema 见 ../reference/desired-state.md。
所有
/api/v1/admin/*调用需携带 admin token,示例省略。
三层模型
| 层 | 字段要点 |
|---|---|
| DnsGroup | name、bind_addresses(任播服务地址,任播单一真源)、forwards(上游转发)、cache_ttl_seconds、enabled |
| DnsGroupZone | zone(声明权威 zone,自动 SOA)、可选 SOA 覆盖(primary_ns / admin_email / refresh…)、default_ttl |
| DnsRecord | 扁平模型 name / type / content / ttl(A/AAAA/CNAME/NS/PTR/TXT/MX/SRV/CAA);comment 仅 UI 不进 zone 文件 |
启用 DNS(订阅组)
建组、加 zone、加 record:
bashcurl -s -X POST "http://127.0.0.1:8000/api/v1/admin/dns-groups" \ -H "Content-Type: application/json" \ -d '{"name":"ng-anycast","bind_addresses":["172.20.202.57","fdc1:e451:2020:56::53"]}' curl -s -X POST "http://127.0.0.1:8000/api/v1/admin/dns-groups/1/zones" \ -H "Content-Type: application/json" -d '{"zone":"ng.dn42"}' curl -s -X POST "http://127.0.0.1:8000/api/v1/admin/dns-groups/1/zones/1/records" \ -H "Content-Type: application/json" \ -d '{"name":"ns1","type":"A","content":"172.20.202.57"}'让节点订阅该组(分配即启用):
bashcurl -s -X PUT "http://127.0.0.1:8000/api/v1/admin/nodes/edge1/dns-group" \ -H "Content-Type: application/json" -d '{"dns_group_id":1}'
订阅后 materialize 会把组的 zone/record 合进该节点 DesiredState.dns,agent 渲染 CoreDNS(coredns/Corefile + zones/db.<zone>)并注入 dns 容器(与 router-netns 共享网络)。接口见 ../reference/api.md,Web 操作见 web-ui.md。
任播(anycast)
多个节点订阅同一个组 = anycast:它们宣告相同的 bind_addresses,客户端就近命中。
任播地址由 bind_addresses 单一真源派生(_normalize_dns_anycast):
- 派生出受管
dns-anycastdummy 接口,把 bind 地址挂为/32(v4)//128(v6)。 - 该接口
track_service=true,BIRD 起源对应任播前缀进 BGP。 - 这是全项目最干净的"副本→派生"范例,见 ../reference/addressing-model.md。
历史上任播地址曾各存一份在每节点
dn42-lo,已用deploy/dns_anycast_lo_cleanup.py迁到共享dns-anycastdummy 并剥重复(见 ../reference/cli-and-scripts.md)。
任播服务地址应落在专门的任播分区(如 172.20.202.56/29 + :56::/64),与节点单播 loopback 不重叠,见 addressing-and-renumber.md。
rDNS(反向解析)
反向 zone 同样建为组内 zone(如 0/26.202.20.172.in-addr.arpa),PTR 用 DnsRecord 加。批量创建 /26 反向可用 scripts/tools/create_rdns_26.py(见 ../reference/cli-and-scripts.md)。renumber 后必须同步 PTR,见 addressing-and-renumber.md。
验证
bash
dig @172.20.202.57 ng.dn42 SOA
dig @172.20.202.57 ns1.ng.dn42 A
docker exec dn42-edge1-dn42-bird-router-1 birdc show route where net ~ [ 172.20.202.57/32 ]CoreDNS 变更后若旧节点未带 reload,大 zone 变动可能需重启 dns 容器。