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 IP是219.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 请求:
- 客户端或路由器可能会学到 RS 的 MAC 地址。
- 后续请求直接发给 RS,绕过 LVS。
- 后果:负载均衡失效,且由于 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 模式优缺点总结
✅ 优点
- 高性能:LVS 只处理入站请求,出站响应由 RS 直接处理,LVS 几乎无瓶颈。
- 透明性:不修改 IP 和端口,支持任何应用协议(HTTP, HTTPS, FTP, MySQL 等)。
- 成本低:RS 可以是任何操作系统,无需特殊软件,只需内核参数调整。
- 扩展性强:理论上可支撑数万台后端服务器(受限于二层网络规模)。
❌ 缺点/限制
- 同网段限制 :LVS 和 RS 必须在同一物理网络(同一 VLAN/广播域),不能跨路由器(因为依赖 MAC 地址转发)。
- 配置复杂:需要在每台 RS 上手动配置 VIP 和 ARP 抑制参数。
- 不支持端口映射:无法像 NAT 模式那样将外部 80 端口映射到内部 8080 端口。
7. 快速部署检查清单 (Checklist)
在上线前,请逐项核对:
- 网络拓扑:确认 LVS 和所有 RS 在同一交换机/VLAN 下。
- LVS 配置 :
- VIP 绑定在物理网卡。
- 开启 IP 转发 (
net.ipv4.ip_forward = 1)。 - 配置
ipvsadm规则。
- RS 配置 :
- VIP 绑定在
lo:0,掩码/32。 - 关键 :已设置
arp_ignore=1和arp_announce=2。 - 关键 :默认网关指向真实路由器,绝不能指向 LVS 的 DIP。
- VIP 绑定在
- 验证测试 :
- 在 Client 端
ping VIP,检查 ARP 缓存,确认 MAC 地址属于 LVS 而非 RS。 - 在 LVS 和 RS 上同时
tcpdump,确认请求包 MAC 被改写,响应包不经过 LVS。
- 在 Client 端