隧道模式

一.TUNNEL(隧道模式)

1.隧道模式的基本概念

采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户的请求越来越多时,调度器就会处理不过来。
调度器就是把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给用户,所以调度器只处理请求报文。由于一般网络服务响应报文比请求报文大许多,采用TUN技术后,调度器得到极大的解放,集群系统的最大吞吐量可以提高10倍。

2.隧道模式的工作原理

Android 播放 隧道模式 隧道模式如何工作_html

  • IP隧道技术又称为IP封装技术,它可以将带有源和目标IP地址的数据报文使用新的源和目标IP进行二次封装,这样这个报文就可以发送到一个指定的目标主机上。
  • 隧道模式下,调度器和后端服务器组之间使用IP隧道技术。当客户端发送的请求(CIP–>VIP)被director接收后,director修改该报文,加上IP隧道俩端的IP地址作为新的源和目标地址,并将请求转发给后端被选中的一个目标。
  • 当后端服务器接收到报文后,首先解封该报文原有的CIP—>VIP,该后端服务器发现自身的tun接口上配置了VIP,因此接受该数据包。
  • 当请求处理完成后,结果将不会重新交给director,而是直接返回给客户端。此时响应数据包的源IP为VIP,目标IP为CIP。

3.采用隧道模式的基本属性和要求

  • realserver的RIP和director的DIP不用处于同一物理网络中,且RIP必须可以和公网通信。也就是说集群节点可以跨互联网实现。
  • realserver的tun接口上需要配置VIP地址,以便接收director转发过来的数据包,以及作为响应的报文源IP。
  • director转发给realserver时需要借助隧道,隧道外层的IP头部的源IP时DIP,目标IP是RIP,而realserver响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP。
  • director只处理入站请求,响应请求由realserver自己完成。

一般来说,TUN模式会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。

实验环境:
rhel6.5 selinux and iptables disabled

主机环境:

主机名

IP

hetoto1

172.25.12.1

hetoto2

172.25.12.2

hetoto3

172.25.12.3

TUN 模式LVS的配置

配置hetoto1:

  • 添加隧道
  • 隧道添加对外暴露的VIP
  • 隧道激活
[root@hetoto1 ~]# modprobe ipip   ##加载模块

##删除上一个实验绑定的vip,此处可忽略,隧道模式添加网卡
[root@hetoto1 ~]# ip addr del 172.25.12.100/24 dev eth0

[root@hetoto1 ~]# ip addr add 172.25.12.100/24  dev tunl0  ##隧道模式添加网卡
[root@hetoto1 ~]# ip link set up tunl0                     ##隧道模式添加网卡

Android 播放 隧道模式 隧道模式如何工作_IP_02


在hetot1上清除之前的策略重新添加新的策略

[root@hetoto1 ~]# ipvsadm -C   ##清除策略,删除DR模式下的设置
[root@hetoto1 ~]# ipvsadm -A -t 172.25.12.100:80 -s rr    #添加vip,对后端服务器采用rr算法
[root@hetoto1 ~]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.2:80 -i    #添加后端真实服务器hetoto2
[root@hetoto1 ~]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.3:80 -i    #添加后端真实服务器hetoto3
[root@hetoto1 ~]# /etc/init.d/ipvsadm save    ##保存策略

Android 播放 隧道模式 隧道模式如何工作_html_03


Android 播放 隧道模式 隧道模式如何工作_Android 播放 隧道模式_04


配置hetoto2:

  • 添加隧道
  • 隧道添加对外暴露的VIP
  • 隧道激活
[root@hetoto2 html]# modprobe ipip
[root@hetoto2 html]# ip addr del 172.25.12.100/32 dev eth0
[root@hetoto2 html]# ip addr add 172.25.12.100/32 dev tunl0
[root@hetoto2 html]# ip link set up tunl0

Android 播放 隧道模式 隧道模式如何工作_服务器_05


在hetoto2上修改rp_filter参数

[root@hetoto2 html]# sysctl -a |grep rp_filter   ####反向过滤的影响,所以要把与反向过滤有关的都设置为0
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.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

Android 播放 隧道模式 隧道模式如何工作_服务器_06


将参数为1的都改为0

[root@hetoto2 html]# sysctl -w net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.rp_filter = 0
[root@hetoto2 html]# sysctl -w net.ipv4.conf.lo.rp_filter=0
net.ipv4.conf.lo.rp_filter = 0
[root@hetoto2 html]# sysctl -w net.ipv4.conf.eth0.rp_filter=0
net.ipv4.conf.eth0.rp_filter = 0
[root@hetoto2 html]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
net.ipv4.conf.tunl0.rp_filter = 0

Android 播放 隧道模式 隧道模式如何工作_IP_07

[root@hetoto2 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 = 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

Android 播放 隧道模式 隧道模式如何工作_服务器_08


注意:重新加载后,有一个参数始终不为0,需要在文件中修改

[root@hetoto2 html]# sysctl -p   ##重新加载后
[root@hetoto2 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   ####改不了的参数可以在配置文件中修改
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

Android 播放 隧道模式 隧道模式如何工作_IP_09


在配置文件中修改

[root@hetoto2 html]# vim /etc/sysctl.conf 
# Controls source route verification
net.ipv4.conf.default.rp_filter = 0

[root@hetoto2 html]# sysctl -p
[root@hetoto2 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 = 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

Android 播放 隧道模式 隧道模式如何工作_html_10

Android 播放 隧道模式 隧道模式如何工作_服务器_11

为什么要修改这个参数呢?
rp_filter参数用于控制系统是否开启对数据包源地址的校验。

有三个值,0、1、2,具体含义:

  • 0:不开启源地址校验。
  • 1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
  • 2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

配置hetoto3:
和hetoto2上是一样的操作步骤,不再赘述

在hetoto2和hetoto3端开启httpd服务并且在apache的默认发布目录下配置要发布的内容同DR模式相同不再赘述。

真机测试:

Android 播放 隧道模式 隧道模式如何工作_服务器_12