在Linux系统上搭建NAT网关时,单节点部署很容易出现单点故障风险,一旦网关服务器出现问题,内网所有依赖该网关的设备都会失去外网访问能力。配置高可用的NAT网关可以通过主备节点自动切换的方式,有效避免这类问题,保障网络通信的稳定性。

高可用NAT网关的核心架构
高可用NAT网关通常采用双节点部署模式,两个节点都具备NAT转发能力,其中一个作为主节点处理流量,另一个作为备节点处于待命状态。当主节点出现故障时,备节点会自动接管服务,整个过程对内部用户无感知。核心组件包含以下几个部分:
- keepalived:负责主备节点的健康检测和VIP(虚拟IP)漂移,实现故障自动切换
- iptables:配置NAT转发规则,将内网流量转换为外网IP发出
- ipvs:可选组件,用于实现多节点的流量负载均衡,提升网关整体吞吐量
前置准备
开始配置前需要准备以下环境:
- 两台配置相同的Linux服务器,系统版本建议为CentOS 7及以上或者Ubuntu 18.04及以上
- 两台服务器都具备至少两张网卡,一张连接内网,一张连接外网
- 一个可用的VIP地址,该地址需要和内外网网段不冲突,且未被其他设备占用
- 两台服务器之间网络互通,能够互相访问
基础环境配置
开启内核转发功能
首先需要在两台节点上都开启Linux内核的IP转发功能,这是NAT转发的基础条件。执行以下命令修改内核参数:
# 临时开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启IP转发,避免重启后失效 cat >> /etc/sysctl.conf << EOF net.ipv4.ip_forward = 1 EOF # 加载配置使其生效 sysctl -p
配置iptables的NAT规则
在两台节点上都需要配置相同的NAT转发规则,假设内网网卡为eth0,外网网卡为eth1,内网网段为192.168.10.0/24,外网出口IP为节点的eth1 IP。执行以下命令配置规则:
# 清除现有规则,避免冲突 iptables -F iptables -t nat -F # 配置SNAT规则,将内网流量转换为外网IP iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 外网网卡IP # 允许内网到外网的转发 iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT iptables -A FORWARD -d 192.168.10.0/24 -j ACCEPT # 保存iptables规则,避免重启后丢失 # CentOS系统执行 service iptables save # Ubuntu系统执行 iptables-save > /etc/iptables.rules
注意将命令中的外网网卡IP替换为节点实际的外网网卡IP地址,内网网段和网卡名称也需要根据实际环境调整。
配置keepalived实现高可用
安装keepalived
在两台节点上分别安装keepalived组件:
# CentOS系统安装 yum install -y keepalived # Ubuntu系统安装 apt-get install -y keepalived
主节点keepalived配置
编辑主节点的keepalived配置文件,通常路径为/etc/keepalived/keepalived.conf,内容如下:
global_defs {
router_id NAT_GW_01 # 节点标识,主备节点需要不同
}
vrrp_instance VI_1 {
state MASTER # 主节点角色为MASTER
interface eth0 # 用于发送VRRP报文的网卡,建议用内网网卡
virtual_router_id 51 # 虚拟路由ID,主备节点必须一致
priority 100 # 优先级,主节点高于备节点
advert_int 1 # VRRP通告间隔,单位秒
authentication {
auth_type PASS # 认证类型
auth_pass 1111 # 认证密码,主备节点必须一致
}
virtual_ipaddress {
192.168.10.254 # VIP地址,即内网设备配置的网关地址
}
}
# 可选配置:如果需要对NAT网关做健康检查
virtual_server 192.168.10.254 0 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
# 健康检查脚本,检查iptables和转发功能是否正常
real_server 127.0.0.1 0 {
weight 1
MISC_CHECK {
misc_path "/etc/keepalived/check_nat.sh"
misc_timeout 5
}
}
}
备节点keepalived配置
备节点的配置和主节点大部分一致,仅需要调整角色、优先级和节点标识:
global_defs {
router_id NAT_GW_02 # 备节点标识,和主节点不同
}
vrrp_instance VI_1 {
state BACKUP # 备节点角色为BACKUP
interface eth0 # 和主节点一致的网卡
virtual_router_id 51 # 和主节点一致的虚拟路由ID
priority 90 # 优先级低于主节点
advert_int 1 # 和主节点一致的通告间隔
authentication {
auth_type PASS
auth_pass 1111 # 和主节点一致的认证密码
}
virtual_ipaddress {
192.168.10.254 # 和主节点一致的VIP地址
}
}
virtual_server 192.168.10.254 0 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 127.0.0.1 0 {
weight 1
MISC_CHECK {
misc_path "/etc/keepalived/check_nat.sh"
misc_timeout 5
}
}
}
健康检查脚本配置
在主备节点上都创建健康检查脚本/etc/keepalived/check_nat.sh,用于检测NAT转发功能是否正常:
#!/bin/bash
# 检查IP转发是否开启
forward_status=$(cat /proc/sys/net/ipv4/ip_forward)
if [ "$forward_status" != "1" ]; then
exit 1
fi
# 检查iptables NAT规则是否存在
nat_rule=$(iptables -t nat -L POSTROUTING | grep "192.168.10.0/24")
if [ -z "$nat_rule" ]; then
exit 1
fi
exit 0
给脚本添加执行权限:
chmod +x /etc/keepalived/check_nat.sh
启动keepalived服务
分别在主备节点上启动keepalived并设置开机自启:
# 启动服务 systemctl start keepalived # 设置开机自启 systemctl enable keepalived # 查看服务状态 systemctl status keepalived
验证配置效果
完成所有配置后,可以通过以下方式验证高可用效果:
- 在主节点上执行
ip addr show eth0,可以看到VIP地址已经绑定到主节点的内网网卡上 - 将内网设备的网关配置为VIP地址192.168.10.254,测试内网设备能否正常访问外网
- 手动关闭主节点的keepalived服务或者断开主节点网络,观察备节点是否自动接管VIP,内网设备访问外网是否中断
- 恢复主节点后,观察VIP是否自动回到主节点,备节点恢复待命状态
常见问题排查
如果配置完成后无法正常工作,可以按照以下步骤排查:
- 检查两台节点的iptables规则是否配置正确,转发功能是否开启
- 检查keepalived配置文件中的虚拟路由ID、认证密码、VIP是否主备一致
- 检查防火墙是否放通了VRRP协议(协议号112)的流量,避免主备节点无法通信
- 查看keepalived的日志/var/log/messages,排查切换失败的原因
注意:如果环境中使用了firewalld防火墙,需要先关闭firewalld再使用iptables,或者将VRRP和NAT相关规则添加到firewalld中,避免规则冲突。
NAT网关keepalivedipvsLinux高可用iptables修改时间:2026-06-28 01:33:49