本文共 2859 字,大约阅读时间需要 9 分钟。
LVS常用的工作模式有DR、TUN、NAT、FULLNAT,其中DR模式的转发性能最好,但组网要求最为苛刻。本文将试着分析LVS DR模式原理,举例实际配置方式。
DR模式的组网要求LVS和Real server在同一网段二层互通。因为LVS DR模式在负载均衡转发报文时,只修改目的mac为real server的mac,lvs要能将报文转发给real server,就必须满足LVS和real server是同网段二层互通。
1、客户端和LVS、real server三者同网段
1)client发送请求到vip,real-server配置限制对vip应答arp,而lvs会对vip响应arp,因此client将请求发到LVS。
2)LVS机器收到发往vip的报文后,根据目的IP和目的port匹配ipvs规则,将报文目的mac改为real server的mac,同时将源mac改为LVS的mac后,发送到real server。3)real server收到之后,mac/IP都是本机的,就将报文交由系统处理。4)回程报文因real server收到的报文源IP就是client IP,real server直接将请求回给client。如果client和real server是同一个网段,响应报文直接通过二层透传发送给client,报文目的mac即为client mac;如果client和real server不是同一个网段,响应报文先发送到gateway,再走三层转发返回client。因为LVS和real server都配置了VIP,client或者网关设备都可能arp学到LVS和real server的mac,也就会发生IP冲突,且无法实现负载均衡功能。为了避免这种情况发生,可通过内核参数arp_ignore和arp_announce的配置,只允许LVS应答VIP的arp请求,抑制real server应答VIP的arp请求和发送免费arp。(抑制ARP还可使用arptables)
virtual server在网卡子接口上配置vip,配置dr转发的ipvs规则。提高配置效率,将这些操作定义为shell脚本如下
#!/bin/bashvip='192.168.1.100'mask='255.255.255.255'port='80'iface='eth1:1'rs1='192.168.0.3'rs2='192.168.0.4'case $1 instart) ifconfig $iface $vip netmask $mask broadcast $vip up iptables -F # 配置ipvs规则 ipvsadm -A -t ${vip}:${port} -s wrr ipvsadm -a -t ${vip}:${port} -r ${rs1} -g -w 1 ipvsadm -a -t ${vip}:${port} -r ${rs2} -g -w 1 #realserver不配置端口,dr模式不支持端口映射 ;;stop) ipvsadm -C ifconfig $iface down ;;*) echo "Usage $(basename $0) start|stop" exit 1 ;;esac
Realserver的vip配置在lo口,与arp_ignore、arp_announce参数的修改相配套,抑制了RealServer不应答vip的arp请求,而接受lvs-dr转发过来的报文。提高配置效率,将这些操作定义为shell脚本如下
#!/bin/bashvip=192.168.0.101mask=255.255.255.255case $1 instart) echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 $vip netmask $mask broadcast $vip up route add -host $vip dev lo:0 ;;stop) ifconfig lo:0 down echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce ;;*) echo "Usage: $(basename $0) start|stop" exit 1 ;;esac
arp_ignore - INTEGER
0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答;1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应;2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求;3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP4-7:保留8:不应答所有本地IParp_announce - INTEGER0:默认值,允许使用本机上所有接口的IP作ARP通告。1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告。2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告。转载于:https://blog.51cto.com/13599730/2312603