LVS DR 模式详解

1,953 阅读7分钟

ARP

ARP协议是网络层(IP层)和链路层(MAC层)之间的桥梁,它使得网络层可以只关心IP地址,而不需要关心底层的硬件地址。

  1. 广播ARP请求:当一台设备(例如,PC A)想要与另一台设备(例如,PC B)通信时,它首先会发送一个ARP请求。这个请求是一个广播,意味着它会发送到局域网中的所有设备。请求中包含PC A的IP地址和MAC地址,以及它想要查询的PC B的IP地址。
  2. 接收并响应:局域网中的所有设备都会接收到这个ARP请求,但只有PC B会响应。PC B检查请求中的目标IP地址是否与其自己的IP地址匹配。如果匹配,它会发送一个ARP响应给PC A。这个响应包含PC B的IP地址和MAC地址。
  3. 更新ARP缓存:当PC A收到PC B的ARP响应后,它会将PC B的IP地址和MAC地址存储在其ARP缓存中。这样,下次当PC A想要与PC B通信时,它可以直接从ARP缓存中获取MAC地址,而不需要再次发送ARP请求。
  4. 超时机制:ARP缓存中的条目有一个超时时间。如果在这个时间内没有再次使用某个条目,那么它会被从缓存中删除。这是为了确保缓存中的信息是最新的

下图是PC1访问PC2的过程:源ip不变,mac地址在变 image.png

DR模式是什么

直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN

模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。

DR模式只是针对源和目标MAC地址做出修改源和目标IP还是不变,当请求报文由LVS服务器处理后发送到后端服务器RS上,RS拆封报文时会发现目标MAC是自己的MAC地址.

服务器配置

问题1客户端拒绝接收请求

目标IP是VIP,与本地IP地址不符合,那么RS就会认为不是发给自己的报文,所以此时需要在RS上配置VIP,这样RS就可以接受目标地址为VIP的请求报文了。

image.png

如果将VIP设置在RS的网卡上,假设有多台RS并且每台RS上都配置了VIP,在这个网络中发出VIP的ARP请求,就有多个RS响应,因此就把VIP配置到回环地址lo网卡上,然后让lo网卡忽略所有ARP请求,eth33网卡正常响应ARP请求,这样网络中就不会收到RS关于VIP的响应

问题2地址冲突

如果设置多个VIP那么地址会冲突,客户端发送请求,在这个网络中发出VIP的ARP请求,就有多个RS响应

image.png

那么就要关闭rs vip的响应,就是rs 收到客户端请求时不回应

搭建LVS DR模式实验

实验架构 环境简介 DR 服务器:192.168.10.10

web 服务器1:192.168.10.20

web 服务器2:192.168.91.30

vip(虚拟回环):192.168.10.188

客户端:192.168.10.1

image.png

配置负载调度器

systemctl stop firewalld.service
setenforce 0


[root@localhost ~]#yum install ipvsadm.x86_64 -y
#安装服务

#配置虚拟IP地址(VIP:192.168.91.188)

[root@localhost network-scripts]#cp ifcfg-ens33 ifcfg-ens33:0
#配置虚拟网卡,若为隧道模式ifcfg-tunl0
[root@localhost network-scripts]#vim ifcfg-ens33:0
#删除dns与网关,注意子网

image.png

[root@localhost network-scripts]#systemctl restart network
[root@localhost network-scripts]#ifup ifcfg-ens33:0
#启动网卡
[root@localhost network-scripts]#ifconfig ifcfg-ens33:0


#调整/proc响应参数
[root@localhost network-scripts]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

image.png

[root@localhost network-scripts]#sysctl -p
#刷新配置
#调整/proc响应参数  对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能

#配置负载分配策略
[root@localhost ~]#modprobe ip_vs
[root@localhost ~]#cat /proc/net/ip_vs
#加载模块
[root@localhost network-scripts]#ipvsadm-save >/etc/sysconfig/ipvsadm
[root@localhost network-scripts]#systemctl start ipvsadm.service
[root@localhost network-scripts]#ipvsadm -C
[root@localhost ~]#ipvsadm -A -t 192.168.10.188:80 -s rr
ipvsadm -a -t 192.168.10.188:80 -r 192.168.10.20:80 -g
ipvsadm -a -t 192.168.10.188:80 -r 192.168.10.30:80 -g
#添加真实服务器-a  指定VIP地址及TCP端口-t   指定RIP地址及TCP端口 -r 指定DR模式-g
  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.10.188:80 rr
  -> 192.168.10.20:80             Route   1      0          0         
  -> 192.168.10.30:80             Route   1      0          0     
[root@localhost network-scripts]#ipvsadm-save >/etc/sysconfig/ipvsadm
#保存设置

sr1配置

[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum install httpd -y
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#cp ifcfg-lo ifcfg-lo:0
[root@localhost ~]#ifconfig lo:0 192.168.91.188/32
[root@localhost ~]#ifconfig lo:0 192.168.91.188 255.255.255.255
[root@localhost network-scripts]#vim ifcfg-lo:0
#修改回环网卡名,IP地址,子网掩码
DEVICE=lo:0
IPADDR=192.168.91.188
NETMASK=255.255.255.255
NETWORK=127.0.0.0
[root@localhost network-scripts]#route add -host 192.168.91.188 dev lo:0
#设置路由
[root@localhost network-scripts]#route -n
#开机执行命令,或者写入 /etc/profile 文件
[root@localhost network-scripts]#vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.91.188 dev lo:0
[root@localhost network-scripts]#chmod +x /etc/rc.d/rc.local
[root@localhost network-scripts]#ll /etc/rc.d/rc.local 
-rwxr-xr-x. 1 root root 484 11月 17 16:56 /etc/rc.d/rc.local

[root@localhost network-scripts]#vim /etc/sysctl.conf 
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@localhost network-scripts]#sysctl -p
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

  1. net.ipv4.conf.all.arp_ignore = 1

    • all 表示这些设置应用于所有网络接口。
    • arp_ignore = 1 表示只回应目标IP地址是本地接收接口上的IP地址的ARP请求。

    这个设置通常用于防止网络接口响应不属于其IP地址的ARP请求,从而增强网络安全性。

  2. net.ipv4.conf.all.arp_announce = 2

    • arp_announce = 2 表示总是使用最佳的本地IP地址作为ARP请求的源IP地址,即使这个IP地址不是绑定在接收ARP请求的网络接口上。

    这个设置通常用于避免在具有多个网络接口的系统上发送错误的ARP公告。

  3. net.ipv4.conf.default.arp_ignore = 1

    • default 表示这些设置应用于没有明确配置的其他网络接口。
    • all设置相同,这表示只回应目标IP地址是本地接收接口上的IP地址的ARP请求。
  4. net.ipv4.conf.default.arp_announce = 2

    • all设置相同,这表示总是使用最佳的本地IP地址作为ARP请求的源IP地址。
  5. net.ipv4.conf.lo.arp_ignore = 1

    • lo 表示这些设置应用于本地回环接口(loopback interface)。
    • 由于本地回环接口通常不用于与其他机器通信,所以这个设置可能不是必需的,但在这里设置通常是为了保持一致性。
  6. net.ipv4.conf.lo.arp_announce = 2

    • lo接口的arp_ignore设置相同,这通常是为了保持配置的一致性。然而,由于本地回环接口通常不参与ARP过程,所以这个设置的实际效果可能很小。

rs2配置

[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum install httpd -y
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#cd /etc/sysconfig/network-scripts/

#修改回环网卡名,IP地址,子网掩码
DEVICE=lo:0
IPADDR=192.168.91.188
NETMASK=255.255.255.255
NETWORK=127.0.0.0
[root@localhost network-scripts]#route add -host 192.168.91.188 dev lo:0
#设置路由
[root@localhost network-scripts]#route -n
#开机执行命令,或者写入 /etc/profile 文件
[root@localhost network-scripts]#vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.91.188 dev lo:0
[root@localhost network-scripts]#chmod +x /etc/rc.d/rc.local
[root@localhost network-scripts]#ll /etc/rc.d/rc.local 
-rwxr-xr-x. 1 root root 484 11月 17 16:56 /etc/rc.d/rc.local

[root@localhost network-scripts]#vim /etc/sysctl.conf 
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@localhost network-scripts]#sysctl -p
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

然后在rs上写页面验证 image.png

调度器无法调度自己

image.png

总结

DR模式的特点:

不支持端口映射 RS和DS必须在同一网络(不是同一网段)

DR工作在数据链路层使用的是MAC地址,还没有牵扯到IP地址

IP地址始终不变,变的是MAC地址

lo是回环接口(和自己进行交流的时候用,使用起来快),系统里服务和服务之间使用的回环接口,效率高,快

它工作在4层,不支持7层规则修改

调度器无法调度自己