LVS的TUN模式(Ubuntu24.04)

整体架构

TUN 模式:LVS 用 IPIP 隧道把请求封装发给 RS,RS 处理完直接回包给客户端(不经过 LVS),调度器无瓶颈,支持跨网段,全部单网卡。

                         ┌─────────────────────────────┐
                         │      路由器 router          │
                         │  ens37 外网 192.168.1.10    │
                         │  ens33 内网 192.168.2.10    │
                         └─────────────┬───────────────┘
                 上网(网关)             │
    ┌───────────────┬──────────────────┼───────────────────┐
    │               │                  │                   │
 ┌──┴───┐      ┌────┴───┐         ┌────┴────┐         ┌────┴────┐
 │Client│      │  LVS   │         │  RS1    │         │  RS2    │
 │.2.50 │      │ .2.200 │         │ .2.210  │         │ .2.220  │
 └──────┘      └───┬────┘         └─────────┘         └─────────┘
    │           VIP .2.100:80        tunl0:VIP           tunl0:VIP
    └───访问VIP──→ IPIP隧道封装 ──→  RS1/RS2 ──直接回包──→ Client

架构与 IP 规划

TUN 模式特点:LVS 通过 IPIP 隧道把请求封装发给 RS,RS 处理完直接回包给客户端(不经过调度器)——调度器不再是瓶颈,适合跨网段,且所有机器单网卡即可。

环境规划表

机器

主机名

网卡

IP地址

网关

特殊配置

路由器

router

ens33(内网)

192.168.2.10

无(网关角色)

提供上网

ens37(外网)

192.168.1.10

192.168.1.2(VMware NAT网关)

接VMware NAT网络

LVS分发器

lvs

ens33

192.168.2.200

192.168.2.10

单网卡即可

RS1

rs1

ens33

192.168.2.210

192.168.2.10

tunl0 + VIP 192.168.2.100

RS2

rs2

ens33

192.168.2.220

192.168.2.10

tunl0 + VIP 192.168.2.100

Client

client

ens33

192.168.2.50

192.168.2.10

测试机

VIP

—

—

192.168.2.100:80

—

虚拟服务地址

数据流向:Client → VIP(192.168.2.100:80)→ LVS 用 IPIP 隧道封装 → RS1/RS2 → RS 直接回包给 Client(不经过 LVS)。

⭐ VMware NAT 网段地址规律(重要,防踩坑)

 某个 VMware NAT 网段(比如 192.168.1.0/24)
 ├── 192.168.1.1   = 宿主机(Windows)的虚拟网卡    ← 不能用作自己IP
 ├── 192.168.1.2   = VMware NAT 网关(负责上网)    ← 网关就是它,不能占用
 └── 192.168.1.128~254 = DHCP 分配池(虚拟机自动获取)
  • 每个 VMware NAT 网段,网关都是该网段的 .2(.1 是宿主机,.2 是 NAT 网关)

  • 自己机器的 IP 必须避开 .1 和 .2(否则抢地址/冲突,上不了网)

  • 你的网段是 192.168.1.0/24 → 网关 = 192.168.1.2,自己用 192.168.1.10

前期准备(所有机器)

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

注:Ubuntu 22.04+ 的 netplan 禁止使用 gateway4,必须用 routes 字段配网关。

路由器配置

作用:ens33 内网口 192.168.2.10 做内网网关,ens37 外网口接 VMware NAT 网络提供上网。

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 替换一下内容
 network:
   ethernets:
     ens33:                      # 内网口(接实验网络)
       addresses:
         - 192.168.2.10/24
     ens37:                      # 外网口(接VMware NAT网络)
       addresses:
         - 192.168.1.10/24       # 静态:避开 .1(宿主机)和 .2(NAT网关)
       routes:
         - to: default
           via: 192.168.1.2      # 网关 = VMware NAT 网关(网段.2),不是 .1!
       nameservers:
         addresses:
           - 114.114.114.114
           - 8.8.8.8
   version: 2
 ​
 # 刷新配置文件
 sudo netplan apply
 ​
 # 开启转发 + NAT(让内网机器上网)
 echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
 sudo sysctl -p
 sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens37 -j MASQUERADE
 ​
 # NAT规则持久化
 sudo apt install -y iptables-persistent
 sudo netfilter-persistent save
 ​
 # 验证路由器自己能否上网(注意:ping可能被禁,用curl判断)
 curl -s -o /dev/null -w "HTTP %{http_code}\n" --connect-timeout 5 https://www.baidu.com

⚠️ 测试外网别用 ping:这个 NAT 网络禁 ICMP(ping 不通),但 HTTP/HTTPS 正常。判断能不能上网请用 curl,不要用 ping。

LVS分发器配置(核心)

作用:192.168.2.200,绑定 VIP 192.168.2.100:80,IPIP 隧道转发到 RS。

网卡配置

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 替换一下内容
 network:
   ethernets:
     ens33:
       addresses:
         - 192.168.2.200/24
       routes:
         - to: default
           via: 192.168.2.10      # 网关指向路由器
       nameservers:
         addresses:
           - 114.114.114.114
           - 8.8.8.8
   version: 2
 ​
 # 刷新配置文件
 sudo netplan apply
 ​
 # 安装ipvsadm + 开启IP转发
 sudo apt install ipvsadm -y
 echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
 sudo sysctl -p

加载内核模块(注意是 ipip 隧道模块)

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

添加LVS调度规则(TUN模式用 -i)

 sudo ipvsadm -C
 sudo ipvsadm -A -t 192.168.2.100:80 -s rr
 sudo ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.210:80 -i
 sudo ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.220:80 -i
 sudo ipvsadm -Ln

⚠️ 和 NAT 的区别:这里用 -i(IPIP 隧道),不是 -m;不需要 MASQUERADE(回包直接走 RS→Client)。

绑定 VIP 到 LVS(★关键,漏了客户端找不到 VIP)

 # VIP 必须挂在 LVS 的 lo 接口上,LVS 才会接收发往 VIP 的包再隧道转发
 sudo ip addr add 192.168.2.100/32 dev lo
 ip addr show lo | grep inet    # 确认出现 inet 192.168.2.100/32

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

 # ① 保存规则(必须加 -n!否则存成主机名,恢复时 VIP 变 127.0.1.1 → Connection refused)
 sudo ipvsadm-save -n > /etc/ipvsadm.rules
 ​
 # ② 创建开机自启服务(开机:绑 VIP + 恢复规则)
 sudo tee /etc/systemd/system/lvs-boot.service <<'EOF'
 [Unit]
 Description=LVS 开机配置(绑定VIP + 恢复规则)
 After=network.target
 ​
 [Service]
 Type=oneshot
 ExecStart=/bin/bash -c 'ip addr replace 192.168.2.100/32 dev lo; 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/RS2 配置(★TUN 最容易出错的部分)

作用:192.168.2.210,web 后端,通过 tunl0 接收隧道请求,直接回包。

网卡配置(RS1示例,RS2改IP)

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 替换一下内容
 network:
   ethernets:
     ens33:
       addresses:
         - 192.168.2.210/24      # RS2 改 192.168.2.220/24
       routes:
         - to: default
           via: 192.168.2.10
       nameservers:
         addresses:
           - 114.114.114.114
           - 8.8.8.8
   version: 2
 ​
 # 刷新配置文件
 sudo netplan apply

配置 tunl0 隧道接口 + VIP(★关键)

 # 加载 IPIP 隧道内核模块(用于 IP 封装,LVS 的隧道模式需要)
 sudo modprobe ipip
 ​
 # Ubuntu 默认会自动创建 tunl0 接口(IPIP 隧道虚拟网卡)
 # 将 VIP(虚拟IP)绑定到 tunl0 接口上,作为 /32 单播地址
 sudo ip addr add 192.168.2.100/32 dev tunl0
 ​
 # 启用 tunl0 虚拟网卡(默认可能是 down 状态)
 sudo ip link set tunl0 up
 ​
 # 查看 tunl0 接口信息,确认 VIP 是否成功绑定
 ip addr show tunl0
 ​
 # 开机自启(systemd 方式)
 sudo tee /etc/systemd/system/lvs-rs-boot.service <<'EOF'
 [Unit]
 Description=RS 开机配置(绑定VIP)
 After=network.target
 ​
 [Service]
 Type=oneshot
 ExecStart=/bin/bash -c 'modprobe ipip; ip addr replace 192.168.2.100/32 dev tunl0; ip link set tunl0 up'
 RemainAfterExit=yes
 ​
 [Install]
 WantedBy=multi-user.target
 EOF
 ​
 # 更新、开机自启、启动
 sudo systemctl daemon-reload
 sudo systemctl enable lvs-rs-boot.service
 sudo systemctl start lvs-rs-boot.service

ARP 抑制 + rp_filter(★关键,防止VIP冲突)

 # VIP 不对外响应 ARP(避免和 LVS 抢地址)
 echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignore
 echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
 echo 1 | sudo tee /proc/sys/net/ipv4/conf/tunl0/arp_ignore
 echo 2 | sudo tee /proc/sys/net/ipv4/conf/tunl0/arp_announce
 ​
 # 关闭反向路径过滤(否则隧道进来的包被丢)
 echo 0 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filter
 echo 0 | sudo tee /proc/sys/net/ipv4/conf/tunl0/rp_filter
 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
 ​
 # 持久化
 sudo tee /etc/sysctl.d/99-lvs-tun.conf <<'EOF'
 net.ipv4.ip_forward = 1
 net.ipv4.conf.all.arp_ignore = 1
 net.ipv4.conf.all.arp_announce = 2
 net.ipv4.conf.tunl0.arp_ignore = 1
 net.ipv4.conf.tunl0.arp_announce = 2
 net.ipv4.conf.all.rp_filter = 0
 net.ipv4.conf.tunl0.rp_filter = 0
 EOF
 ​
 # 立即加载并应用
 sudo sysctl -p /etc/sysctl.d/99-lvs-tun.conf

安装Web服务

 sudo apt install nginx -y
 echo "rs1" | sudo tee /var/www/html/index.html    # RS2 写 rs2
 sudo systemctl start nginx
 sudo systemctl enable nginx

⚠️ nginx 必须监听在所有网卡(默认即可,不要只绑 127.0.0.1),因为请求发到 VIP(192.168.2.100)。

Client测试客户端配置

作用:192.168.2.50,访问 VIP 测试负载均衡。

 # 编辑配置文件
 vim /etc/netplan/50-cloud-init.yaml
 ​
 # 替换一下内容
 network:
   ethernets:
     ens33:
       addresses:
         - 192.168.2.50/24
       routes:
         - to: default
           via: 192.168.2.10
       nameservers:
         addresses:
           - 114.114.114.114
           - 8.8.8.8
   version: 2
 ​
 # 刷新配置文件
 sudo netplan apply
 ​
 # 安装 curl 工具
 sudo apt install curl -y

验证与测试

网络连通性测试

 # ① 连通性(同网段内ping可用)
 ping -c 2 192.168.2.100    # Client → VIP(应通)
 ping -c 2 192.168.2.200    # Client → LVS(应通)
 ping -c 2 192.168.2.10     # Client → 路由器内网口(应通)
 ​
 # ② 直接访问 RS(不走 LVS,验证 RS 本身)
 curl http://192.168.2.210  # 应显示 rs1
 curl http://192.168.2.220  # 应显示 rs2
 ​
 # ③ 通过 VIP 轮询测试(应 rs1/rs2 交替出现)
 for i in {1..10}; do curl -s http://192.168.2.100; echo; done
 ​
 # ④ 在 LVS 上看统计
 sudo ipvsadm -Ln --stats
 sudo ipvsadm -Lnc
 ​
 # ⑤ 重启后验证持久化(重启 LVS/RS 后执行)
 systemctl is-enabled lvs-boot.service      # LVS 上,应 enabled
 systemctl is-enabled lvs-rs-boot.service   # RS 上,应 enabled
 ip addr show lo | grep 192.168.2.100       # LVS 的 VIP 应还在
 ip addr show tunl0 | grep 192.168.2.100    # RS 的 VIP 应还在

注:验证"能不能上网/下载"用 curl,不要用 ping(NAT 网络禁 ICMP)。

LVS统计监控

TUN vs NAT 模式对比

项目

NAT 模式(-m)

TUN 模式(-i)

网卡要求

LVS 必须双网卡

全部单网卡即可

回包路径

必须经 LVS

RS 直接回客户端

LVS 瓶颈

有(大流量成瓶颈)

无(只做封装转发)

MASQUERADE

必须配

不需要

RS 特殊配置

无

必须配 tunl0 + VIP + ARP抑制

跨网段

不支持

支持

LVS管理命令速查

操作

命令

查看规则

ipvsadm -Ln

查看统计

ipvsadm -Ln --stats

查看连接

ipvsadm -Lnc

清空规则

ipvsadm -C

添加虚拟服务

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

添加真实服务器(TUN)

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

删除真实服务器

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

保存规则

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

恢复规则

ipvsadm-restore < /etc/ipvsadm.rules

常见问题排查

问题

检查方法

解决方案

Client ping 不通 VIP(报 Destination Host Unreachable)

LVS 上 ip addr show lo

LVS 没绑 VIP:ip addr add 192.168.2.100/32 dev lo

访问 VIP 报 Connection refused

LVS 上 ipvsadm -Ln

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

一直访问同一台 RS

浏览器缓存

curl --no-cache 或用 for 循环

RS 收到请求不回包

RS 上 cat /proc/sys/net/ipv4/conf/all/rp_filter

rp_filter 没关:置 0

网站 502

systemctl status nginx

nginx 没起或没监听全部网卡

重启后全失效

systemctl is-enabled lvs-boot.service

持久化用 systemd 服务(LVS: lvs-boot.service,RS: lvs-rs-boot.service);ARP 写 sysctl.d;MASQUERADE 存 iptables-persistent

关键注意事项

  1. 所有机器单网卡即可(TUN 不需要双网卡)

  2. RS 必须配置 tunl0 隧道接口并绑定 VIP,这是 TUN 模式最容易漏的

  3. RS 必须做 ARP 抑制(arp_ignore=1 / arp_announce=2),否则 VIP 冲突

  4. RS 必须关闭 rp_filter,否则隧道包被丢弃

  5. 调度参数用 -i(IPIP),不是 -m

  6. 不需要 MASQUERADE(LVS 上)

  7. LVS 和 RS 都要加载 ipip 内核模块

  8. 持久化:VIP+ipvsadm 用 systemd 服务(LVS: lvs-boot.service,RS: lvs-rs-boot.service);ARP/rp_filter 写 /etc/sysctl.d/99-lvs-tun.conf;路由器 MASQUERADE 存 iptables-persistent

  9. 所有实验机内网网关指向路由器 192.168.2.10

  10. 路由器外网口:接 VMware NAT 网络,静态 IP 用 .2 以外(如 192.168.1.10),网关必须是网段的 .2(192.168.1.2)

  11. 判断外网连通性用 curl,不要用 ping(NAT 网络禁 ICMP)

  12. 路由器必须配 MASQUERADE(192.168.2.0/24 → ens37),否则内网机器出不去


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