高可用端口转发的核心原理
端口转发本质是网络流量从源端口到目标地址的映射转发,而高可用设计则通过主备节点冗余、健康检测、故障自动切换实现服务持续可用。常见的实现方案是结合iptables做端口转发规则配置,用Keepalived实现主备节点状态同步与虚拟IP漂移,当主节点出现故障时,备节点自动接管虚拟IP并生效转发规则,保障转发服务不中断。

环境准备与前置条件
我们需要准备两台Linux服务器作为主备节点,系统版本建议为CentOS 7及以上或者Ubuntu 18.04及以上,同时需要预留一个未被占用的虚拟IP用于对外提供服务。两台节点都需要满足以下条件:
- 内核支持IP转发功能,可通过
sysctl net.ipv4.ip_forward查看,返回值为1表示已开启 - 已安装iptables服务,用于配置端口转发规则
- 已安装Keepalived服务,用于实现高可用切换逻辑
- 两台节点之间网络互通,且防火墙开放对应端口与VRRP协议通信端口
开启IP转发功能
如果内核IP转发未开启,需要执行以下命令临时开启,若需要永久生效可修改/etc/sysctl.conf文件添加对应配置:
# 临时开启IP转发 sysctl -w net.ipv4.ip_forward=1 # 永久生效配置,编辑sysctl.conf文件 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
配置iptables端口转发规则
假设我们需要将虚拟IP的80端口转发到后端真实服务节点192.168.0.100的8080端口,首先在主节点配置iptables规则,备节点后续同步相同配置即可。
添加转发规则
执行以下命令配置端口转发相关规则:
# 设置转发规则,将目标端口80的流量转发到192.168.0.100的8080端口 iptables -t nat -A PREROUTING -d 虚拟IP地址 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:8080 # 配置POSTROUTING规则,保证回包正常 iptables -t nat -A POSTROUTING -d 192.168.0.100 -p tcp --dport 8080 -j SNAT --to-source 主节点IP地址 # 允许转发流量通过 iptables -A FORWARD -p tcp -d 192.168.0.100 --dport 8080 -j ACCEPT # 保存iptables规则,避免重启后丢失,不同系统保存命令有差异 # CentOS系统 service iptables save # Ubuntu系统 iptables-save > /etc/iptables/rules.v4
规则验证
配置完成后可以通过以下命令查看规则是否生效:
iptables -t nat -L PREROUTING -n --line-numbers iptables -L FORWARD -n --line-numbers
配置Keepalived实现高可用
Keepalived通过VRRP协议实现主备节点选举,当主节点故障时自动将虚拟IP漂移到备节点,同时可以配合健康检查脚本确保转发服务异常时主动切换。
主节点Keepalived配置
编辑Keepalived配置文件/etc/keepalived/keepalived.conf,添加以下配置:
global_defs {
router_id port_forward_master # 节点标识,主备节点需要不同
}
vrrp_instance VI_1 {
state MASTER # 主节点角色为MASTER
interface eth0 # 绑定的网卡名称,根据实际网卡调整
virtual_router_id 51 # 虚拟路由ID,主备节点需要一致
priority 100 # 优先级,主节点高于备节点
advert_int 1 # VRRP通告间隔,单位秒
authentication {
auth_type PASS
auth_pass 123456 # 认证密码,主备节点需要一致
}
virtual_ipaddress {
虚拟IP地址/24 # 配置的虚拟IP,根据实际网段调整
}
}
# 健康检查配置,检测iptables转发服务是否正常
vrrp_script check_port_forward {
script "/etc/keepalived/check_port_forward.sh" # 健康检查脚本路径
interval 2 # 检查间隔,单位秒
weight -20 # 检查失败时优先级降低值
}
track_script {
check_port_forward
}
备节点Keepalived配置
备节点配置文件只需要调整router_id、state、priority三个参数,其余配置与主节点保持一致:
global_defs {
router_id port_forward_backup # 备节点标识
}
vrrp_instance VI_1 {
state BACKUP # 备节点角色为BACKUP
interface eth0
virtual_router_id 51
priority 90 # 优先级低于主节点
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
虚拟IP地址/24
}
}
vrrp_script check_port_forward {
script "/etc/keepalived/check_port_forward.sh"
interval 2
weight -20
}
track_script {
check_port_forward
}
健康检查脚本编写
创建/etc/keepalived/check_port_forward.sh脚本,用于检测端口转发对应的后端服务是否正常,脚本内容如下:
#!/bin/bash
# 检测后端服务8080端口是否可访问
curl -s --connect-timeout 2 http://192.168.0.100:8080 > /dev/null
if [ $? -ne 0 ]; then
# 服务不可访问时返回失败,触发优先级降低
exit 1
else
exit 0
fi
给脚本添加执行权限:
chmod +x /etc/keepalived/check_port_forward.sh
启动服务与功能验证
先启动两台节点的iptables服务,确保转发规则生效,再启动Keepalived服务:
# 启动iptables systemctl start iptables systemctl enable iptables # 启动Keepalived systemctl start keepalived systemctl enable keepalived
验证主备切换
可以通过以下方式验证高可用功能是否正常:
- 在主节点执行
ip addr show eth0,可以看到虚拟IP已经绑定到主节点网卡 - 从客户端访问虚拟IP的80端口,能够正常返回后端8080端口的服务内容
- 手动停止主节点的Keepalived服务,观察备节点的网卡是否自动绑定虚拟IP,再次访问虚拟IP服务是否正常
- 恢复主节点服务后,由于主节点优先级更高,虚拟IP会自动漂移回主节点
常见问题排查
如果配置完成后转发服务不正常,可以按照以下思路排查:
- 检查内核IP转发是否开启,执行
sysctl net.ipv4.ip_forward确认返回值为1 - 检查iptables规则是否正确,包括nat表规则与filter表FORWARD规则,同时确认规则已保存
- 检查Keepalived状态,执行
systemctl status keepalived查看是否有报错,确认主备节点VRRP通信正常 - 检查防火墙是否放通了对应端口与VRRP协议(协议号112),避免通信被拦截
- 检查健康检查脚本是否正常执行,手动运行脚本确认返回结果符合预期
Linux端口转发高可用Keepalivediptables修改时间:2026-06-20 09:24:40