LVS(Linux Virtual Server)是章文嵩博士发起的开源四层负载均衡方案,工作在传输层,性能极高。它支持三种典型工作模式:NAT、DR和TUN。其中NAT模式配置最简单、对后端服务器没有任何要求,是初学者理解LVS集群结构的最佳入口。本文将完整演示如何用三台机器搭建一个基于NAT模式的LVS负载均衡集群,并详细解释每一步配置背后的原理。

一、NAT模式的工作原理与实验环境规划
NAT模式的核心思想是:Director同时作为集群的入口和出口。客户端的请求先到达Director的外网IP(VIP),Director根据调度算法改写请求的目标地址,转发给某台RealServer;RealServer处理完请求后,把响应发回Director的内网IP(DIP),Director再把响应的源地址改写为VIP发回客户端。整个过程对客户端完全透明。
这意味着两件事:第一,进出流量都要经过Director,所以Director容易成为性能瓶颈;第二,RealServer必须把默认网关指向Director的内网IP,否则响应包会绕过Director直接发往客户端,导致连接中断。
实验环境规划如下:Director使用CentOS系统,配置两块网卡,外网网卡IP为192.168.10.100(作为VIP),内网网卡IP为10.0.0.1(作为DIP)。两台RealServer只需要一块内网网卡,RS1的IP为10.0.0.11,RS2的IP为10.0.0.12,两台后端服务器的网关都必须设置为10.0.0.1。
二、Director调度器上的配置
首先确认内核已经加载了ip_vs模块。LVS是直接构建在Linux内核中的,主流发行版的内核默认都已支持,只需要检查一下:
lsmod | grep ip_vs # 如果没有输出,手动加载模块 modprobe ip_vs modprobe ip_vs_wlc
接下来安装用户态的管理工具ipvsadm。这个工具负责向内核的IPVS框架添加、删除虚拟服务和后端节点,所有LVS规则都通过它来维护:
yum install -y ipvsadm
NAT模式要求Director具备路由转发能力,这是最容易遗漏的一步。默认情况下Linux内核的IP转发是关闭的,不开的话数据包到了Director就被丢弃了。需要修改内核参数并立即生效:
# 临时开启转发,立即生效 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久生效,写入配置文件 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sysctl -p
最后添加虚拟服务和后端节点。假设两台RealServer上都跑着Nginx,监听80端口,这里使用加权轮询(wlc或wrr)算法:
# 添加一个虚拟服务,协议TCP,调度算法为加权轮询 ipvsadm -A -t 192.168.10.100:80 -s wrr # 添加两台RealServer,-m表示NAT(masquerade)模式 ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.11:80 -m -w 1 ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.12:80 -m -w 2
命令中-A表示添加虚拟服务,-t指定TCP协议和VIP端口,-s指定调度算法,-a表示往已有服务中追加RealServer,-m是NAT模式的标志,-w是权重。权重设为2的后端服务器会被分配到大约两倍于权重为1的服务器的请求量,适合后端机器配置不一致的场景。
三、RealServer后端服务器的配置
NAT模式对RealServer的要求极低,不需要配置任何虚拟IP,也不需要绑定VIP到回环接口,只要保证两点即可:IP地址和Director的内网网卡处于同一网段,并且默认网关指向Director的DIP。
以RS1为例,修改网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0:
IPADDR=10.0.0.11 NETMASK=255.255.255.0 GATEWAY=10.0.0.1
修改后重启网络服务systemctl restart network,RS2做同样的操作,把IP改为10.0.0.12即可。网关这一步至关重要,很多初学者配置完Director后发现访问不了,八成是RealServer的网关没有指向DIP。因为Director转发请求时会做目标地址转换,但响应包的源地址改写发生在Director上,如果响应包不经过Director,客户端收到的源IP对不上,TCP握手就永远完成不了。
然后在两台RealServer上分别部署测试服务,最简单的办法是用Nginx输出不同的页面内容方便区分:
yum install -y nginx echo 'This is RS1' > /usr/share/nginx/html/index.html systemctl start nginx
四、连接测试与常见故障排查
配置完成后,在客户端上反复访问http://192.168.10.100,如果看到页面在This is RS1和This is RS2之间轮换出现,说明集群已经正常工作。同时在Director上执行ipvsadm -Ln可以查看规则列表,执行ipvsadm -Lnc可以查看当前连接状态,观察请求是否被分发到了两台后端。
ipvsadm -Ln --stats # 输出中每台RealServer的InPkts、OutPkts会持续增长,说明转发正常
如果访问失败,按照以下顺序排查。第一,在RealServer上ping 10.0.0.1确认内网互通;第二,检查Director上ip_forward是否为1;第三,确认RealServer的网关确实指向了DIP,用route -n查看;第四,确认两台后端的Nginx自身可以正常响应,即在内网直接curl对方的80端口。还有一个隐蔽的坑:如果Director上同时运行了firewalld,转发链可能拦截流量,测试阶段建议systemctl stop firewalld排除干扰。
需要保存规则以便重启后自动恢复时,可以使用ipvsadm -S > /etc/sysconfig/ipvsadm保存,或安装ipvsadm服务后通过systemctl enable ipvsadm实现开机加载。生产环境中,NAT模式适合中小规模集群,如果流量巨大,可以进一步迁移到DR模式,让响应流量不再经过Director,从而大幅提升整体吞吐能力。