LVS DR模式 实验

image

 

第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 客户端测试

使用浏览器测试:

  1. 打开浏览器

  2. 访问 http://192.168.206.150

  3. 多次刷新页面,观察页面内容

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

  

posted @ 2025-12-26 14:25  Peter.Jones  阅读(4)  评论(0)    收藏  举报