DR模式-直接路由模式

web架构, 负载均衡  ·  2026-10-10

DR模式-直接路由模式

一、

1、工作原理

image-20261010091209248.png

2、DR模式与NAT模式的区别

对比项LVS-NATLVS-DR
请求如何转发修改目标 IP修改目标 MAC
响应如何返回后端 → LVS → 客户端后端 → 客户端
后端默认网关通常指向 LVS不要求指向 LVS
后端是否配置 VIP通常不需要需要配置在环回接口等非 ARP 响应接口上
LVS 与后端网络要求可以跨网段通常要求同一二层网络
性能特点双向流量经过 LVS响应流量绕过 LVS

注意:DR 模式中,LVS 转发前后的 IP 报文源、目标 IP 地址不变,主要变化是以太网帧的目标 MAC 地址。

3、实验环境规划

LVS 入口 VIP 是 10.0.0.5,两台后端服务器分别是 172.16.1.7 和 172.16.1.8

这次不能直接沿用 NAT 模式的双网段配置。 需要让 LVS 的转发网卡和两台后端服务器处于同一个二层网络。为了让步骤清晰,下面统一采用一个独立的 DR 实验网段。

机器地址作用
lb0110.0.0.10/24调度器DIP
lb0110.0.0.5/32对外服务VIP
web0110.0.0.7/24后端RIP
web0110.0.0.5/32环回接口上的VIP
web0210.0.0.8/24后端RIP
web0210.0.0.5/24环回接口上的VIP
Client10.0.0.1/24测试客户端

以上均为示例地址。请确保它们属于同一个虚拟二层网络,且没有与现有设备或 DHCP 地址冲突。若你的实验环境不能调整网卡或 IP,请先核对实际拓扑再执行配置。

其中几个名词要记住:

  • VIP(Virtual IP):客户端访问的虚拟服务地址,这里是 10.0.0.5。
  • DIP(Director IP):LVS 调度器的真实地址,这里是 10.0.0.10。
  • RIP(Real IP):后端服务器的真实地址,这里是 10.0.0.7 和 10.0.0.8。

4、配置lb01的VIP

[root@lb01 ~]# ip addr add 10.0.0.5/32 dev ens33
# 检查
ip a show dev ens33

5、配置两台后端服务器的VIP

[root@web01 ~]# ip addr add 10.0.0.5/32 dev lo
[root@web02 ~]# ip addr add 10.0.0.5/32 dev lo

6、解决后端服务器的ARP问题

a.为什么DR模式需要处理ARP?

假设客户端要访问10.0.0.5,它会先通过ARP获取VIP对应的MAC地址。

正常情况下,客户端应该把请求发送给lb01的MAC地址,让LVS执行调度

但web01和web02也配置了10.0.0.5。如果它们也响应ARP,客户端or网络中的其他设备就可能学到错误的MAC地址,导致请求绕过LVS,或者出现访问不稳定

因此,我们需要让后端服务器:

  • 可以在本机处理目标IP为VIP的请求
  • 不主动抢答VIP的ARP请求
  • 在发起ARP请求时,避免把VIP当作自己的发送源地址来宣告
b.在web01和web02上执行

创建持久化配置:web01 + web02

cat > /etc/sysctl.d/99-lvs-dr.conf <<'EOF'
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF

7、配置后端web服务

可以直接复用NAT搭建的简易web服务

8、在lb01配置IPVS规则

# 先确认内核模块和工具:
lsmod | grep ip_vs
ipvsadm -Ln
# 如果模块尚未加载:
modprobe ip_vs
# 清理ipvs规则,只适用于实验环境
ipvsadm -C
# 创建DR虚拟服务
ipvsadm -A -t 10.0.0.5:80 -s rr
# 添加两个后端
ipvsadm -a -t 10.0.0.5:80 -r 10.0.0.7:80 -g
ipvsadm -a -t 10.0.0.5:80 -r 10.0.0.8:80 -g
参数含义
-A添加虚拟服务
-t指定 TCP 虚拟服务地址和端口
-s rr使用轮询调度算法
-a添加真实服务器
-r指定后端服务器地址
-g使用 Gatewaying,也就是 DR 转发模式

注意区别:

  • NAT 模式使用 -m。
  • DR 模式使用 -g。
  • TUN 模式使用 -i。
# 检查规则
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.5:80 rr
  -> 10.0.0.7:80                  Route   1      0          0         
  -> 10.0.0.8:80                  Route   1      0          0         

9、验证DR模式是否成功

a.检查VIP和IPVS规则

lb01执行:

[root@lb01 ~]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:6e:46:ec brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.10/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.0.0.5/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe6e:46ec/64 scope link 
       valid_lft forever preferred_lft forever
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.5:80 rr
  -> 10.0.0.7:80                  Route   1      0          0         
  -> 10.0.0.8:80                  Route   1      0          0         

web01 web02执行:

[root@web01 ~]# ip addr show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.0.0.5/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
[root@web01 ~]# sysctl net.ipv4.conf.all.arp_ignore
net.ipv4.conf.all.arp_ignore = 1
b.从客户端访问VIP
[root@client ~]# for i in {1..10}; do
>      curl --connect-timeout 2 --max-time 3 -s http://10.0.0.5/
>      echo
>  done
Hello from WEB02

Hello from WEB01

Hello from WEB02

Hello from WEB01

Hello from WEB02

Hello from WEB01

Hello from WEB02

Hello from WEB01

Hello from WEB02

Hello from WEB01
c.在LVS上观察请求
[root@lb01 ~]# tcpdump -ni ens33 -e 'tcp port 80'
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
10:04:58.411631 00:0c:29:49:a3:0e > 00:0c:29:6e:46:ec, ethertype IPv4 (0x0800), length 74: 10.0.0.100.42088 > 10.0.0.5.http: Flags [S], seq 3353713006, win 64240, options [mss 1460,sackOK,TS val 1461906210 ecr 0,nop,wscale 7], length 0
...

然后在客户端多访问几次 VIP。

参数 -e 会显示以太网帧的 MAC 地址。DR 转发时,你可以观察到客户端发往 VIP 的请求,以及 LVS 将请求帧转发给后端时使用的目标 MAC 地址。

如果要观察响应是否经过 LVS,可以分别在 lb01 和后端服务器上抓包。正常的 DR 模式下,后端返回客户端的响应不会经过 lb01。

d.直观验证:比较响应路径

image-20261010100707293.png

如果客户端能正常访问,但你在 lb01 上看不到响应流量,这反而可能是 DR 模式正常工作的表现;需要结合两端抓包判断,而不是仅凭一处抓包结果下结论。

10、规则于网络配置持久化

a.保存IPVS规则

在lb01上执行:

[root@lb01 ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm

检查服务是否会在启动时恢复规则:

[root@lb01 ~]# systemctl cat ipvsadm
# /usr/lib/systemd/system/ipvsadm.service
[Unit]
Description=Initialise the Linux Virtual Server
After=syslog.target network.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"
ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
ExecStop=/sbin/ipvsadm -C
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

确认规则文件与服务文件中的ipvsadm-restore输入路径一致

b.持久化VIP地址

本次使用的ip addr add只修改运行时网络配置。重启后,VIP会消失

需要根据系统的网络管理方式,将地址持久化:

  • NetworkManager:使用 nmcli 修改对应连接配置。
  • 传统 network-scripts:修改对应网卡配置文件。
  • 后端服务器:确保 10.0.0.5/32 在环回接口上持久存在。

配置持久化时,不要覆盖原有的网络连接配置。

c.持久化ARP参数

我们已经把后端 ARP 设置写入 /etc/sysctl.d/99-lvs-dr.conf,重启后可通过以下命令验证:

sysctl net.ipv4.conf.all.arp_ignore
sysctl net.ipv4.conf.all.arp_announce
d.重启前的检查
  • lb01 的 DIP、VIP 是否正确。
  • 两台后端的 RIP、VIP 是否正确。
  • 后端 ARP 参数是否生效。
  • IPVS 规则是否能够恢复。
  • 客户端能否访问 VIP。
  • 后端默认路由是否能直接到达客户端所在网络。

确认这些条件后,再安排重启测试。

11、常见故障排查

故障现象优先检查
客户端无法访问 VIPVIP 是否配置在 lb01,网络和防火墙是否正常
只有一个后端能响应Nginx 服务、IPVS 后端规则和后端网络
请求直接到后端,没有经过 LVS后端是否错误响应 VIP 的 ARP 请求
请求到达后端,但没有响应后端 VIP、Web 服务、路由及安全策略
后端响应经过了其他网关但到不了客户端后端路由和客户端网络可达性
重启后 LVS 不工作VIP 地址、ARP 参数、IPVS 规则恢复顺序

如果遇到故障,建议先从客户端、lb01、后端三个位置分别抓包,确定请求在哪个环节中断,再修改配置。

12、最后总结:DR模式最重要的三个知识点

1.IPVS使用-g,而不是NAT模式的-m。

2.LVS和后端服务器都配置VIP,但后端必须抑制对VIP的ARP响应

3.请求经过LVS,响应由后端直接返回客户端

DR 模式的性能优势来自响应流量绕过 LVS,而不是因为它不需要任何网络配置。

13、完整数据流

image-20261010103817300.png
image-20261010104120887.png

下一篇:没有了
评论
Mybolg. All Rights Reserved.