优势:
- 负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。
- 若LB跑在公网上,就能对不同地域(局域网)的RS进行请求调度。
工作过程:
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
- RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己tunl0接口上的VIP,所以会处理次请求报文,并将响应报文通过tunl0接口送给eth0网卡直接发送给客户端。(在这里,内核参数rp_filter和arp_filter设置为0起了很大作用)
实践操作:
1. 实验环境
server1 web1 IP: 172.25.254.1
server2 web2 IP:172.25.254.2
server3 LB IP:172.25.254.3
foundation13 client IP:172.25.254.250
2. client 上搭建网络yum源(有点不合理,实验环境限制):
3. 在LB上加入IP隧道需要的模块 ipip:
modprobe 命令用于在linux系统中载入指定的模块。
Linux系统内核实现的IP隧道技术主要有三种:ipip、gre、sit ;这三种隧道技术都需要内核模块 tunnel4.ko 的支持。
ipip 需要内核模块 ipip.ko ,该方式最为简单!但是你不能通过IP-in-IP隧道转发广播或者IPv6数据包。你只是连接了两个一般情况下无法直接通讯的IPv4网络而已。
4. 在LB上创建一个虚拟TUN网卡接口:ip addr add 172.25.254.100/24 dev tunl0
打开该接口的状态: ip link set up tunl0
5. 在LB上配置虚拟服务器相关:
首先配置为LVS工作的虚拟IP和LVS的轮询方式:ipvsadm -A -t 172.25.254.100:80 -s rr
再配置调度的真实服务器的地址和端口以及工作的模式,这里-i表示以IP隧道的模式工作:
6. 在两台web服务器上配置虚拟接口:tunl0
server1上的配置:
server2上的配置:
7. 在web服务器上配置内核参数rp_filter和arp_filter:
之前我们在做LVS的DR模式的实验中了解了内核参数arp_ignore和arp_announce,这两个内核参数中,arp_announce用来控制arp请求报文的,arp_ignore是用来控制响应报文的; 这里的arp_filter也是用来控制arp的响应报文的;而rp_filter则和IP数据包的响应有关。下面是rp_filter参数的一些信息介绍:
rp_filte的作用: 用于控制系统是否开启对数据包源地址的校验。
rp_filter参数有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不通,则直接丢弃该数据包。
arp_filter参数有两个值:0、1,含义如下:
0: 内核接口可回复接收到的目标IP为其它接口IP地址的arp请求。看起来这样是错误的,但是通常还是有道理的,因为增加了正常通信的几率。在Linux看来,系统拥有所有配置的IP地址,而不是某个特定端口。只是在复杂的配置情况下,比如负载均衡,才会产生问题。
1:允许系统中多个网络接口工作在相同的网段,在回复某一接口收到的arp请求时,内核根据能否路由源地址为请求的目标IP的数据包,从此接口发出来,决定是否回复arp(通过源IP地址查询出口路由实现)。换句话说,可控制哪个网卡回复arp请求。
现在,我们先看web服务器中该参数的情况:
这里我们的tunl0网络接口是虚拟接口,为了提供通信成功的可能性,我们将参数为1的都设置为0:
这里介绍修改过程要用到的命令:
sysctl -w ## 直接将修改的参数写入到内存
sysctl -p ## 将/etc/sysctl.conf文件的信息刷新到内存
我们这里用直接写入内存的方式:
当然,你也可以修改配置文件,然后刷新到内存。 不同之处在于前一种关机后会失效,第二种则会永久生效。
在server2上做相同的操作:
8. 开启servre1和server2上的httpd服务:
9. 测试LB上的ipvs是否配置成功:
10. 因为实验环境web服务器和LB在一个局域网中,为了只让LB接收client的http请求,故在server1和server2上配置arp抑制:
11. 测试:在client上访问web服务器