香港服务器通过BGP Anycast部署高可用全球DNS服务,解析延迟降至30ms

香港服务器通过BGP Anycast部署高可用全球DNS服务,解析延迟降至30ms

凌晨 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、探针延迟持续绿色!

未经允许不得转载:A5数据 » 香港服务器通过BGP Anycast部署高可用全球DNS服务,解析延迟降至30ms

相关文章

contact