LVS/TUN
LVS-Tun模型原理
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
LVS-Tun模型过程
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS 接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时 RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
LVS-Tun模型特性
-
RIP、VIP、DIP全是公网地址
-
RS的网关不会也不可能指向DIP
-
所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
-
不支持端口映射
-
RS的系统必须支持隧道
LVS-Tun模型优点
Director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。
LVS-Tun模型部署
实验环境:
一台Director:server1
版本:Red Hat Enterprise Linux Server release 6.5
单网卡:eth0:172.25.81.1/24
两台RealServer:
Server2:172.25.81.2/24
Server3:172.25.81.3/24
一台Client: 172.25.81.250
实验步骤:
server1配置:
在主机的yum源进行扩展的基础上,安装过ipvsadm
<1>加载ipip模块
[root@server1 ~]# modprobe ipip
在加载好ipip模块查看ip就会有默认的tunl0隧道
<2>添加ip并开启tunl0设备
[root@server1 ~]# ip addr add 172.25.81.100/24 dev tunl0
[root@server1 ~]# ip link set up tunl0
注:该tunl0设备的删除:
[root@server1 ~]# modprobe -r ipip
<3>添加ipvsadm策略
[root@server1 ~]# ipvsadm -A -t 172.25.81.100:80 -s rr ##添加地址为172.25.81.100:80的虚拟服务,指定调度算法为轮循
[root@server1 ~]# ipvsadm -a -t 172.25.81.100:80 -r 172.25.81.2:80 -i ## 添加真实服务器,指定传输模式为隧道模式
[root@server1 ~]# ipvsadm -a -t 172.25.81.100:80 -r 172.25.81.3:80 -i ##添加真实服务器,指定传输模式为隧道模式
真实服务器server2配置:
<1>加载ipip模块
<2>添加ip并开启tunl0设备
[root@server2 ~]# ip addr add 172.25.81.100/24 dev tunl0
[root@server2 ~]# ip link set up tunl0
<3>禁止反向过滤机制
[root@server2 ~]# sysctl -a | grep rp_filter ##需要将以下几项等于1的参数都设置为0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1 ##该项需要修改配置文件/etc/sysctl.conf才能修改
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 1
net.ipv4.conf.tunl0.arp_filter = 0
[root@server2 ~]# sysctl -w net.ipv4.conf.lo.rp_filter=0
[root@server2 ~]# sysctl -w net.ipv4.conf.eth0.rp_filter=0
[root@server2 ~]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
[root@server2 ~]# sysctl -p ##刷新内核参数,使修改生效
[root@server2 ~]# vim /etc/sysctl.conf
[root@server2 ~]# sysctl -p
修改结果:
<4>开启arp策略
<5>开启httpd服务
真实服务器server3配置:
<1>加载ipip模块
<2>添加ip并开启tunl0设备
[root@server3 ~]# ip addr add 172.25.81.100/32 dev tunl0
[root@server3 ~]# ip link set up tunl0
<3>禁止反向过滤机制
[root@server3 ~]# sysctl -a | grep rp_filter ##需要将以下几项等于1的参数都设置为0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1 ##该项需要修改配置文件/etc/sysctl.conf才能修改
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 1
net.ipv4.conf.tunl0.arp_filter = 0
[root@server3 ~]# sysctl -w net.ipv4.conf.lo.rp_filter=0
[root@server3 ~]# sysctl -w net.ipv4.conf.eth0.rp_filter=0
[root@server3 ~]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
[root@server3 ~]# vim /etc/sysctl.conf
[root@server3 ~]# sysctl -p
修改结果:
<4>开启arp策略
<5>开启httpd服务
客户端测试:
调度器调度情况查询: