自托管 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)秒级收敛。
部署清单:
- 获取 ASN & PI IP(自有或隧道如 Cloudflare Magic Transit)。
- 安装 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
- 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。
完整部署清单与测试
- 两节点(Ubuntu/CentOS):4C8G,公网 IP。
- 安装:Keepalived、FRR、Prometheus。
- 配置 NAT/VRRP/BGP,测试:
kill keepalived,VIP 漂移 <5s;ip route del模拟,BGP 撤回收敛 <30s。 - 规模:3 节点 Anycast,RTO <1s,RPO 0。
此方案匹配 AWS NAT HA(多 AZ、多 IP),但自管 VPS 年成本 < $500。脑裂防范:单向心跳 + quorum(奇数节点)。
资料来源:
- DigitalOcean HA NAT Gateway 教程。
- Keepalived 官方文档 & FRR BGP 配置示例。