Linux运维之LVS实现负载均衡的IP-tun(IP隧道)模式
一、LVS—tun模式介绍及工作原理
IP隧道-IP
IP隧道(IP封装)是一种将IP数据报封装到IP数据报中的技术,它允许将预定IP地址的数据报包装并重定向到另一个IP地址,IP封装技术目前通常被地用在外联网,移动IP,IP广播,隧道式主机。
IP隧道的原理
首先,让我们通过下图了解虚拟主机的IP隧道原理,虚拟主机IP隧道模式与虚拟主机NAT模式最大的不同就是前者是负载均衡器通过IP隧道将请求发送给实服务器,而后者则是通过网络地址翻译将请求发送给实服务器。
当用户访问由服务器集群提供的虚拟服务时,一个包含有虚拟主机地址的数据包到达。负载均衡器检查数据包中的目标地址和端口,如果和虚拟服务的地址和端口相匹配,则通过连接调度算法选择一个实服务器,并将此连接添加进记录连接的Hash表中,然后,负载均衡器将源IP地址封装到数据包中并发送给所选择的实服务器。当该连接上的一个数据包到达,并且该连接仍然在Hash表中,则该数据包仍然会以相同的方式被封装并发送给该实服务器。当实服务器接收到封装过的包,首先解包,然后处理该请求,最后通过自己的路由表将应答直接返回给用户。在连接断开或超时后,连接记录将从Hash表中删除。
下图说明了该流程。
注意,实服务器可以是任何网络的任何IP地址,它们可以分布在任意的地理位置,但是必须支持IP封包协议,并且将隧道设备全部配置为启用,以便能够正确地对接收的封装过的包进行解包,并且虚拟IP地址必须配置为不响应ARP,或者系统能被配置为可将数据包从虚拟地址重定到本地socket。
最后,当一个封装过的包到达,实服务器解包,并发现该包的目标地址是虚拟地址,表明“噢,这是我的菜,我来搞定。”它处理该请求然后将请求结果直接返回给用户端。
该原理来自于: 架构师成长营——LVS负载均衡之虚拟主机IP隧道模式
二、IP-tun(IP隧道)模式搭建
搭建前提:
我们先清除上一节配置DR模式用ipvsadm写的调度规则。
/etc/init.d/ldirectord stop
ipvsadm -l
ipvsadm -C #清除规则
1、加载隧道模块(server1、server2、server3)
modprobe ipip
ip addr show #会出现tunl0
2、给tunl0添加ip,并立即**(负载均衡器server1)
ip addr del 172.25.75.100/24 dev eth0 #清除网卡eth0的IP
ip addr add 172.25.75.100/24 dev tunl0 #将IP添加到tunl0网卡
ip addr show #查看网卡信息
ip link set up tunl0 #启动网卡
3、给tunl0添加ip,并立即**(私有网段【server2、server3】)
ip addr del 172.25.75.100/24 dev eth0 #清除网卡eth0的IP
ip addr add 172.25.75.100/24 dev tunl0 #将IP添加到tunl0网卡
ip addr show tunl0 #查看网卡信息
ip link set up tunl0 #启动网卡
4、编写新策略在负载均衡器server1
ipvsadm -A -t 172.25.75.100:80 -s rr #添加vip,对后端服务器采用rr算法
ipvsadm -a -t 172.25.75.100:80 -r 172.25.75.2:80 -i #添加后端真实服务器server2
ipvsadm -a -t 172.25.75.100:80 -r 172.25.75.3:80 -i
ipvsadm -L ##查看策略
/etc/init.d/ipvsadm save ##保存策略
5、关闭内核反向过滤功能(server2、server3)
sysctl -a | grep rp_filter #查看参数状态
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.lo.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
sysctl -a | grep rp_filter
为什么要修改rp_filter参数呢?
有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
注意: 重新保留时,有些参数设置会自动返回1,只要保证tunl0为0时就可以。
6、测试
在客户端上:
curl 172.25.75.100
成功实现负载均衡。
我们可以在负载均衡器server1上查看此时的调度器状态:
ipvsadm -l