1. 程式人生 > >LVS之DR模式原理與實踐

LVS之DR模式原理與實踐

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通告。