一、LVS的TUN模式说明
1.1 IP隧道技术
1.2 LVS中使用IP隧道
1.3 LVS中IP隧道(封装与解封装)流程
二、实验环境说明
2.1 网络环境构建
2.2 服务器信息
2.3 ensp配置信息截图
三、LVS的TUN模式配置
3.1 检查ipvs模块是否安装
3.2 确定IPIP模块是否安装
3.3 IPVS规则脚本
3.4 Realserver服务器配置
3.5 内核参数rp_filter说明
四、实验结果验证
4.1 ensp客户端访问验证
4.2 抓包验证是否通过ipip隧道(封装和解封装的过程)
五、网上找的数据包走向图
六、总结
七、三个模式比较
通过实验来理解LVS的三种工作模式
一、LVS的TUN模式说明
Virtual Server via IP Tunneling(VS/TUN)
官网链接:http://www.linux-vs.org/VS-IPTunneling.html
1.1 IP隧道技术
隧道技术:实际上是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程。(隧道技术使一种点对点链接,因而必须在两端配置隧道协议)。
移动IPv4主要有三种隧道技术: IP in IP、最小封装以及通用路由封装。
IP-in-IP(IPIP)技术:是将一个IP报文封装在另一个IP报文中的过程。这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机、虚拟私有网络(Virtual Private Network)、IP多播,在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
Linux系统内核实现的IP隧道技术:主要有三种(PPP、PPTP和L2TP等协议或软件不是基于内核模块的):ipip、gre、sit这三种隧道技术都需要内核模块tunnel4.ko 的支持。
1.2 LVS中使用IP隧道
首先,让我们看一下通过IP隧道传输的虚拟服务器的示意图。通过IP隧道的虚拟服务器与通过NAT的虚拟服务器的最大不同之处在于:负载均衡器通过IP隧道向真实服务器发送请求,而NAT模式是通过网络地址转换向真实服务器发送请求。
处理过程:
- 当用户访问服务器群集提供的虚拟服务时,到达虚拟IP地址(虚拟服务器的IP地址)的数据包到达。
- 负载平衡器检查数据包的目标地址和端口。如果它们与虚拟服务匹配,则根据连接调度算法从群集中选择一个真实服务器,并将该连接添加到记录连接的哈希表中。
- 然后负载平衡器将数据包封装在IP数据报中,并将其转发到所选的服务器。当传入的数据包属于此连接,并且可以在哈希表中找到所选的服务器时,该数据包将再次封装并转发到该服务器。
- 当服务器收到封装的数据包时,它将对数据包进行解封装并处理请求,最后根据自己的路由表将结果直接返回给用户。
- 连接终止或超时后,连接记录将从哈希表中删除。
1.3 LVS中IP隧道(封装与解封装)流程
请注意,真实服务器可以在任何网络中具有任何真实IP地址,可以在地理位置上分布,但是它们必须支持IP封装协议。它们的隧道设备都已配置完毕,以便系统可以正确地解封装收到的封装数据包,并且必须配置在非arp设备或非arp设备的任何别名上,或者可以将系统配置为将的数据包重定向到本地套接字(就是APR抑制的问题)
最后,当封装的数据包到达时,真实服务器将其解封装并发现该数据包发往,它说:“哦,是给我的,所以我来做。”,它处理请求并最后将结果直接返回给用户。
二、实验环境说明
2.1 网络环境构建
实验环境ensp模拟网络,并桥接到vmware的3个网络(桥接、host-only、NAT)
2.2 服务器信息
服务器 | IP地址 | 软件信息 | 系统版本 |
shanghai | 192.168.1.183 tunl0:192.168.48.200 | nginx | CentOS7.4 |
beijing | 192.168.10.182 tunl0:192.168.48.200 | nginx | CentOS7.4 |
lvs01 | 192.168.48.181 tunl0:192.168.48.200 | lvs | CentOS7.4 |
总部测试客户端 | 192.168.48.100 | ensp的http客户端模拟 |
2.3 ensp配置信息截图
上海桥接配置如图:(这里只举例上海,其他成都总部、杭州服务器配置请参考)
总部测试端配置如图:
模拟公网环境路由器配置如图:
interface GigabitEthernet0/0/0 ip address 192.168.1.254 255.255.255.0 #interface GigabitEthernet0/0/1 ip address 192.168.10.254 255.255.255.0 #interface GigabitEthernet2/0/0 ip address 192.168.48.254 255.255.255.0
三、LVS的TUN模式配置
3.1 检查ipvs模块是否安装
1)模块已经安装[root@lvs01 ~]# lsmod |grep ip_vsip_vs_wrr 12697 0 ip_vs_wlc 12519 0 ip_vs_sh 12688 0 ip_vs_sed 12519 0 ip_vs_rr 12600 0 ip_vs_pe_sip 12697 0 nf_conntrack_sip 33860 1 ip_vs_pe_sipip_vs_lc 12516 0 ip_vs_lblcr 12922 0 ip_vs_lblc 12819 0 ip_vs_ftp 13079 0 nf_nat 26787 1 ip_vs_ftpip_vs_dh 12688 0 ip_vs 141092 22 ip_vs_dh,ip_vs_lc,ip_vs_rr,ip_vs_sh,ip_vs_ftp,ip_vs_sed,ip_vs_wlc,ip_vs_wrr,ip_vs_pe_sip,ip_v_lblcr,ip_vs_lblcnf_conntrack 133387 4 ip_vs,nf_nat,nf_conntrack_sip,nf_conntrack_ipv4libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
3.2 确定IPIP模块是否安装
1)确定操作系统是否有ipip模块[root@lvs01 ~]# modinfo ipipfilename: /lib/modules/3.10.0-693.el7.x86_64/kernel/net/ipv4/ipip.ko.xzalias: netdev-tunl0alias: rtnl-link-ipiplicense: GPLrhelversion: 7.4srcversion: 7A9ACFD3ACDDF881CCA185Edepends: ip_tunnel,tunnel4intree: Yvermagic: 3.10.0-693.el7.x86_64 SMP mod_unload modversions signer: CentOS Linux kernel signing keysig_key: DA:18:7D:CA:7D:BE:53:AB:05:BD:13:BD:0C:4E:21:F4:22:B6:A4:9Csig_hashalgo: sha256parm: log_ecn_error:Log packets received with corrupted ECN (bool)2)加载模块[root@lvs01 ~]# modprobe ipip[root@lvs01 ~]# lsmod |grep ipipipip 13465 0 tunnel4 13252 1 ipipip_tunnel 25163 1 ipip
3.3 IPVS规则脚本
1)启动脚本配置[root@lvs01 ~]# cat lvs_iptun.sh #!/bin/bashVIP=192.168.48.180 //隧道通信地址:vipRS1=192.168.10.182 //北京服务器地址RS2=192.168.1.183 //上海服务器PORT=80case $1 instart) #加载ipip模块 modprobe ipip #配置vip地址 ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up route add -host $VIP dev tunl0 > /dev/null 2&>1 #开启路由转发 echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -p > /dev/null 2>&1 #配置ipvs规则 ipvsadm -C ipvsadm -A -t $VIP:$PORT -s rr ipvsadm -a -t $VIP:$PORT -r $RS1:$PORT -i ipvsadm -a -t $VIP:$PORT -r $RS2:$PORT -i #显示信息 echo "ipvsadm running";;stop) ifconfig tunl0 down route del -host $VIP > /dev/null 2&>1 #禁止路由转发 echo 0 > /proc/sys/net/ipv4/ip_forward sysctl -p > /dev/null 2>&1 #清空规则 ipvsadm -C #显示信息 echo "ipvsadm stoping";;*) echo "Usage: $0 {start|stop}" exit 1;;esacexit 02)允许脚本,检查ipvs规则[root@lvs01 ~]# sh lvs_iptun.sh start[root@lvs01 ~]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.180:80 rr -> 192.168.1.183:80 Tunnel 1 0 0 //tunnel表示目前使用隧道模式 -> 192.168.10.182:80 Tunnel 1 0 0 //并且可以看到3个地址属于不同网络,实验中代表3个地域
3.4 Realserver服务器配置
北京和上海的服务器配置是一样的
1)加载ipip模块[root@beijing ~]# modprobe ipip[root@beijing ~]# lsmod |grep ipipipip 13465 0 tunnel4 13252 1 ipipip_tunnel 25163 1 ipip2)配置脚本[root@beijing ~]# cat lvs_realserver.sh #!/bin/bashVIP=192.168.48.180 //隧道地址:VIPPORT=80case $1 in start) #加载ipip模块 modprobe ipip #开启路由转发 echo 1 > /proc/sys/net/ipv4/ip_forward #配置tun接口 ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up #关闭源路由校验rp_filter echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter sysctl -p > /dev/null 2>&1 echo "RealServer is Running" ;;stop) ifconfig tunl0 down #还原内核参数 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter echo 1 > /proc/sys/net/ipv4/conf/tunl0/rp_filter echo 0 > /proc/sys/net/ipv4/ip_forward sysctl -p > /dev/null 2>&1 echo "RealServer is Stoping" ;;*) echo "Usage: $0 {start|stop}" exit 1 ;;esacexit 03)检查tunl0端口是否启动[root@beijing ~]# ip addr |grep tunl03: tunl0@NONE: mtu 1480 qdisc noqueue state UNKNOWN qlen 1 inet 192.168.48.180/32 brd 192.168.48.180 scope global tunl04)web网页内网检查 [root@beijing ~]# cat /usr/share/nginx/html/index.html beijing: 192.168.10.182 5)上面都是北京节点的配置,下面是上海节点配置,都是一样,我们直接检查结果就行[root@shanghai ~]# ip addr |grep tunl03: tunl0@NONE: mtu 1480 qdisc noqueue state UNKNOWN qlen 1 inet 192.168.48.180/32 brd 192.168.48.180 scope global tunl0[root@shanghai ~]# cat /usr/share/nginx/html/index.html shanghai: 192.168.1.183
3.5 内核参数rp_filter说明
官网ARP问题说明http://www.linux-vs.org/docs/arp.html,不过已经很老了,可以参考下而已。(不过没什么用)
默认 rp_filter 参数设置为 1,Linux 会反向校验源 IP 的路由,如果源和目的 IP 路由出口不是一个网卡,就会被丢弃。因为数据包到后端服务器物理网卡后会被转发给虚拟网卡 tunl0 接口,这时进入的网卡是 tunl0,而源 IP 的路由出口网卡肯定不是 tunl0,所以数据包会被丢弃。配置 rp_filter 参数为 0,就相当于关闭了这个校验。
(相当于本章实验tunl0进行ip隧道通信,真实主机的ens33网卡进行数据通信,其实这是两个网络,收发不一致的问题)
四、实验结果验证
4.1 ensp客户端访问验证
客户端直接通过httpclient访问VIP地址。能够成功返回链接信息
4.2 抓包验证是否通过ipip隧道(封装和解封装的过程)
我在路由器的2/0/0接口抓包
结果可以发现建立了完整TCP连接和HTTP连接,并且可以看到:
第一层:Src:192.168.48.100 Dst:192.168.48.180 (这里是第一层正常客户端请求网页)
第二层: Src:192.168.48.181 Dst:192.168.1.183 (封装了第一层,并在外套了一层,这里就是封装的过程)
回应的时候,可以看到抓包,已经是直接是realserver直接响应,证明了前面所说的内容
五、网上找的数据包走向图
六、总结
在TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样负载调度器就可以处理大量的请求,它甚至可以调度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN技术对服务器有要求,即所有的服务器必须支持"IP Tunneling"或者"IP Encapsulation"协议。
注意事项:
1) RIP、VIP、DIP全是公网地址(本实验模拟的都是各地域出口IP在IPVS上)
2) RS的网关不会也不可能指向DIP
3) 不支持端口映射
4) RS系统和负载均衡设备必须支持IP隧道
七、三个模式比较
VS/NAT | VS/TUN | VS/DR | |
网关要求 | 负载均衡器的IP即后端服务器的网关 | 各个服务器均指向各自网络的默认网关即可 | 各个服务器配置默认网关即可,不用经过负载均衡器 |
规模 | 10-20个节点 | 较高,支持100个节点以上 | 较高,支持100个节点以上 |
IP地址要求 | 使用一个公网IP即可 | 1. 各个节点全部使用公网IP 2. VIP需要公网IP,其他要在一个LAN内 | 1. 各个节点全部使用公网IP 2. VIP需要公网IP,其他要在一个LAN内 |
操作系统要求 | 任何操作系统 | 必须支持IPIP隧道模式的系统 | linux系统支持(要包括能够ARP抑制和配置虚拟接口的系统) |
安全性 | 安全,采用地址转换协议,屏蔽了内网节点 | 较差,使用公网地址,服务器完全暴露 | 较差,使用公网地址,服务器完全暴露 |