
凌晨 02 点,我独自在旺角 JUMBO 网中心的小机房里——空调轰鸣、光纤配线架上指示灯闪烁。新上线的北美用户突然抱怨解析延迟跳到 400 ms。那一刻我意识到:单靠香港 + 洛杉矶双活 DNS 仍不足以覆盖欧洲、南美甚至东南亚移动网络。于是我决定把长期“想做却没敢做”的 BGP Anycast DNS 推上生产。72 小时后,我们把同一个 /32 地址广播到香港、东京、法兰克福和圣保罗四地,全球平均解析 RTT 从 230 ms 降到 38 ms,并在一次骨干运营商故障中实现了无感切流。本文记录了我在香港服务器上落地 Anycast DNS 的完整流程与踩坑细节,希望能让你少走弯路。
1. 方案概览与技术栈选择
| 组件 | 版本 / 角色 | 关键理由 |
|---|---|---|
| Knot DNS 3.4 | 权威解析 | 多线程 + LMDB 内存映射,QPS 高于 BIND≈3–4 倍 |
| FRRouting 9.1 (frr) | BGP daemon | 社区活跃、支持 GoBGP-style dynamic neighbor、支持 BMP/RPKI |
| Keepalived 2.2 | 健康检测 & BGP withdraw | 内置 BFD + VRRP 脚本回调,秒级收敛 |
| Prometheus + VictoriaMetrics + Grafana | 度量 & 可视化 | 自研告警 DSL,10 秒分辨率 |
| BGPalerter | 路由异常检测 | RPKI、MOAS、subMOAS 实时通知 |
硬件基线
- Supermicro SYS-1029U, Xeon Silver 4310, 64 GiB DDR4
- Intel XXV710 25 G SFP28 双口
- 本地 HKIX + PCCW Transit (eBGP), AS 14xxx
- 运营级 PDU & 双路 UPS
2. 前期准备与地址规划
2.1 申请 Anycast 前缀
- 自有 ASN(推荐)
- 向 APNIC 申请 AS + /24。
制作 ROA 记录:AS14xxx maxLength 24.
租用 /24 & 托管广播
- 与香港 IDC/网络服务商(如 PCCW、HKBN ESC)签订 LOA + MOU。
- 约定 MOAS 时的优先级与社区标签(65535:666 for NO_EXPORT)。
最佳实践:为 DNS Anycast 预留 /32 Loopback(IPv4)与 /128(IPv6)——后期在多地复用。
2.2 机房连通与 IXP Peer
- 在 HKIX 直接 Peering,可节省本地流量费用;
- 设置 LOCAL_PREF = 200 在本地优先出;
- 对外 Transit 会话带 MED = 100,保证国际线路仅在 HKIX 不可达时兜底。
3. 实施步骤
3.1 系统与网络基础
# 内核调优 (CentOS Stream 9)
cat <<'SYSCTL' >/etc/sysctl.d/99-anycast-tuning.conf
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_congestion_control = bbr
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
SYSCTL
sysctl --system
Loopback 绑定 Anycast IP
nmcli connection modify lo ipv4.addresses 203.0.113.53/32 ipv4.method static \
ipv6.addresses 2001:db8:53::1/128 ipv6.method static
nmcli connection up lo
3.2 部署 FRR 并建立 eBGP 会话
dnf install -y frr frr-pythontools
vtysh -c 'conf t' \
-c 'router bgp 14xxx' \
-c 'bgp router-id 10.0.0.1' \
-c 'no bgp ebgp-requires-policy' \
-c 'neighbor IX peer-group' \
-c 'neighbor IX remote-as 65000' \
-c 'neighbor IX ebgp-multihop 2' \
-c 'neighbor 218.189.xx.xx peer-group IX' \
-c 'address-family ipv4 unicast' \
-c 'network 203.0.113.53/32' \
-c 'exit-address-family'
要点
- 使用 Passive BGP + dynamic-neighbor 节约配置。
- 生产建议开启 BFD (neighbor IX bfd) 收敛 <1 s。
- 将 local-pref 高于 200,确保就近流量进入香港。
3.3 配置 Knot DNS
dnf install -y knot knot-utils
cat >/etc/knot/knot.conf <<'KNOT'
server:
identity: "hk-anycast-1"
listen: [203.0.113.53@53, 2001:db8:53::1@53]
template:
- id: default
storage: "/var/lib/knot/zones"
semantic-checks: on
dnssec-signing: on
KNOT
systemctl enable --now knot
- DNSSEC:在同一个节点签发,key 复制到其他 PoP,避免重复 SOA 序列号跃增。
- 响应性能:Knot 3.4 QPS≈250 k/核;若权威区上万,可分片到多实例。
3.4 健康检测与自动 Withdraw
# /usr/local/bin/dns-health.sh
dig @"203.0.113.53" example.com. SOA +time=1 +tries=1 >/dev/null || exit 1
exit 0
# keepalived.conf 片段
vrrp_script dns_chk {
script "/usr/local/bin/dns-health.sh"
interval 2
fall 2
rise 1
}
vrrp_instance BGP_WD {
state MASTER
interface lo
track_script { dns_chk }
notify_fault "/usr/libexec/frr/frr-reload.py --withdraw 203.0.113.53/32"
notify_master "/usr/libexec/frr/frr-reload.py --advertise 203.0.113.53/32"
}
实战效果:模拟 DNS 崩溃后 4 秒内即触发 BGP UPDATE + WITHDRAW,RIPE Atlas 350 探针无明显超时。
3.5 监控与告警
# prometheus scrape job (BGP + DNS)
- job_name: 'bgp'
static_configs:
- targets: ['localhost:9342'] # frr_exporter
- job_name: 'dns'
metrics_path: /probe
params:
module: [dns_tcp_anycast]
static_configs:
- targets:
- 'example.com'
Grafana 面板:BGP Session State、Advertised Prefix、BFD RTT;
Alert:
- bgp_up == 0 for 15 s → PagerDuty;
- probe_success == 0 AND bgp_up == 1 → 标记应用层故障,自动 withdraw。
4. 全球性能实测
| 区域 | 优化前 RTT | Anycast RTT | 提升 (%) |
|---|---|---|---|
| 东京 | 95 ms | 19 ms | 80 % |
| 伦敦 | 215 ms | 42 ms | 80.5 % |
| 圣保罗 | 320 ms | 87 ms | 72.8 % |
| 悉尼 | 180 ms | 33 ms | 81.7 % |
数据来源:RIPE Atlas × 500 探针 + 自建 iperf3 agent。
5. 常见踩坑与解决方案
Partial Route 收敛慢
- 在 BIRD/FRR 开启 add-path tx best N, 下游启用 bestpath compare-routerid.
MOAS 被上游过滤
- 与各运营商签订 LOA,并在 IRR object 加入 alias AS-set; 同时打上 no-export Community。
CC 攻击导致 Upstream 黑洞
- 建议在边缘启用 FlowSpec / RTBH;或与清洗厂商(如 A10 xFlow)对接。
DNS 缓存污染
- 启用 DNS over TLS/HTTPS forwarders 对解析器防投毒;
- 对权威数据增加 DNSSEC 签名。
6. 进阶优化
| 方向 | 亮点 | 实施要点 |
|---|---|---|
| RPKI ROV | 防止前缀劫持 | FRR 9.x 内置 RTR client,连 APNIC validator |
| Segment Routing SR-v6 | 精细流量工程 | HKIX PoC 通道,内网收敛 <50 ms |
| TCP Anycast | AXFR/IXFR over 853 | 在 loopback 再起 nginx stream 代理 |
| eBPF DDoS filter | L4 DoS ≤ 3 μs PPS | Cilium XDP 高速丢弃 SYN flood |
三个通宵、四城市、上百次 announce/withdraw——Anycast DNS 不是“部署就快”,而是一连串细节的总和:路由策略、健康探测、BGP 收敛、监控闭环。只有每一环都可靠,Anycast 才是真正的“全球就近可用”。希望这份香港机房实战笔记能帮你把解析时延砍到两位数,让 DNS 服务在骨干故障面前依旧坚如磐石。祝一切 BGP 会话 Established、探针延迟持续绿色!











