环境流程图

实验简介

一、实验核心目标

搭建 DR 模式负载均衡架构,通过配置路由器、调度器(vsnode)、客户端、真实服务器(RS1/RS2)的网络参数,实现客户端请求经调度器分发至真实服务器,且真实服务器直接响应客户端(DR 模式核心特征)。

二、核心组网角色及配置要点

  1. 路由器

    • 关闭 ipvsadm 服务并清空规则,配置双网卡(eth0:172.25.254.100、eth1:192.168.0.100);
    • 开启内核 IP 转发功能,配置 SNAT 策略实现不同网段(172.25.254.0/24、192.168.0.0/24)的地址转换与数据转发。
  2. 调度器(vsnode)

    • 配置 eth0 网卡双 IP(192.168.0.200/24、192.168.0.50/24),网关指向路由器(192.168.0.100),作为负载均衡的入口 VIP(192.168.0.200)载体。
  3. 客户端

    • 配置 172.25.254.99 网段地址,验证与调度器 VIP(192.168.0.200)的网络连通性(如 ping 测试)。
  4. 真实服务器(RS1/RS2)

    • 配置基础网络:RS1(192.168.0.10)、RS2(192.168.0.20),网关指向路由器;
    • 关键配置:在回环网卡(lo)绑定调度器 VIP(192.168.0.200/32),并调整 ARP 内核参数(arp_ignore、arp_announce),避免 ARP 广播暴露 VIP,确保 DR 模式下真实服务器仅通过 lo 接口响应 VIP 请求,且不向外宣告 VIP 的 ARP 信息。

三、DR 模式核心逻辑体现

DR 模式的核心是 “调度器仅分发请求,真实服务器直接回包给客户端”:

  • 客户端请求目标为调度器 VIP(192.168.0.200),经路由器转发至调度器;
  • 调度器将请求分发至 RS1/RS2(仅修改数据链路层 MAC 地址,IP 层仍保留 VIP);
  • RS1/RS2 通过 lo 接口识别 VIP 请求并处理,直接通过路由器将响应包返回客户端,无需经调度器转发,提升转发效率。

四、实验关键保障

通过调整 ARP 参数避免 VIP 的 ARP 冲突,通过内核 IP 转发、SNAT 策略实现跨网段通信,通过多网卡 / 多 IP 配置构建 DR 模式所需的网络拓扑,最终验证 DR 模式负载均衡的网络连通性与转发逻辑。

环境设定

router

#在路由器中
[root@router yxs]# systemctl disable --now ipvsadm.service
Removed "/etc/systemd/system/multi-user.target.wants/ipvsadm.service".
[root@router yxs]# vmset.sh eth0 172.25.254.100 router
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:ee:1b:c5 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::23c8:4740:41c3:f9e6/64 scope link tentative noprefixroute 
       valid_lft forever preferred_lft forever
router
[root@router yxs]# vmset.sh eth1 192.168.0.100 router noroute
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:ee:1b:cf brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    altname ens224
    inet 192.168.0.100/24 brd 192.168.0.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::2368:18eb:c683:fc47/64 scope link tentative noprefixroute 
       valid_lft forever preferred_lft forever
router

#设定内核路由功能
[root@router yxs]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@router yxs]# sysctl  -p
net.ipv4.ip_forward = 1

#数据转发策略
[root@router yxs]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100
[root@router yxs]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100

vsnode

[root@vsnode yxs]# vmset.sh  eth0 192.168.0.200 vsnode noroute
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:86:fe:7b brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.200/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5ff5:78f6:3d42:63a8/64 scope link tentative noprefixroute 
       valid_lft forever preferred_lft forever
vsnode
[root@vsnode yxs]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0


[ipv4]
method=manual
address1=192.168.0.50/24
address2=192.168.0.200/24,192.168.0.100

#检测
[root@vsnode yxs]# 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
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@vsnode yxs]# 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:86:fe:7b brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.50/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.200/24 brd 192.168.0.255 scope global secondary noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5ff5:78f6:3d42:63a8/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

client

[root@client yxs]# vmset.sh  eth0 172.25.254.99 client
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:e6:7c:33 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::2120:b1c8:5e57:da3d/64 scope link tentative noprefixroute 
       valid_lft forever preferred_lft forever
client

#检测
[root@client yxs]# ping 192.168.0.200
PING 192.168.0.200 (192.168.0.200) 56(84) 比特的数据。
64 比特,来自 192.168.0.200: icmp_seq=1 ttl=128 时间=0.605 毫秒
64 比特,来自 192.168.0.200: icmp_seq=2 ttl=128 时间=0.523 毫秒

RS1

[root@RS1 yxs]# vmset.sh eth0 192.168.0.10 RS1 noroute
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:d5:22:da brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4deb:3eed:cdbf:2fc8/64 scope link tentative noprefixroute 
       valid_lft forever preferred_lft forever
RS1
[root@RS1 yxs]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS1 yxs]# nmcli connection reload
[root@RS1 yxs]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS1 yxs]# 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
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

#在lo上设定vip
[root@RS1 yxs]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS1 system-connections]# vim 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 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@RS1 system-connections]# 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
    inet 192.168.0.200/32 scope global 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:d5:22:da brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4deb:3eed:cdbf:2fc8/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

 #arp禁止响应
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

RS2

[root@RS2 yxs]# vmset.sh eth0 192.168.0.20 RS2 noroute
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:3a:be:ad brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.20/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ce51:18e8:3ae6:e47e/64 scope link tentative noprefixroute 
       valid_lft forever preferred_lft forever
RS2
[root@RS2 yxs]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS2 yxs]# nmcli connection reload
[root@RS2 yxs]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS2 yxs]# 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
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

#在lo上设定vip
[root@RS2 yxs]# cd /etc/NetworkManager/system-connections/
[root@RS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS2 system-connections]# vim 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@RS2 system-connections]# nmcli connection reload
[root@RS2 system-connections]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@RS2 system-connections]# 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
    inet 192.168.0.200/32 scope global 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:3a:be:ad brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.20/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ce51:18e8:3ae6:e47e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

#arp禁止响应
[root@RS2 system-connections]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 system-connections]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 system-connections]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS2 system-connections]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

检测配置(全主机可达)

router

[root@router yxs]# ping 172.25.254.99
PING 172.25.254.99 (172.25.254.99) 56(84) 比特的数据。
64 比特,来自 172.25.254.99: icmp_seq=1 ttl=64 时间=0.393 毫秒
64 比特,来自 172.25.254.99: icmp_seq=2 ttl=64 时间=0.359 毫秒
^Z
[1]+  已停止               ping 172.25.254.99
[root@router yxs]# ping 192.168.0.200
PING 192.168.0.200 (192.168.0.200) 56(84) 比特的数据。
64 比特,来自 192.168.0.200: icmp_seq=1 ttl=64 时间=0.572 毫秒
64 比特,来自 192.168.0.200: icmp_seq=2 ttl=64 时间=0.273 毫秒
^Z
[2]+  已停止               ping 192.168.0.200
[root@router yxs]# ping 192.168.0.10
PING 192.168.0.10 (192.168.0.10) 56(84) 比特的数据。
64 比特,来自 192.168.0.10: icmp_seq=1 ttl=64 时间=0.434 毫秒
64 比特,来自 192.168.0.10: icmp_seq=2 ttl=64 时间=0.306 毫秒
^Z
[3]+  已停止               ping 192.168.0.10
[root@router yxs]# ping 192.168.0.20
PING 192.168.0.20 (192.168.0.20) 56(84) 比特的数据。
64 比特,来自 192.168.0.20: icmp_seq=1 ttl=64 时间=0.362 毫秒
64 比特,来自 192.168.0.20: icmp_seq=2 ttl=64 时间=0.259 毫秒
^Z
[4]+  已停止               ping 192.168.0.20

vsnode

[root@vsnode yxs]# ping 172.25.254.100
PING 172.25.254.100 (172.25.254.100) 56(84) 比特的数据。
64 比特,来自 172.25.254.100: icmp_seq=1 ttl=64 时间=0.238 毫秒
64 比特,来自 172.25.254.100: icmp_seq=2 ttl=64 时间=0.364 毫秒
^Z
[1]+  已停止               ping 172.25.254.100
[root@vsnode yxs]# ping 172.25.254.99
PING 172.25.254.99 (172.25.254.99) 56(84) 比特的数据。
64 比特,来自 172.25.254.99: icmp_seq=1 ttl=63 时间=0.460 毫秒
64 比特,来自 172.25.254.99: icmp_seq=2 ttl=63 时间=0.580 毫秒
^Z
[2]+  已停止               ping 172.25.254.99
[root@vsnode yxs]# ping 192.168.0.10
PING 192.168.0.10 (192.168.0.10) 56(84) 比特的数据。
64 比特,来自 192.168.0.10: icmp_seq=1 ttl=64 时间=0.469 毫秒
64 比特,来自 192.168.0.10: icmp_seq=2 ttl=64 时间=0.186 毫秒
^Z
[3]+  已停止               ping 192.168.0.10
[root@vsnode yxs]# ping 192.168.0.20
PING 192.168.0.20 (192.168.0.20) 56(84) 比特的数据。
64 比特,来自 192.168.0.20: icmp_seq=1 ttl=64 时间=0.619 毫秒
64 比特,来自 192.168.0.20: icmp_seq=2 ttl=64 时间=0.240 毫秒
^Z
[4]+  已停止               ping 192.168.0.20

client

[root@client yxs]# ping 192.168.0.200
PING 192.168.0.200 (192.168.0.200) 56(84) 比特的数据。
64 比特,来自 192.168.0.200: icmp_seq=1 ttl=128 时间=0.605 毫秒
64 比特,来自 192.168.0.200: icmp_seq=2 ttl=128 时间=0.523 毫秒
^Z
[1]+  已停止               ping 192.168.0.200
[root@client yxs]# ping 172.25.254.100
PING 172.25.254.100 (172.25.254.100) 56(84) 比特的数据。
64 比特,来自 172.25.254.100: icmp_seq=1 ttl=64 时间=0.226 毫秒
64 比特,来自 172.25.254.100: icmp_seq=2 ttl=64 时间=0.245 毫秒
^Z
[2]+  已停止               ping 172.25.254.100
[root@client yxs]# ping 192.168.0.10
PING 192.168.0.10 (192.168.0.10) 56(84) 比特的数据。
64 比特,来自 192.168.0.10: icmp_seq=1 ttl=128 时间=0.412 毫秒
64 比特,来自 192.168.0.10: icmp_seq=2 ttl=128 时间=0.458 毫秒
^Z
[3]+  已停止               ping 192.168.0.10
[root@client yxs]# ping 192.168.0.20
PING 192.168.0.20 (192.168.0.20) 56(84) 比特的数据。
64 比特,来自 192.168.0.20: icmp_seq=1 ttl=128 时间=0.398 毫秒
64 比特,来自 192.168.0.20: icmp_seq=2 ttl=128 时间=0.502 毫秒
^Z
[4]+  已停止               ping 192.168.0.20

RS1

[root@RS1 yxs]# ping 172.25.254.100
PING 172.25.254.100 (172.25.254.100) 56(84) 比特的数据。
64 比特,来自 172.25.254.100: icmp_seq=1 ttl=64 时间=0.221 毫秒
64 比特,来自 172.25.254.100: icmp_seq=2 ttl=64 时间=0.312 毫秒
^Z
[1]+  已停止               ping 172.25.254.100
[root@RS1 yxs]# ping 192.168.0.200
PING 192.168.0.200 (192.168.0.200) 56(84) 比特的数据。
64 比特,来自 192.168.0.200: icmp_seq=1 ttl=64 时间=0.015 毫秒
64 比特,来自 192.168.0.200: icmp_seq=2 ttl=64 时间=0.046 毫秒
^Z
[2]+  已停止               ping 192.168.0.200
[root@RS1 yxs]# ping 172.25.254.99
PING 172.25.254.99 (172.25.254.99) 56(84) 比特的数据。
64 比特,来自 172.25.254.99: icmp_seq=1 ttl=63 时间=0.371 毫秒
64 比特,来自 172.25.254.99: icmp_seq=2 ttl=63 时间=0.502 毫秒
^Z
[3]+  已停止               ping 172.25.254.99
[root@RS1 yxs]# ping 192.168.0.20
PING 192.168.0.20 (192.168.0.20) 56(84) 比特的数据。
64 比特,来自 192.168.0.20: icmp_seq=1 ttl=64 时间=0.351 毫秒
64 比特,来自 192.168.0.20: icmp_seq=2 ttl=64 时间=0.268 毫秒
^Z
[4]+  已停止               ping 192.168.0.20

RS2

[root@RS2 yxs]# ping 172.25.254.100
PING 172.25.254.100 (172.25.254.100) 56(84) 比特的数据。
64 比特,来自 172.25.254.100: icmp_seq=1 ttl=64 时间=0.165 毫秒
64 比特,来自 172.25.254.100: icmp_seq=2 ttl=64 时间=0.233 毫秒
^Z
[1]+  已停止               ping 172.25.254.100
[root@RS2 yxs]# ping 192.168.0.200
PING 192.168.0.200 (192.168.0.200) 56(84) 比特的数据。
64 比特,来自 192.168.0.200: icmp_seq=1 ttl=64 时间=0.017 毫秒
64 比特,来自 192.168.0.200: icmp_seq=2 ttl=64 时间=0.043 毫秒
^Z
[2]+  已停止               ping 192.168.0.200
[root@RS2 yxs]# ping 172.25.254.99
PING 172.25.254.99 (172.25.254.99) 56(84) 比特的数据。
64 比特,来自 172.25.254.99: icmp_seq=1 ttl=63 时间=0.633 毫秒
64 比特,来自 172.25.254.99: icmp_seq=2 ttl=63 时间=0.374 毫秒
^Z
[3]+  已停止               ping 172.25.254.99
[root@RS2 yxs]# ping 192.168.0.10
PING 192.168.0.10 (192.168.0.10) 56(84) 比特的数据。
64 比特,来自 192.168.0.10: icmp_seq=1 ttl=64 时间=0.227 毫秒
64 比特,来自 192.168.0.10: icmp_seq=2 ttl=64 时间=0.318 毫秒
^Z
[4]+  已停止               ping 192.168.0.10

更多推荐