CentOS LVS NAT 模式配置实战指南
在构建高可用、高性能的网络服务时,Linux Virtual Server (LVS) 凭借其强大的负载均衡能力成为核心基础设施的关键组件,其 NAT(Network Address Translation)模式因其配置相对直观且对后端服务器网络环境要求灵活,被广泛采用,本文将详细阐述在 CentOS 系统上配置 LVS NAT 模式的完整流程与关键要点。
理解 LVS NAT 模式原理

在 NAT 架构中:
- 调度器 (Director):拥有公网 IP(VIP)和私有 IP(DIP),是流量入口与出口的枢纽。
- 真实服务器 (Real Server, RS):通常位于私有网络,仅需配置私有 IP(RIP),默认网关必须指向调度器的 DIP。
- 流量路径:
- 入站 (Client -> VIP -> RIP):客户端请求发送至 VIP;调度器根据负载均衡算法选择一台 RS,将目标 IP 修改为该 RS 的 RIP,源 IP 保留为客户端 IP(或根据需要修改),然后转发。
- 出站 (RIP -> DIP -> Client):RS 处理请求后,将响应发送给其默认网关(即调度器的 DIP);调度器将响应的源 IP 从 RIP 修改回 VIP,目标 IP 修改为客户端 IP,然后发回给客户端。
此模式实现了客户端与 RS 的解耦,RS 无需暴露公网地址,但调度器需处理双向流量,可能成为性能瓶颈。
系统环境准备
- 操作系统:CentOS 7 或 CentOS 8 (本文以 CentOS 7 示例)。
- 角色:
- LVS 调度器 (Director):1台 (假设 IP: eth0-VIP: 203.0.113.100, eth1-DIP: 192.168.10.1)
- 真实服务器 (Real Server):至少2台 (假设 IP: RS1: 192.168.10.101, RS2: 192.168.10.102)
- 网络:
- 调度器需双网卡(或单网卡绑定多个IP,但物理隔离更佳)。
- RS 与调度器的 DIP 需在同一局域网。
- 确保 RS 能访问外网 (通过调度器 NAT) 或所需资源。
- 关键配置:所有 RS 的默认网关必须设置为调度器的 DIP (192.168.10.1)。
调度器 (Director) 配置步骤
安装必要软件:
yum install ipvsadm keepalived -y
ipvsadm:LVS 核心管理工具。keepalived:提供高可用性(主备切换)和动态配置管理(推荐)。
配置网络与内核参数:
- 配置 VIP 和 DIP:
# 在公网接口(如eth0)添加VIP (临时) ip addr add 203.0.113.100/24 dev eth0 # 或修改网卡配置文件永久生效
- 开启核心转发 (必须):
echo 1 > /proc/sys/net/ipv4/ip_forward # 永久生效:编辑 /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p
- 配置 VIP 和 DIP:
配置 Keepalived (推荐方式): 编辑
/etc/keepalived/keepalived.conf:vrrp_instance VI_1 { state MASTER # 主节点设为 MASTER,备节点设为 BACKUP interface eth0 # 承载 VRRP 通告的接口(通常是公网接口) virtual_router_id 51 # 集群唯一 ID priority 100 # 主节点优先级需高于备节点 advert_int 1 authentication { auth_type PASS auth_pass your_secure_password } virtual_ipaddress { 203.0.113.100/24 # VIP } } virtual_server 203.0.113.100 80 { # 定义虚拟服务 VIP 和端口 delay_loop 6 # 健康检查间隔(秒) lb_algo wrr # 负载均衡算法:加权轮询 (可选 rr, wlc, lc 等) lb_kind NAT # LVS 模式:NAT protocol TCP # 协议类型 (也可用 UDP) # 真实服务器配置 (Real Server) real_server 192.168.10.101 80 { weight 1 # 服务器权重 TCP_CHECK { # TCP 健康检查配置 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.10.102 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }说明:
vrrp_instance实现 VIP 的高可用。virtual_server块定义 LVS 服务。real_server块定义后端 RS 及其健康检查。
启动并启用 Keepalived:
systemctl start keepalived systemctl enable keepalived
验证 LVS 状态:
ipvsadm -Ln
输出应显示配置的 VIP、端口、协议、调度算法以及配置的 RS 列表及其状态(
->表示活动)。
真实服务器 (Real Server) 配置
配置网络:
- 确保 RIP (如
168.10.101) 配置正确。 - 设置默认网关为调度器的 DIP (绝对关键):
ip route add default via 192.168.10.1 # 永久生效:编辑网卡配置文件(如 /etc/sysconfig/network-scripts/ifcfg-eth0)添加: GATEWAY=192.168.10.1
- 重启网络服务 (
systemctl restart network) 或重启服务器生效。
- 重启网络服务 (
- 确保 RIP (如
部署后端服务: 在每台 RS 上安装并配置好实际的应用服务(如 Web 服务器 Nginx/Apache),监听在配置的端口(如 80),并确保本地访问正常 (
curl http://localhost)。
测试与验证
基础连通性:
- 从 RS
ping调度器的 DIP (168.10.1) 应通。 - 从 RS
ping一个外网地址(如8.8.8),应通(证明 RS 的网关 NAT 生效)。
- 从 RS
LVS 服务测试:
- 从外网客户端多次访问 VIP (
http://203.0.113.100)。 - 观察调度效果:
- 在调度器上运行
ipvsadm -Ln --stats或ipvsadm -Ln --rate查看连接分发统计。 - 在 RS 上查看 Web 服务器访问日志 (
tail -f /var/log/nginx/access.log),应能看到来自不同客户端 IP 的请求。
- 在调度器上运行
- 从外网客户端多次访问 VIP (
故障模拟测试:
- 停止一台 RS 上的 Web 服务:观察健康检查是否将其标记为不可用 (
ipvsadm -Ln中状态变化),新请求是否只分发到健康 RS。 - 恢复服务:观察健康检查是否将其重新加入活动池。
- (如果配置了 Keepalived 主备) 停止主调度器的 Keepalived:观察备机是否接管 VIP 并继续提供服务。
- 停止一台 RS 上的 Web 服务:观察健康检查是否将其标记为不可用 (
关键注意事项与优化点
- ARP 抑制问题:在共享网络环境中,需确保 VIP 对应的 MAC 地址在交换机上正确绑定为调度器 MAC,或配置调度器内核参数 (
arp_ignore,arp_announce) 避免 RS 响应 VIP 的 ARP 请求,NAT 模式通常比 DR 模式受此影响小,但仍需关注。 - 调度器性能:NAT 模式下调度器处理所有进出流量,需确保其网络 I/O 和 CPU 能力足够,监控
ipvs相关内核统计项。 - 会话保持:对需要状态保持的应用(如购物车),LVS 支持
sh(源地址哈希) 等算法,或需应用层会话保持方案。 - 防火墙:确保调度器和 RS 的防火墙 (
firewalld,iptables) 允许相关流量(VIP 端口、健康检查端口、RS 服务端口)。 - 健康检查:根据服务特性选择合适的健康检查方式(TCP_CHECK、HTTP_GET、SSL_GET 等),并合理设置超时和重试参数。
LVS NAT 模式在 CentOS 上的配置,核心在于网络拓扑的正确构建(尤其是 RS 的网关指向)和内核转发的启用,利用 keepalived 不仅简化了 LVS 规则的管理,更提供了至关重要的高可用保障,通过细致的健康检查配置和持续的监控,能够构建出稳定、高效的负载均衡层,有效提升后端服务的处理能力和可用性,理解其流量转换原理,是排查复杂问题的基础,掌握这些实践要点,您将能更自信地运用 LVS 支撑关键业务。
网络工程师视角: LVS NAT 是构建负载均衡体系的基础功,其部署便捷性常是项目初期的优选,务必重视 RS 网关的配置和健康检查的可靠性,它们是服务连续性的生命线,性能瓶颈常在调度器网卡吞吐量,提前规划网络带宽和硬件选型至关重要,欢迎在实际部署中交流遇到的挑战。
祝您的服务器坚如磐石!
