我们lvs的nat模式,所有的数据包都要经过调度器,这样会因为调度器的问题造成瓶颈。因此,我们想能不能让调度器仅承担接收数据请求和更加调度算法选择后端服务器的功能,而我们的数据回复直接由服务器发给用户。是可以的,我们的TUN隧道模式就可实现该功能。
TUN隧道模式简介: VS/TUN工作模式拓扑结构如下图所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fe07/4aa/c5b8d75f0d8199f9.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MzE2OA==,size_16,color_FFFFFF,t_70)
原理图
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fe07/4aa/93885be84a5c5b23.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MzE2OA==,size_16,color_FFFFFF,t_70)
部署: vs(server1):
添加隧道
隧道添加对外暴露的VIP
隧道激活
添加策略
[root@server1 ~]# ipvsadm -C ##清除策略
[root@server1 ~]# ipvsadm -A -t 172.25.254.100:80 -s rr #添加vip,对后端服务器采用rr算法
[root@server1 ~]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -i #添加后端真实服务器server2
[root@server1 ~]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -i #添加后端真实服务器server3[root@server1 ~]# /etc/init.d/ipvsadm save ##保存策略
rs(serevr2和server3):
modprobe ipip #导入模块
ip addr add 172.25.17.100/32 dev tunl0 #添加隧道ip
ip link set up tunl0 #激活隧道
ip a #查看
rp_filter参数用于控制系统是否开启对数据包源地址的校验。
注意:仅仅做这些配置是无法正确测试的,因为我们的防火墙开启了反向过滤功能只有当进来和出去的报文的ip相同才允许通过,否则丢弃。为了实验效果,我们进行如下配置。
[root@server2 ~]# sysctl -a | grep rp_filter
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.eth1.rp_filter = 1
net.ipv4.conf.eth1.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 1
net.ipv4.conf.tunl0.arp_filter = 0
我们需要将参数的值全部改为0
修改参数的作用: 有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
#将参数为1的都改为0
[root@server2 html]# sysctl -w net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.rp_filter = 0
[root@server2 html]# sysctl -w net.ipv4.conf.lo.rp_filter=0
net.ipv4.conf.lo.rp_filter = 0
[root@server2 html]# sysctl -w net.ipv4.conf.eth0.rp_filter=0
net.ipv4.conf.eth0.rp_filter = 0
[root@server2 html]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
net.ipv4.conf.tunl0.rp_filter = 0[root@server2 html]# sysctl -p ##重新加载后
[root@server2 html]# sysctl -a |grep rp_filter
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1 ##始终不为0,则这个需要在文件中改
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.tunl0.arp_filter = 0##在文件中修改
[root@server2 html]# vim /etc/sysctl.conf
#Controls source route verification
net.ipv4.conf.default.rp_filter = 0[root@server2 html]# sysctl -p
再次查看,全部改为0了。
[root@foundation68 ~]# curl 172.25.254.100
server3.example.com
[root@foundation68 ~]# curl 172.25.254.100
server2.example.com
[root@foundation68 ~]# curl 172.25.254.100
server3.example.com