LVS DR模式 实验

第1步:所有节点基础配置
1.1 设置主机名(可选,便于识别)
# node01 hostnamectl set-hostname director # node02 hostnamectl set-hostname rs1 # node03 hostnamectl set-hostname rs2 # 临时生效 hostname director # node01 hostname rs1 # node02 hostname rs2 # node03
1.2 关闭防火墙和SELinux(所有节点)
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭SELinux(临时) setenforce 0 # 永久关闭SELinux(需要重启生效) sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1.3 确认网络连通性
# 在node01上测试 ping -c 3 192.168.206.128 # node02 ping -c 3 192.168.206.129 # node03 ping -c 3 192.168.206.1 # 宿主机 # 在node02和node03上也要测试相互连通
第2步:配置Real Server(node02和node03)
2.1 配置ARP抑制参数(关键!)
# 创建配置文件 cat > /etc/sysctl.d/lvs-dr.conf << EOF # 针对ens33接口的ARP参数 net.ipv4.conf.ens33.arp_ignore = 1 net.ipv4.conf.ens33.arp_announce = 2 # 针对所有接口的ARP参数 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 EOF # 应用配置 # sysctl: Linux 系统用于配置内核参数的命令 # -p: 参数表示从指定文件加载内核参数配置 # /etc/sysctl.d/lvs-dr.conf: 配置文件路径 # 立即生效 sysctl -p /etc/sysctl.d/lvs-dr.conf # 验证配置 echo "检查ARP配置:" sysctl net.ipv4.conf.ens33.arp_ignore sysctl net.ipv4.conf.ens33.arp_announce
2.2 配置隐藏VIP(在回环接口)
# 地址配置 - 为接口分配 IP 地址
# 方法1:使用ifconfig(传统)
ifconfig lo:3 192.168.206.150 netmask 255.255.255.255 up
# 方法2:使用ip命令(推荐)
ip addr add 192.168.206.150/32 dev lo label lo:3
# 命令含义
# ip addr add: 向网络接口添加 IP 地址
# 192.168.206.150/32: 配置单个 IP 地址(掩码为 32 位)
# dev lo: 目标设备为回环接口(loopback)
# label lo:3: 为该 IP 地址设置别名标识符 lo:3
# 作用
# 创建虚拟接口: 在 lo 接口上创建 lo:3 别名接口
# 配置 VIP: 将 VIP 192.168.206.150 绑定到回环接口
# 隐藏 VIP: 用于 LVS 架构中的隐藏 VIP 配置
# 路由配置 - 定义数据包转发路径 # 添加主机路由 ip route add 192.168.206.150 dev lo:3 # 命令含义 # ip route add: 添加路由规则 # 192.168.206.150: 目标网络/地址 # dev lo:3: 指定出站设备为 lo:3 接口 # 作用 # 路由配置: 将目标地址 192.168.206.150 的流量路由到 lo:3 接口 # 流量控制: 确保相关数据包通过正确的接口处理
# 查看配置 echo "查看lo接口配置:" ip addr show lo:3 echo "查看路由:" ip route show | grep 192.168.206.150
2.3 创建开机自启动脚本(可选)
cat > /etc/rc.d/init.d/lvs-rs << 'EOF'
#!/bin/bash
# chkconfig: 2345 99 20
# description: LVS Real Server
case "$1" in
start)
# 添加隐藏VIP
ip addr add 192.168.206.150/32 dev lo label lo:3 2>/dev/null
ip route add 192.168.206.150 dev lo:3 2>/dev/null
echo "LVS Real Server VIP configured"
;;
stop)
# 删除VIP
ip addr del 192.168.206.150/32 dev lo:3 2>/dev/null
echo "LVS Real Server VIP removed"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0
EOF
chmod +x /etc/rc.d/init.d/lvs-rs
chkconfig --add lvs-rs
chkconfig lvs-rs on
2.4 安装apache http server
# 安装apache的static http server 默认端口80 yum install httpd -y # 启动 service httpd start # 编辑页面内容 vi /var/www/html/index.html
第3步:配置Director(node01)
3.1 配置VIP(在ens33接口上)
# 配置VIP子接口
ifconfig ens33:8 192.168.206.150 netmask 255.255.255.0 up
# 或者使用ip命令 (只需给接口添加IP地址,无需添加路由, 另外留意这里是 24,不是32)
ip addr add 192.168.206.150/24 dev ens33 label ens33:8
# 查看配置
echo "查看ens33接口配置:"
ip addr show ens33:8
# 永久配置(创建网络配置文件)(可选)
cat > /etc/sysconfig/network-scripts/ifcfg-ens33:8 << EOF
DEVICE=ens33:8
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.206.150
NETMASK=255.255.255.0
EOF
# 重启网络
systemctl restart network
3.2 安装ipvsadm并配置LVS规则
# 安装ipvsadm yum install -y ipvsadm # 清除现有规则 ipvsadm -C # 创建虚拟服务(使用轮询调度算法) # -A: 添加虚拟服务 # -t: TCP协议,VIP:80 # -s rr: 调度算法为轮询 ipvsadm -A -t 192.168.206.150:80 -s rr # 添加真实服务器 # -a: 添加真实服务器 # -t: TCP协议,VIP:80 # -r: 真实服务器地址 # -g: DR模式 # -w: 权重(默认1) ipvsadm -a -t 192.168.206.150:80 -r 192.168.206.128:80 -g -w 1 ipvsadm -a -t 192.168.206.150:80 -r 192.168.206.129:80 -g -w 1 # 保存配置(CentOS 7) service ipvsadm save # 或 ipvsadm-save > /etc/sysconfig/ipvsadm # 查看配置 echo "查看LVS规则:" ipvsadm -ln echo "查看详细规则:" ipvsadm -ln --stats
3.3 开启IP转发(可选,DR模式通常不需要)
# 虽然DR模式不依赖IP转发,但建议开启 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p # 验证 cat /proc/sys/net/ipv4/ip_forward
第4步:测试和验证
4.1 基础连通性测试
# 在node01上测试 ping -c 3 192.168.206.150 # VIP ping -c 3 192.168.206.128 # RS1 ping -c 3 192.168.206.129 # RS2 # 在node02和node03上测试 ping -c 3 192.168.206.150 # 应该能ping通自己的隐藏VIP
4.2 查看ARP配置
# 在Real Server上检查ARP抑制 echo "Real Server上的ARP配置:" cat /proc/sys/net/ipv4/conf/ens33/arp_ignore cat /proc/sys/net/ipv4/conf/ens33/arp_announce
4.3 客户端测试
使用浏览器测试:
-
打开浏览器
-
访问
http://192.168.206.150 -
多次刷新页面,观察页面内容
4.4 LVS状态监控
# 在node01上监控LVS状态 watch -n 1 'echo "=== LVS连接统计 ==="; ipvsadm -lnc | head -20' # 查看连接详细信息 ipvsadm -ln --stats # 查看当前活动连接 ipvsadm -lnc
ARP 参数配置说明
ARP 参数配置说明
并存关系: 两个配置可以同时存在并生效
优先级机制: 接口级别配置优先于全局配置
配置项含义 net.ipv4.conf.ens33.arp_ignore = 1 作用范围: 仅针对 ens33 网络接口 功能: 只响应目标IP地址为本地配置IP的数据包 效果: 防止接口响应其他IP地址的ARP请求 net.ipv4.conf.ens33.arp_announce = 2 作用范围: 仅针对 ens33 网络接口 功能: 从最佳本地地址发出ARP响应 效果: 选择最适合回应ARP请求的本地IP地址
全局配置 net.ipv4.conf.all.arp_ignore = 1 作用范围: 所有网络接口 功能: 统一ARP忽略策略
大白话:只响应"属于本机"的IP(含真实和虚拟)地址的ARP请求,其他的请求忽略。
net.ipv4.conf.all.arp_announce = 2 作用范围: 所有网络接口 功能: 统一ARP宣告策略
所有网络接口都从最佳本地地址发出ARP响应
LVS场景应用 在Director节点上的作用 VIP管理: 确保VIP 192.168.206.150 正确处理ARP请求 防冲突: 避免多个节点同时响应同一VIP的ARP请求 在Real Server节点上的作用 隐藏VIP: 防止真实服务器对外宣告VIP地址 流量控制: 确保只有Director响应VIP相关的ARP请求
配置目的 高可用保障: 防止ARP缓存混乱 负载均衡: 确保流量正确路由到Director 网络隔离: 避免VIP冲突导致的服务中断
大白话:只期望 Director 节点来处理 VIP 的 ARP 请求与响应,这样确保了流量正确流向负载均衡器进行分发。
客户端 (CIP): 192.168.206.1 ↓ (MAC: 宿主机的MAC → Director的MAC) VMware虚拟网络交换机 (VMnet8) ↓ LVS集群: ├── Director (node01): │ ├── DIP: 192.168.206.130/24 (ens33, MAC_D) │ └── VIP: 192.168.206.150/24 (ens33:8) ← 同一物理网卡,共享MAC_D │ ├── Real Server 1 (node02): │ ├── RIP: 192.168.206.128/24 (ens33, MAC_R1) │ └── 隐藏VIP: 192.168.206.150/32 (lo:3) ← 不对外ARP响应 │ └── Real Server 2 (node03): ├── RIP: 192.168.206.129/24 (ens33, MAC_R2) └── 隐藏VIP: 192.168.206.150/32 (lo:3) ← 不对外ARP响应
详细请求链路
阶段1:客户端准备发送请求
1.1 客户端ARP查询
# 客户端发送ARP广播 ARP请求: "Who has 192.168.206.150? Tell 192.168.206.1" # 二层帧头: # 源MAC: MAC_C (客户端网卡MAC) # 目标MAC: FF:FF:FF:FF:FF:FF (广播) # ARP载荷: 查询IP 192.168.206.150的MAC地址
1.2 ARP响应(只有Director响应)
# Director响应(Real Server不响应,因为ARP抑制) ARP响应: "192.168.206.150 is at MAC_D" # 客户端ARP缓存更新: # 192.168.206.150 → MAC_D
1.3 客户端构造HTTP请求
# 二层帧头: 源MAC: MAC_C (客户端) 目标MAC: MAC_D (Director的MAC) # 三层IP头: 源IP: 192.168.206.1 (CIP) 目标IP: 192.168.206.150 (VIP) # 四层TCP头: 源端口: 49152 (随机临时端口) 目标端口: 80 (HTTP) 序列号: 1000 (假设) ACK号: 0 (SYN标志) # 数据: GET / HTTP/1.1\r\nHost: 192.168.206.150\r\n\r\n
阶段2:数据包到达Director (node01)
2.1 网卡接收数据包
数据包到达ens33接口: - 目标MAC: MAC_D ✓ (匹配) - 目标IP: 192.168.206.150 ✓ (本地VIP) 处理流程: ens33网卡驱动 → 内核网络协议栈 → IPVS模块
2.2 Director内部处理流程
// 伪代码:内核处理流程 1. 数据包到达ens33,通过DMA到内存 2. 检查目标MAC == MAC_D? ✓ 3. 检查目标IP: 192.168.206.150 4. 查询路由表: ip route get 192.168.206.150 → local 192.168.206.150 dev ens33 table local 5. 数据包上送本地协议栈 6. 到达IP层,目标IP匹配本地VIP 7. 内核netfilter框架检查 8. IPVS模块介入(因为VIP配置了虚拟服务)
2.3 IPVS负载均衡决策
# Director上的IPVS配置 ipvsadm -ln # TCP 192.168.206.150:80 rr # -> 192.168.206.128:80 Route 1 0 0 # -> 192.168.206.129:80 Route 1 0 0 # IPVS根据调度算法选择Real Server # 假设选择轮询算法,这次选择Real Server 1 (192.168.206.128)
2.4 Director转发数据包
关键:只修改MAC地址,不修改IP地址!
# Director修改后的数据包:
# 二层帧头(修改):
源MAC: MAC_D (Director) → **保持不变**
目标MAC: MAC_D → **改为MAC_R1** (Real Server 1的MAC)
# 三层IP头(不变):
源IP: 192.168.206.1 (CIP) → 保持不变
目标IP: 192.168.206.150 (VIP) → 保持不变
# 四层TCP头(不变):
源端口: 49152 → 保持不变
目标端口: 80 → 保持不变
序列号: 1000 → 保持不变
转发机制:
# Director执行类似这样的操作(内核实现): 1. 从ARP表获取Real Server 1的MAC: ip neigh show | grep 192.168.206.128 2. 修改数据包目标MAC为MAC_R1 3. 从ens33接口重新发送出去 # 注意:数据包的源MAC还是MAC_D,不是MAC_C! # 因为要从Director的网卡发送出去
阶段3:数据包到达Real Server 1 (node02)
3.1 网卡接收数据包
数据包到达ens33接口: - 目标MAC: MAC_R1 ✓ (匹配自己的MAC) - 目标IP: 192.168.206.150 (VIP,但不在ens33接口上) # 正常网卡处理: # 目标MAC匹配 → 接收数据包 # 目标IP不是本接口IP → 应该丢弃?
3.2 Real Server的特殊处理
// 由于Real Server配置了隐藏VIP,处理流程特殊: 1. 数据包到达ens33,DMA到内存 2. 检查目标MAC == MAC_R1? ✓ 3. 检查目标IP: 192.168.206.150 4. 查询路由表: ip route get 192.168.206.150 → 192.168.206.150 dev lo:3 # 通过之前配置的特殊路由 5. 路由指示:这个IP应该从lo:3接口处理 6. 数据包被重新标记为"本地处理" 7. 协议栈继续处理,发现192.168.206.150是本地地址(lo:3) 8. 上送到TCP层,端口80 9. HTTP服务(监听在0.0.0.0:80或192.168.206.150:80)接收
3.3 Real Server看到的连接信息
# 在Real Server 1上查看连接
ss -tlnp | grep :80
# LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=1234))
# 查看建立的连接
netstat -tn | grep :80
# tcp 0 0 192.168.206.128:80 192.168.206.1:49152 ESTABLISHED
# 注意:Real Server看到的客户端是真实的CIP (192.168.206.1)
# 这是DR模式的特点!
3.4 HTTP服务处理请求
# Apache处理流程: 1. 接收HTTP请求: GET / HTTP/1.1 2. 查找虚拟主机配置 3. 读取 /var/www/html/index.html 4. 准备HTTP响应
阶段4:Real Server返回响应
4.1 构造响应数据包
# HTTP响应: HTTP/1.1 200 OK Content-Type: text/html Content-Length: ... <html>...Real Server 1的内容...</html> # Real Server构造响应数据包: # 二层帧头(新建): 源MAC: MAC_R1 (Real Server 1) 目标MAC: MAC_C (客户端MAC,通过ARP获取) # 三层IP头(新建): 源IP: 192.168.206.150 (VIP) ← **关键!使用VIP作为源** 目标IP: 192.168.206.1 (CIP) # 四层TCP头(新建): 源端口: 80 (HTTP) 目标端口: 49152 (客户端端口) 序列号: 5000 (根据握手情况) ACK号: 1001 (客户端序列号+1)
4.2 Real Server的ARP查询
# 为了发送响应给客户端,Real Server需要客户端的MAC ARP请求: "Who has 192.168.206.1? Tell 192.168.206.128" # 客户端响应: ARP响应: "192.168.206.1 is at MAC_C" # Real Server ARP缓存: # 192.168.206.1 → MAC_C
阶段5:客户端接收响应
5.1 客户端接收数据包
数据包到达客户端网卡: - 目标MAC: MAC_C ✓ (匹配) - 目标IP: 192.168.206.1 ✓ (匹配) - 源IP: 192.168.206.150 (VIP,预期) 处理流程: 1. 网卡接收,上送协议栈 2. TCP层处理,匹配到之前的连接 3. HTTP客户端接收响应
5.2 客户端的视角
# 客户端看到的连接信息(Windows示例): netstat -an | findstr :80 # TCP 192.168.206.1:49152 192.168.206.150:80 ESTABLISHED # 客户端认为自己在和192.168.206.150通信 # 但实际上请求经过Director转发,响应直接来自Real Server

浙公网安备 33010602011771号