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 处理完直接回包给客户端(不经过调度器)——调度器不再是瓶颈,适合跨网段,且所有机器单网卡即可。
环境规划表
数据流向: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.serviceARP 抑制 + 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 模式对比
LVS管理命令速查
常见问题排查
关键注意事项
所有机器单网卡即可(TUN 不需要双网卡)
RS 必须配置 tunl0 隧道接口并绑定 VIP,这是 TUN 模式最容易漏的
RS 必须做 ARP 抑制(arp_ignore=1 / arp_announce=2),否则 VIP 冲突
RS 必须关闭 rp_filter,否则隧道包被丢弃
调度参数用
-i(IPIP),不是-m不需要 MASQUERADE(LVS 上)
LVS 和 RS 都要加载
ipip内核模块持久化: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所有实验机内网网关指向路由器 192.168.2.10
路由器外网口:接 VMware NAT 网络,静态 IP 用
.2以外(如 192.168.1.10),网关必须是网段的.2(192.168.1.2)判断外网连通性用
curl,不要用 ping(NAT 网络禁 ICMP)路由器必须配 MASQUERADE(
192.168.2.0/24 → ens37),否则内网机器出不去
配置完成后,通过 Client 访问 http://192.168.2.100,多次刷新应看到 rs1 和 rs2 交替出现,说明 LVS TUN 集群部署成功!
LVS的TUN模式
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法