美文网首页
LVS部署之细枝末节

LVS部署之细枝末节

作者: JSON_NULL | 来源:发表于2017-11-30 10:37 被阅读124次

    简介

    本文总结了在LVS部署过程中需要注意的一些小细节。这些内容比较杂,并且没有规律和内在联系;它们分散在LVS部署过程中的各个小环节中,不是系统性的知识,也没有主线对它们进行连接。你可以通过此文对他们进行一个大概的了解,在实践过程中如果遇到可以再过来进行详细的查阅,以解决实际问题。

    开启Linux的路由转发功能

    LVS在VS/NAT方式下需要开启数据包转发(ip_forward)功能。因为在LVS的VS/NAT模式下,对IP数据进行负载均衡时,需要把多台真实服务器节点中的专网IP映射到同一个虚拟服务器的公网IP上;这就需要通过NAT技术对IP数据包进行转发,从而将IP数据包发送到真实服务器上进行处理。LVS在VS/DR模式下,因为director的DIP与真实服务器节点的RIP在同一网段,所以不需要开启路由转发功能。LVS在VS/TUN模式下,IP数据包是通过IP隧道技术进行封包后再分发的方式到达真实服务器节点的,也不需要开启路由转发功能。

    开启Linux的路由转发功能的方法很多,具体细节请参阅文章Linux ip_forward 数据包转发

    配置真实服务器的ARP请求与响应策略

    在ARP协议中,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自 己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。

    在LVS的VS/DR模式下,当内网的真实服务器(Linux主机)要发送一个到外部网络的ip包(LVS负载器分配置过来的作业的处理结果),那么它就会请求路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址。而linux主机默认是使用ip数据包的源ip地址作为arp里面的源ip地址,而不是使用发送设备上面网络接口卡的ip地址。这样在LVS的VS/DR架构下,所有真实服务器在响应外部请求时的IP数据包的源地址都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac。而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。

    所以当LVS运行在VS/DR模式下时,需要在所有真实服务器上修改ARP请求与响应策略,以保证以上问题不会发生。

    因为在lo(本地环回网络接口)上配置了VIP,所以需要对真实服务器中的ARP请求与响应策略配置如下:

    net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.lo.arp_ignore=1
    
    net.ipv4.conf.all.arp_announce=2
    net.ipv4.conf.lo.arp_announce=2
    

    将以上代码段追加到/etc/sysctl.conf文件中,然后执行sysctl -p指令就可以。以上配置的具体含义请参阅Linux 内核参数 arp_ignore & arp_announce 详解

    在VS/DR模式下 VIP 、DIP 和 RIP 必须在同一网段吗?

    在VS/DR模式下 VIP 、DIP 和 RIP 不需要在同一网段!

    其中VIP必须是公网IP;而DIP和RIP必须在同一网段(可以是任意网段的IP,也可以是私网IP),且需要节点主机的RIP可以把IP数据包发送到一个能把IP数据包路由到公网的路由器上。

    单一公网IP的LVS VS/DR 网络拓扑图

    如上图所示网络拓扑,配置LVS工作在VS/DR模式下是可以正常工作的。

    其实LVS 在VS/DR模式下的要求是DIP和RIP必须处于同一网段中。在实际的部署过程中发现如果在Director上VIP和DIP在同一网段、或在RealServer上VIP与RIP在同一网段,LVS集群工作会很不稳定。因为当一个IP数据包需要发到默认网关时(在RealServer或Director上),Linux主机不知道应该使用哪个接口(在同一子网中的VIP和DIP/RIP),他可能会随机选一个,但这个不一定能成功。我感觉可以通过在Linux中配置路由表来解决,但没有验证(哪位同学如果有兴趣可以实践验证一下,如果能把验证结果反馈给我那是再好不过了)。

    配置真实服务器的 反向路由过滤 策略

    在Linux中用于对 网卡的反向路由过滤策略进行配置的内核参数是 rp_filter,有关此参数的详细介绍以及配置方式请参见Linux内核参数 rp_filter

    LVS在VS/TUN模式下,需要对tunl0虚拟网卡的反向路由过滤策略进行配置。最直接的办法是把其值设置为0。

    net.ipv4.conf.tunl0.rp_filter=0
    net.ipv4.conf.all.rp_filter=0
    

    因为Linux系统在对网卡应用反向路由过滤策略时,除了检查本网卡的rp_filter参数外,还会检查all配置项上的rp_filter参数,并使用这两个值中较大的值作为应用到当前网卡的反向路由过滤策略。所以需要同时把net.ipv4.conf.all.rp_filter参数设置为0。

    配置tunl0网卡

    LVS 在VS/TUN模式下,需要在每个真实服务器上开启tunl0网卡,并把VIP配置到tunl0网卡上。有关tunl0网卡的说明可以参考一下Linux 中IP隧道模块浅析

    LVS在VS/TUN模式下 RealServer 上的防火墙配置

    LVS在VS/TUN模式下 因为 Director主机需要通过ipip协议向RealServer分发数据包;所以需要在RealServer上配置防火墙,允许ipip协议的数据包通过。

    iptables -I INPUT 1 -p 4 -j ACCEPT
    

    相关文章

      网友评论

          本文标题:LVS部署之细枝末节

          本文链接:https://www.haomeiwen.com/subject/vgjxbxtx.html