隧道模式原理
ip隧道是一个将ip报文封装到另一个ip报文的技术,这可以使得目标为一个ip地址的数据报文被封装和转发到另一个ip地址。ip隧道技术也成为ip封装技术。
它 和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址(添加新的IP头)。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。IP隧道技术主要用于移动主机和虚拟私有网络 (Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一IP地址,令一端也有唯一的ip地址。
模式图(Client-->VS-->RS-->Client)
步骤
1.客户请求数据包,目标地址VIP(调度器的IP地址)发送到调度器上
2.调度器接收到客户请求包,进行IP Tunnel封装,在原有的包头加上IP Tunnel的包头,然后发送给服务器
3.服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有调度器和服务器之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理
4.响应处理完毕之后,服务器使用自己的出公网的线路,将这个响应数据包发送给客户端,源IP地址还是VIP地址
优缺点
效率:和dr一样。返回的值不经过lvs,所以转发效率比nat快,但是效率不如dr。
最大优点:可以跨网段转发,甚至还可以跨机房转发(必然带来跨机房间的流量,提高成本。另外,RS机房上必然要绑定vip,可能会被防火墙视为ip伪造而进行拦截)
相较于NAT能够解决的问题:采用NAT技术时,由于请求和响应都需要通过调度器进行地址的改写,那么当客户端的请求越来越多的时候,调度器的处理能力就会成为一个瓶颈。为了解决这个问题,调度器通过IP隧道,将客户端的请求通过IP隧道,发送给真实的服务器,服务器处理完请求之后,将响应请求的IP改为调度器的IP,然后将响应报文发送给客户端。
注意事项
RIP,DIP,VIP都是公网地址
RS的网关不能,也不可能指向DIP
RS 的OS必须支持ip隧道,现在只有linux系统支持
实验配置
实验环境:redhat6.5
VS:server4:172.25.254.4 VIP:172.25.254.100
RS:server6:172.25.254.6 VIP:172.25.254.100
RS : server8 : 172.25.254.8 VIP : 172.25.254.100
VS:
[root@server4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPADDR0=172.25.254.4
IPADDR1=172.25.254.100
PREFIX=24
ONBOOT=yes
BOOTPROTO=static[root@server4 ~]# /etc/init.d/network restart
[root@server4 ~]# ipvsadm -C#清除策略
[root@server4 ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@server4 ~]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.6 -i #i表示隧道模式
[root@server4 ~]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.8 -i[root@server4 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr
-> 172.25.254.6:80 Tunnel 1 0 0
-> 172.25.254.8:80 Tunnel 1 0 0
RS:(两台相同的操作)
server6:
[root@server6 ~]# cd /etc/sysconfig/network-scripts/
[root@server6 network-scripts]# modprobe ipip #加载隧道模块生成tunl0,给tunl0添加VIP查看:
[root@server6 ~]# ifconfig -a
tunl0 Link encap:IPIP Tunnel HWaddr
NOARP MTU:1480 Metric:1[root@server6 ~]# cd /etc/sysconfig/network-scripts/
[root@server6 network-scripts]# vim ifcfg-tunl0 添加vip
DEVICE=tunl0
IPADDR=172.25.254.100
NETMASK=255.255.255.0
ONBOOT=yes
NAME=tunl0[root@server6 network-scripts]# /etc/init.d/network restart
配置内核
[root@server6 network-scripts]# vim /etc/sysctl.conf //arp抑制,保证只能从调度器方反映,而不能正常响应
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.rp_filter = 0
临时添加:
[root@server8 network-scripts]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0 临时添加
net.ipv4.conf.tunl0.rp_filter = 0[root@server6 network-scripts]# echo '0'>/proc/sys/net/ipv4/ip_forward //禁用路由转发功能
写发布页面
[root@server6 network-scripts]# cat /var/www/html/index.html
server6'page
测试:
补充:当后台其中一台服务器坏掉,没有影响,自动踢除
调度器的vip可以添加在eth0上,还可以添加在tunl0模块上:
ifconfig tunl0 192.168.14.101 netmask 255.255.255.255 up
为了保证突出tun能后突出可以以直接以外网机器作为服务器,外网的服务器应该处于不同的网段