前情提要:本次实验均通过虚拟机模拟生产环境中的情况,通过本篇博客你可以学习到LVS-DR模式的原理,架构,数据传输逻辑和过程,环境配置和LVS-DR的部署实现过程。使用系统为RHEL9.3。
一、实验环境
1.1 DR模式原理图

注:图片来源:Virtual Server via Direct Routing
DR模式原理详解:
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
DR模式数据逻辑:
在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vip
DR模式数据传输过程:
1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端的MAC+VIP+RS1的MAC
3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
1.2 实验主机架构

注意:图中仅为架构图,仅为了展示了各个主机之间的连接情况,IP地址请见主机配置清单,别看架构图的
1.3 实验主机配置清单
分别有5台主机,分别有客户机client(模拟客户访问),路由器router(连接客户和服务器内网),调度器vsnode(分发客户访问请求),两台后台服务主机RS1、RS2(真正提供服务的主机)
对应的IP地址配置清单如下
- 客户端,一张NAT网卡,IP地址为172.25.254.99/24(CIP)
- 路由器,一张NAT网卡,IP地址为172.25.254.100/24(客户端网关),一张仅主机网卡,IP地址为192.168.0.100/24(服务内网网关)
- vsnode调度器,一张仅主机网卡,IP地址为192.168.0.50/24(DIP),一张回环网卡,除回环地址外额外配置一个IP地址192.168.0.200/32(VIP)
- RS1服务主机,一张仅主机网卡,IP地址为192.168.0.10/24(RIP),一张回环网卡,除回环地址外额外配置一个IP地址192.168.0.200/32(VIP),并且禁止arp响应
- RS2服务主机,一张仅主机网卡,IP地址为192.168.0.20/24(RIP),一张回环网卡,除回环地址外额外配置一个IP地址192.168.0.200/32(VIP),并且禁止arp响应
注意:由于服务主机不能对VIP进行响应,不然当客户端访问VIP时如果服务器越过调度器响应了访问VIP的请求,导致内网穿透,调度器直接失去作用,所以两个服务器主机需要禁止arp响应。
二、实验环境配置流程,命令+详解
2.1 客户主机client配置
1、配置客户机网络信息
首先在硬件方面需要将网卡设置为NAT模式

然后根据配置清单配置IP地址,网关
bash
[root@client ~]# vmset.sh eth0 172.25.254.99 client noroute
[root@client ~]# nmcli connection modify eth0 ipv4.gateway 172.25.254.100
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@client ~]# ip a
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:7f:85:ef brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 172.25.254.99/24 brd 172.25.254.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::2360:d7ac:9af2:bb39/64 scope link noprefixroute
valid_lft forever preferred_lft forever

注意:vmset.sh为博主自行编写的网卡配置脚本文件,实现的结果为配置eth0网卡IP地址为172.25.254.99/24,配置了主机名为client,然后不配置路由。然后后续命令是配置了网关为架构中的路由器的NAT网卡的IP地址。如果自己不会编写脚本来修改网卡配置,则可以通过修改网卡链接文件来达成配置。以下将介绍通过修改网卡链接文件来达成配置
bash
[root@client ~]# cd /etc/NetworkManager/system-connections/
[root@client system-connections]# ls
eth0.nmconnection
[root@client system-connections]# vim eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.99/24,172.25.254.100
method=manual
[root@client system-connections]# nmcli connection reload
[root@client system-connections]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)

后续的网络配置均可以通过该方法实现,需要注意的是修改完链接文件后需要重新加载和激活网络。
2.2 路由器主机router配置
1、配置路由器网络
首先配置网卡,需要两块网卡,一块设置为NAT模式,一块设置为仅主机模式

然后配置各个网卡的IP地址等信息
bash
[root@Router ~]# ls /etc/NetworkManager/system-connections/
eth0.nmconnection eth1.nmconnection
[root@Router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=172.25.254.100/24,172.25.254.2
dns=8.8.8.8;
[root@Router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
method=manual
address1=192.168.0.100/24
2、开启内核路由功能
先查看内核路由开关,第一个就是内核路由,默认关闭状态
bash
[root@Router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

然后编写/etc/sysctl.conf文件,实现永久修改内核参数
bash
[root@Router ~]# echo net.ipv4.ipforward=1 >> /etc/sysctl.conf
[root@Router ~]# sysctl -p
net.ipv4.ip_forward = 1
3、配置数据转发策略
bash
[root@Router ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100
[root@Router ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
2.3 调度器主机vsnode配置
1、配置网络信息
硬件方面,网卡需要一张仅主机网卡(回环网卡为系统自带的虚拟网卡)

根据清单配置IP地址
bash
[root@vsnode ~]# ls /etc/NetworkManager/system-connections/
eth0.nmconnection lo.nmconnection
[root@vsnode ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.0.50/24,192.168.0.100
[root@vsnode ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.200/32
[root@vsnode ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 30 0 0 lo
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
2.4 服务主机RS1/RS2配置
此处仅展示RS1配置流程,RS2与RS1同理
1、配置网络信息
硬件方面需要一张仅主机网卡

bash
[root@RS1 ~]# ls /etc/NetworkManager/system-connections/
eth0.nmconnection lo.nmconnection
[root@RS1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=7ba00b1d-8cdd-30da-91ad-bb83ed4f7474
type=ethernet
interface-name=eth0
timestamp=1768906215
[ethernet]
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
[ipv6]
addr-gen-mode=default
method=auto
[proxy]
[root@RS1 ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=192.168.0.200/32
method=manual
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 30 0 0 lo
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
2、禁止arp响应
先查找该内核参数
bash
[root@RS1 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.default.arp_ignore = 0
net.ipv4.conf.eth0.arp_ignore = 0
net.ipv4.conf.lo.arp_ignore = 0
[root@RS1 ~]# sysctl -a | grep arp_ann
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.default.arp_announce = 0
net.ipv4.conf.eth0.arp_announce = 0
net.ipv4.conf.lo.arp_announce = 0
然后配置/etc/sysctl.conf文件实现永久修改内核参数
bash
[root@RS1 ~]# echo net.ipv4.conf.all.arp_ignore=1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_ignore=1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.all.arp_announce=2 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_announce=2 >> /etc/sysctl.conf
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
2.5 环境检测
以上流程已经完成了环境的配置,需要测试环境是否符合预期,要求各个主机之间互相ping,都能ping通说明环境配置正确,没有问题。
client主机

router主机

vsnode主机

RS1,RS2同理

综上,检查完毕发现所有主机间均可互通,可见环境配置没有问题。
三、RS1/RS2服务配置
本次实验以apache搭建服务进行测试,生产环境中后台的服务器应当配置一样的服务,但是此处为了体现LVS的请求调度的效果,会给RS1和RS2的测试网页页面写入不同的内容。
3.1 服务配置
1、RS1/RS2均安装apache并启动服务
bash
[root@RS1 ~]# dnf install httpd -y ; systemctl enable --now httpd
2、RS1服务配置
bash
[root@RS1 ~]# echo RS1-192.168.0.10 > /var/www/html/index.html
3、RS2服务配置
bash
[root@RS2 ~]# echo RS2-192.168.0.20 > /var/www/html/index.html
4、服务可用性测试
bash
[root@client ~]# curl 192.168.0.10
RS1-192.168.0.10
[root@client ~]# curl 192.168.0.20
RS2-192.168.0.20

可见服务可以正常访问,服务端配置没有问题
四、vsnode调度器配置LVS策略
4.1 LVS软件下载
LVS的管理软件如下,vsnode调度器上需要安装该软件才能实现对LVS的管理和配置
bash
[root@vsnode ~]# dnf search ipvsadm
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:5 days, 15:56:07 前,执行于 2026年01月20日 星期二 17时52分59秒。
================================================== 名称 精准匹配:ipvsadm ===================================================
ipvsadm.x86_64 : Utility to administer the Linux Virtual Server
[root@vsnode ~]# dnf install ipvsadm.x86_64 -y
4.2 LVS转发策略配置
安装完软件后就可以开始配置LVS转发策略了,以下命令配置了LVS转发算法为rr(轮询),实现的转发结果应为RS1/RS2轮流接收访问请求
bash
[root@vsnode ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
[root@vsnode ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
4.3 测试LVS转发策略
使用客户机进行访问测试
bash
[root@client ~]# for i in {1..10};do curl 192.168.0.200;done
RS1-192.168.0.10
RS2-192.168.0.20
RS1-192.168.0.10
RS2-192.168.0.20
RS1-192.168.0.10
RS2-192.168.0.20
RS1-192.168.0.10
RS2-192.168.0.20
RS1-192.168.0.10
RS2-192.168.0.20
可见请求分发与预期一致,LVS配置没有问题
4.4 LVS转发策略持久化
目前为止的LVS策略配置都是重启就会失效的,如果想将LVS转发策略持久化需要进行以下操作
bash
[root@vsnode ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@vsnode ~]# systemctl enable --now ipvsadm
测试是否实现持久化
bash
[root@vsnode ~]# reboot
[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
可见重启后策略依然存在
综上,至此LVS-DR模式实验全部完成,成功实现了LVS的DR模式的访问请求转发。