LVS常用的工作模式有DR、TUN、NAT、FULLNAT,其中DR模式的转发性能最好,但组网要求最为苛刻。本文将试着分析LVS DR模式原理,举例实际配置方式。

LVS DR模式组网

DR模式的组网要求LVS和Real server在同一网段二层互通。因为LVS DR模式在负载均衡转发报文时,只修改目的mac为real server的mac,lvs要能将报文转发给real server,就必须满足LVS和real server是同网段二层互通。

两种LVS DR实际应用场景的组网原理图

  • 1、客户端和LVS、real server三者同网段
    LVS之DR模式原理与实践

  • 2、客户端与LVS、real server不同网段、LVS和real server同网段
    LVS之DR模式原理与实践

报文转发过程

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。

DR模式负载均衡配置

因为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: 192.168.0.2
    real server1: 192.168.0.3
    real server2: 192.168.0.4
    vip: 192.168.0.101

Virtual Server配置

virtual server在网卡子接口上配置vip,配置dr转发的ipvs规则。提高配置效率,将这些操作定义为shell脚本如下

#!/bin/bash
vip='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 in
start)
    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 配置脚本

Realserver的vip配置在lo口,与arp_ignore、arp_announce参数的修改相配套,抑制了RealServer不应答vip的arp请求,而接受lvs-dr转发过来的报文。提高配置效率,将这些操作定义为shell脚本如下

#!/bin/bash
vip=192.168.0.101
mask=255.255.255.255
case $1 in
start)
    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

Linux 内核参数arp_ignore和arp_announce作用说明

arp_ignore - INTEGER
0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答;
1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应;
2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求;
3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP
4-7:保留
8:不应答所有本地IP
arp_announce - INTEGER
0:默认值,允许使用本机上所有接口的IP作ARP通告。
1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告。
2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告。