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三者同網段
- 2、客戶端與LVS、real server不同網段、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。
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通告。