实验拓扑
164230334.png

IP分配
client 192.168.30.1
Router e0/0 10.0.0.123
e0/1 192.168.30.200 (网关)
Director eth0: 192.168.30.105
eth0:1 192.168.30.254 (VIP)
Real 1 lo:1 192.168.30.254 (VIP)
eth0 192.168.30.113
Real 2 lo:1 192.168.30.254 (VIP)
eth0 192.168.30.114

注意:由于是用DR方式做负载均衡的,所以Real server 都要配置vip,并且指向路由器e0/1作为网关

一、路由器配置
路由器配置比较简单,只需要配置两个接口地址即可。
Router>en
Router#conf t
Router(config)#int e0/1
Router(config-if)#ip addr 10.0.0.123 255.255.255.0
Router(config-if)#no shutdown
Router(config)#int e0/0
Router(config-if)#ip address 192.168.30.200 255.255.255.0
Router(config-if)#no shutdown

二、配置Real 服务器
1、主页服务
由于前面的实验中已经配置好,这里就不再重复

2、配置VIP 地址
这里以第一台Real server 为例:
配置RIP
[root@node1 ~]# ifconfig eth0 192.168.30.113/24
配置VIP
[root@node1 ~]# ifconfig lo:1 192.168.30.254 netmask 255.255.255.255 broadcast 192.168.30.254

3、配置网关
[root@node1 ~]# route add -host 192.168.30.254 dev lo:1
[root@node1 ~]# route add default gw 192.168.30.200
[root@node2 ~]# route add -host 192.168.30.254 dev lo:1
[root@node2 ~]# route add default gw 192.168.30.200

[root@node1 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.30.254 * 255.255.255.255 UH 0 0 0 lo
192.168.30.0 * 255.255.255.0 U 0 0 0 eth0
link-local * 255.255.0.0 U 1002 0 0 eth0
default 192.168.30.200 0.0.0.0 UG 0 0 0 eth0
三、配置Director 服务器
1、配置IP
[root@server ~]# ifconfig eth0 192.168.30.105/24
[root@server ~]# ifconfig eth0:1 192.168.30.254 netmask 255.255.255.255 broadcast 192.168.30.254

2、配置网关
[root@server ~]# route add default gw 192.168.30.200
[root@server ~]# route add -host 192.168.30.254 dev eth0:1

[root@server ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.30.254 * 255.255.255.255 UH 0 0 0 eth0
192.168.30.0 * 255.255.255.0 U 0 0 0 eth0
link-local * 255.255.0.0 U 1002 0 0 eth0
default 192.168.30.200 0.0.0.0 UG 0 0 0 eth0

3、配置lvs
[root@server ~]# ipvsadm -A -t 192.168.30.254:80 -s rr
[root@server ~]# ipvsadm -a -t 192.168.30.254:80 -r 192.168.30.113 -g
[root@server ~]# ipvsadm -a -t 192.168.30.254:80 -r 192.168.30.114 -g

4、设置不允许ARP包发送
[root@node1 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@node1 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@node1 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@node1 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@node1 ~]#sysctl -p

[root@node2 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@node2 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@node2 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@node2 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@node2 ~]#sysctl -p
// arp_ignore=1 系统只回答目的IP 为本地IP 的包(也就是对广播包不做响应)
// arp_announce=2 系统忽略IP 包的源地址,而根据目标主机,选择本地地址

arp_ignore : INTEGER 定义对目标地址为本地IP的ARP询问不同的应答模式,默认为0
0 : 回应任何网络接口上对任何本地IP地址的arp 查询请求
比如eth0=192.168.0.1/24,eth1=10.1.1.1/24 那么即使eth0 收到来自10.1.1.2 这样地址发起的对10.1.1.1 的arp查询也会回应,而原本这个请求该是出现在eth1上,也该由eth1 回应的。

1: 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1 收到来自10.1.1.2 这样地址发起的对192.168.0.1的查询不会回答,而对192.168.0.2 发起的对192.168.0.1 的ARP 查询会回应。

2 : 不回应该网络接口的ARP请求,而只对设置的唯一和连接地址做出回应

注意:
如果是通过路由器连接的,那么对于每个Real Server 服务器改变后,客户端的浏览器里可能还会只显示其中一台Real 服务器的主页,原因是router 还保存着旧的ARP对应关系,所以要清除一下router 的缓存,执行如下命令:
Router# clear arp-cache

经过客户端几次访问后,在router上便看不到同一个MAC即对应Director 又对应Real Server
164313707.png

164327183.png
[root@server ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.30.254:80 rr
-> 192.168.30.113:80 Route 1 0 22
-> 192.168.30.114:80 Route 1 1 22


Real Server 还有Director 的配置也可以写成shell脚本
===========Director=========
#!/bin/bash
# description: start LVS of Director Server
GW=192.168.30.1
# website director vip
VIP=192.168.30.254
DIP=192.168.30.105
RIP1=192.168.30.111
RIP2=192.168.30.112
RIP3=192.168.30.113
RIP4=192.168.30.114

/etc/rc.d/init.d/functions

logger $0 called with $1

case "$1" in
start)
/sbin/ipvsadm --set 30 5 60
/sbin/ip addr add dev eth1 $DIP
/sbin/ip link set dev eth1 up
/sbin/ip addr add dev eth0 $VIP brd $VIP
/sbin/ip link set dev eth0 up
/sbin/ip route add default via $GW

/sbin/ipvsadm -A -t $VIP:80 -S wrr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g -w 2
/sbin/ipvsadm -a -t $VIP:80 -r $RIP4:80 -g -w 2

touch /var/locak/subsys/ipvsadm > /dev/null 2>&1
/sbin/arping -I eth0 -c 5 -s $VIPO $GW > /dev/null 2>&1
;;

stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
/sbin/ip link set dev eth0 down
/sbin/ip link set dev eth1 down
rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
echo "ipvsadm stoped"
;;

status)
if[ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoppd"
exit 1
/sbin/ip route add default via $GW

/sbin/ipvsadm -A -t $VIP:80 -S wrr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g -w 2
/sbin/ipvsadm -a -t $VIP:80 -r $RIP4:80 -g -w 2

touch /var/locak/subsys/ipvsadm > /dev/null 2>&1
/sbin/arping -I eth0 -c 5 -s $VIPO $GW > /dev/null 2>&1
;;

stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
/sbin/ip link set dev eth0 down
/sbin/ip link set dev eth1 down
rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
echo "ipvsadm stoped"
;;

status)
if[ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoppd"
exit 1
else
echo "ipvsadm ok"
fi
;;
*)
echo "Usage: $0 {start|stop|stauts}"
exit 1
esac
exit 0

===========Real Server=========
#!/bin/bash
# description:Config real server lo and apply noarp
VIP=192.168.30.254

case "$1" in
start)
/sbin/ip addr add dev lo $VIP brd $VIP

echo "1" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ip link set dev lo down
echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage:$0 {start|stop}"
exit 1
esac
exit 0

小结:
  • 配置比较复杂,原理不太好理解

  • 工作环境中用的最多

  • 在DR调试模式下,最好在搭建完Real 上的服务后,就把ARP广播限制住

  • 由于Director本身不处理请求,而是后端Real Server直接处理,并通过路由表直接回应客户端,所以Director本身并不会成为瓶颈