LVS-DR模式实验配置及原理详解

前情提要:本次实验均通过虚拟机模拟生产环境中的情况,通过本篇博客你可以学习到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模式的访问请求转发。

相关推荐
好好学习啊天天向上6 小时前
C盘容量不够,python , pip,安装包的位置
linux·python·pip
li_wen017 小时前
文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
大数据·linux·数据库·文件系统·jffs2
wypywyp7 小时前
2.虚拟机一直显示黑屏,无法打开,可能是分配的硬盘空间不够
linux·运维·服务器
SongYuLong的博客7 小时前
TL-WR710N-V2.1 硬改刷机OpenWRT源码编译固件
linux·物联网·网络协议
AlfredZhao7 小时前
Docker 快速入门:手把手教你打包 Python 应用
linux·docker·podman
HIT_Weston8 小时前
107、【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(三)
linux·javascript·ubuntu
艾莉丝努力练剑9 小时前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法
chinesegf9 小时前
Ubuntu 安装 Python 虚拟环境:常见问题与解决指南
linux·python·ubuntu
crownyouyou10 小时前
Ubuntu输入法使用回车键后字符间距异常的问题
linux·运维·ubuntu