Hotdry.
systems-engineering

自托管容错 NAT 网关:Keepalived VRRP 领导选举 + BGP Anycast 路由 + Prometheus 告警

使用 Keepalived VRRP 实现主备切换、BGP Anycast 任意播路由、Prometheus 监控告警,自建 NAT 网关匹配 AWS 高可用性,成本仅为几分之一。

自托管 NAT 网关是云原生环境中常见的网络组件,用于私有网络出公网流量转发。AWS NAT Gateway 提供高可用(HA)配置,但小时计费模式下成本高企,年费数万美元。自建方案利用 Keepalived VRRP 实现领导选举与 VIP 漂移、BGP Anycast 路由多节点负载与故障转移、Prometheus 告警监控,可实现 99.99% 可用性,成本降至原先的 1/10 以下。

VRRP 领导选举与 VIP 漂移核心机制

Keepalived 基于 VRRP(Virtual Router Redundancy Protocol)协议,实现主备节点间虚拟 IP(VIP)无缝漂移,避免单点故障。主节点(MASTER)优先级高于备节点(BACKUP),通过组播心跳(advert_int 1s)检测存活。主节点故障时,备节点 3s 内接管 VIP。

可落地配置参数(主节点 /etc/keepalived/keepalived.conf):

global_defs {
    router_id NAT_MASTER
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}
vrrp_script chk_nat {
    script "pidof iptables || exit 1"
    interval 2
    weight -20  # 失败降优先级 20
}
vrrp_instance VI_NAT {
    state MASTER
    interface eth0  # 出公网接口
    virtual_router_id 51
    priority 110    # 主备差值 ≥10
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass natkey123
    }
    virtual_ipaddress {
        10.0.0.1/24   # 内网 VIP,作为后端默认网关
    }
    track_script {
        chk_nat
    }
}

备节点将 state 改为 BACKUP、priority 100。启用 IP 转发:sysctl -w net.ipv4.ip_forward=1,持久化 /etc/sysctl.conf

NAT 规则(主备同步脚本):iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE。使用 notify_master/backup/fault 脚本同步规则,避免漂移后丢失。

证据验证:DigitalOcean 教程显示,此配置下主备切换 <3s,ping 不丢包。“通过 Keepalived 和 iptables,我们可以在 Linux 上配置高可用的 NAT 网关,确保主网关故障时备份自动接管。”

风险:网络分区导致脑裂(split-brain),限制造成 vrrp_strict 模式,unicast_peer 绑定对端 IP 防组播风暴。

BGP Anycast 路由实现任意播高可用

传统 VRRP 限单数据中心,跨 AZ/DC 需 BGP Anycast。将 NAT VIP 作为 Anycast IP,多节点向上游 ISP 宣布相同前缀(/32),BGP 自动路由至最近健康节点,故障时撤回路由(withdraw)秒级收敛。

部署清单

  1. 获取 ASN & PI IP(自有或隧道如 Cloudflare Magic Transit)。
  2. 安装 FRR/Bird:yum install frrouting,配置 BGP:
router bgp 65001
 bgp router-id 10.0.0.1
 neighbor 203.0.113.1 remote-as 64496  # 上游 ISP
 address-family ipv4 unicast
  network 10.0.0.1/32  # Anycast NAT IP
  neighbor 203.0.113.1 activate
 exit-address-family
  1. Keepalived notify_master 脚本:vtysh -c "configure terminal" -c "router bgp 65001" -c "address-family ipv4 unicast" -c "network 10.0.0.1/32" -c "end" -c "write";fault/stop 撤回。

多节点(3+)部署,ECMP 等价多径分流。Prometheus exporter(如 bgp-exporter)监控 peer 状态,告警撤回延迟 >5s。

参数阈值

  • BGP keepalive 60s、hold 180s。
  • AS-Path 预置本地优先。
  • 成本:VPS 月费 $10 / 节点 vs AWS NAT $0.045 / 小时(年 $400+)。

Prometheus 告警与监控要点

集成 node_exporter + blackbox_exporter 监控:

  • VRRP:up{job="keepalived"} == 0 → "MASTER 丢失"。
  • BGP:bgp_peer_state != "Established" → 路由中断。
  • Conntrack:node_nf_conntrack_entries{zone="0"} > 80% → NAT 表满。
  • 流量:rate(node_network_receive_bytes_total[5m]) > 1GB/s → 过载。

告警规则(prometheus.yml)

groups:
- name: nat-ha
  rules:
  - alert: VRRP_Failover
    expr: changes(keepalived_master[2m]) > 0
    for: 1m
    annotations:
      summary: "NAT {{ $labels.instance }} 发生 failover"

Grafana Dashboard:面板显示 VIP 绑定、peering、延迟、丢包。回滚:优先级临时降级,手动 withdraw BGP。

完整部署清单与测试

  1. 两节点(Ubuntu/CentOS):4C8G,公网 IP。
  2. 安装:Keepalived、FRR、Prometheus。
  3. 配置 NAT/VRRP/BGP,测试:kill keepalived,VIP 漂移 <5s;ip route del 模拟,BGP 撤回收敛 <30s。
  4. 规模:3 节点 Anycast,RTO <1s,RPO 0。

此方案匹配 AWS NAT HA(多 AZ、多 IP),但自管 VPS 年成本 < $500。脑裂防范:单向心跳 + quorum(奇数节点)。

资料来源

  • DigitalOcean HA NAT Gateway 教程。
  • Keepalived 官方文档 & FRR BGP 配置示例。
查看归档