LVS的NAT模式(Ubuntu24.04)

NAT模式集群

环境准备(LVS分发器是一台机器需要配置两个虚拟网卡)

机器

主机名

网卡

IP地址

网关

LVS分发器

lvs

ens33 (外网)

192.168.1.100

192.168.1.2

LVS分发器

lvs

ens37 (内网)

192.168.2.200

无需

RS1

rs1

ens33

192.168.2.210

192.168.2.200

RS2

rs2

ens33

192.168.2.220

192.168.2.200

Client

client

ens33

192.168.1.200

192.168.1.100

注意:LVS 的 ens33 是外网口(要配网关+DNS 才能上网),ens37 是内网口(接 RS,不能配网关)。NAT 模式的 VIP 就是 LVS 外网口 192.168.1.100(netplan 直接配的,不需要单独 ip addr add)。

前期准备

 # 更新软件源
 sudo apt update && sudo apt upgrade -y
 ​
 # 关闭防火墙(Ubuntu默认用ufw)
 sudo ufw disable
 sudo systemctl stop ufw
 sudo systemctl disable ufw

LVS分发器配置

网卡配置

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 修改以下内容(直接覆盖原本文件)
 network:
   ethernets:
     ens33:                    # 外网口:配网关+DNS
       addresses:
         - 192.168.1.100/24
       routes:
         - to: default
           via: 192.168.1.2
       nameservers:
         addresses:
           - 114.114.114.114
           - 8.8.8.8
     ens37:                    # 内网口:不配网关
       addresses:
         - 192.168.2.200/24
   version: 2
 ​
 # 刷新配置
 sudo netplan apply

安装LVS管理工具

 sudo apt install ipvsadm -y

开启IP转发

 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
 echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
 sudo sysctl -p

加载内核模块

 sudo modprobe ip_vs
 sudo modprobe ip_vs_rr
 sudo modprobe nf_conntrack
 ​
 echo "ip_vs" | sudo tee -a /etc/modules
 echo "ip_vs_rr" | sudo tee -a /etc/modules
 echo "nf_conntrack" | sudo tee -a /etc/modules

添加LVS调度规则

 # 清空所有规则
 sudo ipvsadm -C
 ​
 # 添加虚拟服务(VIP: 192.168.1.100:80,轮询算法rr)
 sudo ipvsadm -A -t 192.168.1.100:80 -s rr
 ​
 # 添加真实服务器RS1(NAT模式)
 sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.210:80 -m
 ​
 # 添加真实服务器RS2(NAT模式)
 sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.220:80 -m
 ​
 # 查看当前规则
 sudo ipvsadm -Ln

开启 RS 出网 NAT(关键!RS 上网必需)

这是最容易漏的一步:LVS NAT 模式下,RS1/RS2 的流量要经过 LVS 才能出外网,必须做源地址转换(MASQUERADE),否则 RS 能 ping 通 LVS 但访问不了外网(下载报错、ping 外网 100% 丢包)。

 # RS网段(192.168.2.0/24)从外网口(ens33)出去时做NAT
 sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j MASQUERADE
 ​
 # 查看确认(应看到 MASQUERADE 规则)
 sudo iptables -t nat -L POSTROUTING -n

保存iptables规则(防重启丢失)

 # 保存 MASQUERADE 规则(和 ipvsadm 一样要持久化)(选yes)
 sudo apt install -y iptables-persistent
 sudo netfilter-persistent save
 ​
 # 验证已保存
 grep MASQUERADE /etc/iptables/rules.v4

保存LVS规则 + 开机自启(systemd 方式)

 # ① 保存规则(必须加 -n!否则存成主机名,恢复时 VIP 变 127.0.1.1 → Connection refused)
 sudo ipvsadm-save -n > /etc/ipvsadm.rules
 ​
 # ② 创建开机自启服务(开机:恢复规则;NAT 的 VIP 在 netplan 里,无需绑 VIP)
 sudo tee /etc/systemd/system/lvs-boot.service <<'EOF'
 [Unit]
 Description=LVS 开机配置(恢复规则)
 After=network.target
 ​
 [Service]
 Type=oneshot
 ExecStart=/bin/bash -c 'ipvsadm-restore < /etc/ipvsadm.rules 2>/dev/null'
 RemainAfterExit=yes
 ​
 [Install]
 WantedBy=multi-user.target
 EOF
 ​
 # 更新、开机自启、启动
 sudo systemctl daemon-reload
 sudo systemctl enable lvs-boot.service
 sudo systemctl start lvs-boot.service
 ​
 # ③ 验证
 systemctl is-enabled lvs-boot.service    # 应输出 enabled

⚠️ 填坑:Ubuntu 24.04 的 rc.local / rc-local 服务不可用(systemctl enable rc-local 会报错)。改用 systemd 服务,100% 可开机自启。

RS1真实服务器配置

网卡配置

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 修改以下内容(直接覆盖原本文件)
 network:
   ethernets:
     ens33:
       addresses:
         - 192.168.2.210/24
       routes:
         - to: default
           via: 192.168.2.200
       nameservers:              # DNS 必须写!
         addresses:
           - 114.114.114.114
           - 8.8.8.8
   version: 2
 ​
 # 刷新配置
 sudo netplan apply

安装Web服务

 # 安装Nginx Web服务(-y表示自动确认)
 sudo apt install nginx -y
 ​
 # 创建测试页面,内容为"rs1",用于区分不同后端服务器
 echo "rs1" | sudo tee /var/www/html/index.html
 ​
 # 立即启动Nginx服务
 sudo systemctl start nginx
 ​
 # 设置Nginx为开机自启动
 sudo systemctl enable nginx

RS2真实服务器配置

网卡配置

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 修改以下内容(直接覆盖原本文件)
 network:
   ethernets:
     ens33:
       addresses:
         - 192.168.2.220/24
       routes:
         - to: default
           via: 192.168.2.200
       nameservers:              # DNS 必须写!留空会报
         addresses:              # "Temporary failure resolving"
           - 114.114.114.114
           - 8.8.8.8
   version: 2
 ​
 # 刷新配置
 sudo netplan apply

安装Web服务

 # 安装Nginx Web服务(-y表示自动确认)
 sudo apt install nginx -y
 ​
 # 创建测试页面,内容为"rs2",用于区分RS1和RS2
 echo "rs2" | sudo tee /var/www/html/index.html
 ​
 # 立即启动Nginx服务
 sudo systemctl start nginx
 ​
 # 设置Nginx为开机自启动
 sudo systemctl enable nginx

Client测试客户端配置

网卡配置

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 修改以下内容(直接覆盖原本文件)
 network:
   ethernets:
     ens33:
       addresses:
         - 192.168.1.200/24
       routes:
         - to: default
           via: 192.168.1.100
       nameservers:
         addresses:
           - 114.114.114.114
           - 8.8.8.8
   version: 2
 ​
 # 刷新配置
 sudo netplan apply

安装测试工具

 sudo apt install curl -y

验证与测试

网络连通性测试

 ping -c 2 192.168.2.210   # LVS → RS1
 ping -c 2 192.168.2.220   # LVS → RS2
 # 在RS上:ping -c 2 192.168.2.200
 # 在Client上:ping -c 2 192.168.1.100

LVS调度测试

 curl http://192.168.2.210   # 应显示 rs1
 curl http://192.168.2.220   # 应显示 rs2
 curl http://192.168.1.100   # 轮询:rs1/rs2 交替
 for i in {1..10}; do curl -s http://192.168.1.100; done

LVS统计监控

 sudo ipvsadm -Ln --stats
 sudo ipvsadm -Ln --rate
 sudo ipvsadm -Lnc
 cat /proc/net/ip_vs_conn

LVS管理命令速查

操作

命令

查看规则

ipvsadm -Ln

查看统计

ipvsadm -Ln --stats

查看连接

ipvsadm -Lnc

清空规则

ipvsadm -C

添加虚拟服务

ipvsadm -A -t VIP:端口 -s 算法

添加真实服务器

ipvsadm -a -t VIP:端口 -r RIP:端口 -m

删除真实服务器

ipvsadm -d -t VIP:端口 -r RIP:端口

保存LVS规则

ipvsadm-save -n > /etc/ipvsadm.rules

保存NAT规则

netfilter-persistent save

常见问题排查

问题

检查方法

解决方案

LVS无法上网

ping 114.114.114.114

检查ens33网关和DNS配置

RS无法访问外网

ping 192.168.2.200 通但 ping 223.5.5.5 不通

LVS缺MASQUERADE:iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j MASQUERADE

RS报 Temporary failure resolving

resolvectl status 看DNS

netplan里nameservers留空:补上DNS后 netplan apply

Client无法访问VIP

ping 192.168.1.100

检查Client网关是否为192.168.1.100

LVS转发不生效

cat /proc/sys/net/ipv4/ip_forward

确保值为1

LVS规则不生效

ipvsadm -Ln

检查规则是否存在,RS状态是否正常

访问 VIP 报 Connection refused

LVS 上 ipvsadm -Ln

ipvsadm 规则 VIP 错(存成主机名变 127.0.1.1):重建规则 + ipvsadm-save -n > /etc/ipvsadm.rules

始终访问同一台RS

浏览器/curl缓存

使用curl --no-cache测试

关键注意事项

  1. LVS的ens33(外网):必须配置网关和DNS才能上网下载软件

  2. LVS的ens37(内网):不能配置网关,否则路由会混乱

  3. RS的网关:必须指向LVS内网IP(192.168.2.200)

  4. Client的网关:必须指向LVS外网IP(192.168.1.100)

  5. VMware网络:确保四台机器的网卡连接到正确的VMnet

  6. 防火墙:所有机器必须关闭ufw防火墙

  7. LVS必须配MASQUERADE:NAT模式下RS出网全靠它,漏了=RS上不了外网

  8. RS的netplan必须写DNS:留空会报 "Temporary failure resolving",apt无法下载

  9. 两条持久化都要做:LVS规则(systemd 服务 lvs-boot.service + ipvsadm-save -n)+ NAT规则(iptables-persistent),重启后缺一不可


配置完成后,通过Client访问 http://192.168.1.100,多次刷新应看到 rs1 和 rs2 交替出现,说明LVS NAT集群部署成功!