LVS DR 模式(Direct Routing)

1. 核心概念与前提

在深入 DR 模式之前,必须明确 NAT 与 DR 的根本区别,以及"视角"的重要性。

🔹 关键定义:站在"请求包"的角度

  • DNAT (Destination NAT) :修改请求包的目标 IP(通常用于将 VIP 流量转发给 RS)。
  • SNAT (Source NAT) :修改请求包的源 IP(通常用于让响应包能正确返回)。
  • DR 模式的特殊性
    • 不改 IP :DR 模式既不进行 DNAT,也不进行 SNAT
    • 只改 MAC :它仅在链路层修改目标 MAC 地址
    • 视角统一 :无论请求还是响应,我们讨论的"转换行为"均基于客户端发出的原始请求包来定义。在 DR 模式中,这个包在网络层(IP)是完全透明的。

2. 架构拓扑与组件角色

🏗️ 网络结构图

📋 组件职责

组件 IP 配置 关键行为
Client 公网 IP 发起请求,目标为 VIP。
LVS (Director) VIP (物理网卡) DIP (内网网卡) 1. 响应 VIP 的 ARP 请求。 2. 接收请求包,根据算法选择 RS。 3. 仅修改目标 MAC 为选中 RS 的 MAC。 4. 转发给交换机。
RS (Real Server) RIP (物理网卡) VIP (Lo 回环接口) 1. 不响应 VIP 的 ARP 请求(静默)。 2. 接收目标 MAC 为自己、目标 IP 为 VIP 的包。 3. 处理业务。 4. 直接通过默认网关将响应包发回 Client(不经过 LVS)。

3. 数据包流转深度解析

🔄 完整生命周期(以 HTTP 请求为例)

阶段一:请求进入 (Client → LVS)
  • 动作:Client 发送 HTTP 请求。
  • 数据包特征
    • Src IP: 49.89.179.13 (Client)
    • Dst IP: 219.142.145.239 (VIP)
    • Dst MAC: LVS 的 MAC (因为 LVS 响应了 ARP)
  • 结果:数据包被路由到 LVS。
阶段二:LVS 调度 (LVS 内部处理)
  • 动作:LVS 收到包,发现目标是 VIP,查找调度表选中 RS-1。
  • 核心操作改写链路层头部
    • Src IP: 不变 (49.89.179.13)
    • Dst IP: 不变 (219.142.145.239)
    • Src MAC: 改为 LVS 的 DIP MAC (可选,通常是 LVS 出口 MAC)
    • Dst MAC: 改为 RS-1 的 MAC
  • 结果:数据包被扔回局域网,交换机根据 MAC 表直接转发给 RS-1。
阶段三:RS 处理 (RS-1 接收)
  • 动作:RS-1 网卡收到帧,检查 MAC 匹配。向上递交给 IP 层。
  • IP 层检查 :发现 Dst IP219.142.145.239
    • 正常情况:如果本机没有这个 IP,会丢弃。
    • DR 特配 :RS-1 的 lo:0 接口绑定了该 VIP,且内核参数允许接收(arp_ignore 设置得当),因此接受并处理
  • 业务处理:Web 服务生成响应数据。
阶段四:响应返回 (RS-1 → Client)
  • 动作:RS-1 构造响应包。
  • 数据包特征
    • Src IP: 219.142.145.239 (VIP) ------ 伪装成 VIP 回复
    • Dst IP: 49.89.179.13 (Client)
    • Gateway: RS-1 的默认网关(指向真实路由器,不是 LVS
  • 结果 :响应包绕过 LVS,直接经由交换机/路由器返回给 Client。

4. OSI 模型层级变化对比

这是理解 DR 模式高性能的关键:除了链路层,其他层完全透明。

OSI 层级 字段 原始包 (Client→LVS) 转发包 (LVS→RS) 响应包 (RS→Client) 变化情况
应用层 Data GET /index.html GET /index.html HTTP 200 OK ❌ 不变
传输层 Port Sport: 54321, Dport: 80 Sport: 54321, Dport: 80 Sport: 80, Dport: 54321 ❌ 不变
网络层 IP Src: Client, Dst: VIP Src: Client, Dst: VIP Src: VIP, Dst: Client 完全不变 (请求阶段)
链路层 MAC Dst: LVS_MAC Dst: RS_MAC Dst: Router_MAC 唯一改变点

💡 结论:因为不修改 IP 和端口,DR 模式支持所有基于 TCP/UDP 的应用,包括加密流量(HTTPS),且性能损耗极低。


5. 核心难点:ARP 风暴与抑制机制

DR 模式成败的关键在于:如何确保只有 LVS 响应 VIP 的 ARP 请求?

⚠️ 问题场景

如果 RS 也响应了 "Who has VIP?" 的 ARP 请求:

  1. 客户端或路由器可能会学到 RS 的 MAC 地址。
  2. 后续请求直接发给 RS,绕过 LVS。
  3. 后果:负载均衡失效,且由于 RS 可能未建立连接状态,导致丢包或连接重置。

🛡️ 解决方案:内核参数调优 (在 RS 上执行)

必须在所有 RS 上配置以下参数,实现 "ARP 隐藏"

1. 禁止响应 ARP 请求 (arp_ignore)
复制代码
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  • 含义 :只有当目标 IP 地址是接收网卡的主 IP时,才响应 ARP 请求。
  • 效果 :当 ARP 请求询问 VIP 时,RS 发现 VIP 绑定在 lo (回环) 接口,而请求是从 eth0 进来的,主 IP 是 RIP,因此不响应
2. 禁止主动宣告 ARP (arp_announce)
复制代码
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  • 含义 :在发送 ARP 响应时,总是使用最佳本地地址(即接口的主 IP),而不是别名 IP(VIP)。
  • 效果:防止 RS 在任何情况下意外暴露 VIP 的 MAC 地址。
3. 实践中的 VIP 绑定

在 RS 上将 VIP 绑定到 lo:0,并设置为 /32 掩码:

复制代码
ifconfig lo:0 219.142.145.239 netmask 255.255.255.255 up
route add -host 219.142.145.239 dev lo:0

6. DR 模式优缺点总结

✅ 优点

  1. 高性能:LVS 只处理入站请求,出站响应由 RS 直接处理,LVS 几乎无瓶颈。
  2. 透明性:不修改 IP 和端口,支持任何应用协议(HTTP, HTTPS, FTP, MySQL 等)。
  3. 成本低:RS 可以是任何操作系统,无需特殊软件,只需内核参数调整。
  4. 扩展性强:理论上可支撑数万台后端服务器(受限于二层网络规模)。

❌ 缺点/限制

  1. 同网段限制 :LVS 和 RS 必须在同一物理网络(同一 VLAN/广播域),不能跨路由器(因为依赖 MAC 地址转发)。
  2. 配置复杂:需要在每台 RS 上手动配置 VIP 和 ARP 抑制参数。
  3. 不支持端口映射:无法像 NAT 模式那样将外部 80 端口映射到内部 8080 端口。

7. 快速部署检查清单 (Checklist)

在上线前,请逐项核对:

  • 网络拓扑:确认 LVS 和所有 RS 在同一交换机/VLAN 下。
  • LVS 配置
    • VIP 绑定在物理网卡。
    • 开启 IP 转发 (net.ipv4.ip_forward = 1)。
    • 配置 ipvsadm 规则。
  • RS 配置
    • VIP 绑定在 lo:0,掩码 /32
    • 关键 :已设置 arp_ignore=1arp_announce=2
    • 关键 :默认网关指向真实路由器,绝不能指向 LVS 的 DIP。
  • 验证测试
    • 在 Client 端 ping VIP,检查 ARP 缓存,确认 MAC 地址属于 LVS 而非 RS。
    • 在 LVS 和 RS 上同时 tcpdump,确认请求包 MAC 被改写,响应包不经过 LVS。
相关推荐
开朗觉觉1 天前
将json字符串转换为json对象
linux·服务器·python
脱脱克克1 天前
OpenClaw 腾讯云 + 火山方舟(Volcengine Ark)完整安装与扩展教程
linux·腾讯云·openclaw
ZKNOW甄知科技1 天前
深度对标ServiceNow:燕千云如何破解企业全球化运维难题?
大数据·运维·人工智能·科技·ai·自动化·运维开发
进击切图仔1 天前
ROS 跨机通信与 Docker 多机环境搭建
运维·docker·容器
主角1 71 天前
Nginx核心功能
运维·nginx
cyber_两只龙宝1 天前
【MySQL】MySQL主从复制架构
linux·运维·数据库·mysql·云原生·架构
Lolo_fi1 天前
Linux PCI/PCIe子系统
linux
i建模1 天前
在 Windows CMD 中将当前路径永久添加到系统环境变量
运维·windows
虚拟世界AI1 天前
Linux运维实战:从部署到高可用全指南
linux·运维
闫记康1 天前
scp工具
linux·运维·服务器·学习·ssh·github