简介
在lvs集群中,集群作为一个整体,通常使用负载均衡器(Director),也称调度器,分发器,作为与外部通信的中介,因此,把如何将数据从外部请求经由负载均衡器转发至内部真实服务器的方式作为对lvs集群分类的依据。目前lvs数据转发主要有四种方式:
lvs-nat:修改请求报文的目标IP,相当于多目标IP的DNAT;
lvs-dr:操纵封装新的MAC地址(默认);
lvs-tun:在原请求IP报文之外新加一个IP首部,ip隧道;
lvs-fullnat:同时修改请求报文的源和目标IP;
所以在负载均衡器上可以实现多种转发方式,但一般在实际使用中我们只选择其中一种。下面分别详细介绍这几种类型。
lvs-nat:网络地址转换
它是相当于多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。
①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP;
②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;
③、IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP;
④、POSTROUTING链通过选路,将数据包发送给Real Server;
⑤、Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP;
⑥、Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
详细流程图如下:
lvs-nat有如下几个要点
RIP和DIP必须在同一个IP网络,且应该使用私网地址,并且RS的网关要指向DIP;
请求报文和响应报文都必须经由Director转发,Director容易成为系统瓶颈;
支持端口映射,可修改请求报文的目标PORT;
VS必须是Linux系统,RS可以是任意系统。
lvs-dr:直接路由
它是通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP;
②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;
③、IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址;
④、由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server;
⑤、RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP;
⑥、响应报文最终送达至客户端
详细流程图如下:
实现DR模型有一个很关键的问题,就是VIP必须同时配置在Director Server和Real Server上,且必须在同一物理网络中,但是大家应该知道,Linux主机接入一个网络中的时候,会向本网络进行广播其IP地址对应的MAC地址,也包括该主机其他网卡
的MAC,这样一来不当紧,那么在这同一物理网络中,VIP分别存在于Director和RS上了,那么IP地址不就冲突了吗?,我们该如何解决呢?
有如下几种方法:
在该网络中的网络设备上设置VIP地址和Director的MAC地址进行绑定;
在RS上使用arptables,实现对arp广播进行过滤;
可以修改RS内核参数,来限制arp通告以及应答级别;
arp_announce
arp_ignore
[root@node1 /]# tree /proc/sys/net/ipv4/conf /proc/sys/net/ipv4/conf ├── all │ ├── accept_local │ ├── accept_redirects │ ├── accept_source_route │ ├── arp_accept │ ├── arp_announce │ ├── arp_filter │ ├── arp_ignore │ ├── arp_notify │ ├── bootp_relay │ ├── disable_policy │ ├── disable_xfrm │ ├── force_igmp_version │ ├── forwarding │ ├── log_martians │ ├── mc_forwarding │ ├── medium_id │ ├── promote_secondaries │ ├── proxy_arp │ ├── proxy_arp_pvlan │ ├── route_localnet │ ├── rp_filter │ ├── secure_redirects │ ├── send_redirects │ ├── shared_media │ ├── src_valid_mark │ └── tag
执行以下命令就可以达到我们所需要的效果:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
实现DR模型需要注意的:
RS和Director要在同一个物理网络中
RS的RIP可以使用私网地址,也可以是公网地址,RIP与DIP在同一IP网络,RIP的网关
不能
指向DIP,以确保响应报文不会经过Director;请求报文要经由Director,但响应报文不能经由Director,而是由RS直接发往Cliten
不支持端口映射;
lvs-tun:IP隧道
它的转发方式是:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)。
①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP;
②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;
③、IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP;
④、POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP;
⑤、RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP;
⑥、响应报文最终送达至客户端;
实现tun模型需要注意的:
DIP, VIP, RIP都应该是公网地址;
RS的网关不能,也不可能指向DIP;
请求报文要经由Director,但响应不能经由Director;
不支持端口映射;
RS的OS得支持隧道功能;
lvs-fullnat:
fullnat是近几年才出现的,它是通过同时修改请求报文的源IP地址和目标IP地址进行转发。
实现fullnat模型需要注意的:
VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client;
请求和响应报文都经由Director;
支持端口映射;
最后总结一下:
lvs-nat, lvs-fullnat:请求和响应报文都经由Director;
lvs-nat:RIP的网关要指向DIP;
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信;
lvs-dr, lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client;
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发;
lvs-tun:通过在原IP报文之外封装新的IP报文实现转发,支持远距离通信;
文章转载至:http://www.ilurker.cn/?post=229