LVS-DR配置
环境:
director:
DIP eth0: 192.168.85.128
VIP eth0:1 192.168.85.130
RS1:
RIP eth1: 192.168.85.140
VIP lo:0 192.168.85.130
RS2:
RIP eth1: 192.168.85.143
VIP lo:0 192.168.85.130
一.环境配置
1.director配置:
[root@www ~]# ifconfig eth0:1 192.168.85.130/24
[root@www ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:45:83:CE
inet addr:192.168.85.128 Bcast:192.168.85.255 Mask:255.255.255.0
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:45:83:CE
inet addr:192.168.85.130 Bcast:192.168.85.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
2.RS配置:
2.1先配置RIP:
RS1:
[root@localhost ~]# ifconfig
eth1 Link encap:Ethernet HWaddr 00:0C:29:D3:D8:6A
inet addr:192.168.85.140 Bcast:192.168.85.255 Mask:255.255.255.0
RS2:
[root@localhost ~]# ifconfig
eth1 Link encap:Ethernet HWaddr 00:0C:29:1F:31:83
inet addr:192.168.85.143 Bcast:192.168.85.255 Mask:255.255.255.0
2.2配置RS1和RS2限制对ARP的请求响应并配置启用VIP
[root@localhost ~]# cd /proc/sys/net/ipv4/conf/
[root@localhost conf]# ls
all default eth1 lo
RS1:
[root@localhost conf]# sysctl -w net.ipv4.conf.eth1.arp_announce=2
net.ipv4.conf.eth1.arp_announce = 2
[root@localhost conf]# sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
[root@localhost conf]# sysctl -w net.ipv4.conf.eth1.arp_ignore=1
net.ipv4.conf.eth1.arp_ignore = 1
[root@localhost conf]# sysctl -w net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_ignore = 1
[root@localhost ~]# ifconfig lo:0 192.168.85.130 broadcast 192.168.85.130 netmask 255.255.255.255 up
RS2:
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# ifconfig lo:0 192.168.85.130 broadcast 192.168.85.130 netmask 255.255.255.255 up
以上2.2的设置需要在启用VIP之前进行,否则,则需要在Director上清空arp表才能正常使用LVS
3.设置路由
当响应报文通过realserver的eth1接口出来后,其源地址是RIP目标地址是VIP,所以需要设置路由保证其源地址为VIP;
这样,数据包在由Direcotr发往Realserver时,只有目标MAC地址发生了改变(变成了Realserver的MAC地址)。Realserver在接收到数据包后会根据本地路由表将数据包路由至本地回环设备,接着,监听于本地回环设备VIP上的服务则对进来的数据进行相应的处理,而后将处理结果回应至RIP,但数据包的原地址依然是VIP。
RS1:
[root@localhost ~]# route add -host 192.168.85.130 dev lo:0
如果目标地址是192.168.85.130那么就通过lo:0设备出去;
RS2:
[root@localhost ~]# route add -host 192.168.85.130 dev lo:0
如果目标地址是192.168.85.130那么就通过lo:0设备出去
director:
[root@www ~]# route add -host 192.168.85.130 dev eth0:1
如果目标地址是192.168.85.130那么就通过eth0:1设备出去
4.查看director与RS的连通性
[root@www ~]# curl
RS1:192.168.85.140
[root@www ~]# curl
RS2:192.168.85.143
二.DR配置
1.director端添加规则(尽量先删除以前的规则配置)
[root@www ~]# ipvsadm -A -t 192.168.85.130:80 -s rr
[root@www ~]# ipvsadm -a -t 192.168.85.130:80 -r 192.168.85.140 -g
[root@www ~]# ipvsadm -a -t 192.168.85.130:80 -r 192.168.85.143 -g
[root@www ~]# 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.85.130:80 rr
-> 192.168.85.140:80 Route 1 0 0
-> 192.168.85.143:80 Route 1 0 0
2.测试
本机打开浏览器显示:
刷新后显示:
多次刷新测试:
[root@www ~]# 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.85.130:80 rr
-> 192.168.85.140:80 Route 1 0 5
-> 192.168.85.143:80 Route 1 0 5
补充:
1.ARP限制
在VS/DR或VS/TUN应用的模型中(所有机器都在同一个物理网络),所有机器(包括Director和RealServer)都使用了一个额外的IP地址,即VIP。当一个客户端向VIP发出一个连接请求时,此请求必须要连接至Director的VIP,而不能是RealServer的。因为,LVS的主要目标就是要Director负责调度这些连接请求至RealServer的。
因此,在Client发出至VIP的连接请求后,只能由Director将其MAC地址响应给客户端(也可能是直接与Director连接的路由设备),而Director则会相应的更新其ipvsadm table以追踪此连接,而后将其转发至后端的RealServer之一。
如果Client在请求建立至VIP的连接时由某RealServer响应了其请求,则Client会在其MAC table中建立起一个VIP至RealServer的对应关系,并以至进行后面的通信。此时,在Client看来只有一个RealServer而无法意识到其它服务器的存在。
为了解决此问题,可以通过在路由器上设置其转发规则来实现。当然,如果没有权限访问路由器并做出相应的设置,则只能通过传统的本地方式来解决此问题了。这些方法包括:
1、禁止RealServer响应对VIP的ARP请求;
2、在RealServer上隐藏VIP,以使得它们无法获知网络上的ARP请求;
3、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
4、禁止ARP请求发往RealServers;
现在可以通过设置arp_ignore和arp_announce来进行ARP限制:
arp响应限制
1)arp_ignore:
定义对目标地址为本地IP的ARP询问不同的应答模式0
0:默认值,回应任何网络接口上对任何本地IP地址的arp查询请求
1:只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7:保留未使用
8:不回应所有(本地地址)的arp查询
2)arp_announce:
对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0:默认值,在任意网络接口(eth0,eth1,lo)上的任何本地地址
1:尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2:对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
2.LVS的连接追踪
如果有多台Realserver,在某些应用场景中,Director还需要基于“连接追踪”实现将由同一个客户机的请求始终发往其第一次被分配至的Realserver,以保证其请求的完整性等。其连接追踪的功能由Hash table实现。Hash table的大小等属性可通过下面的命令查看:
# ipvsadm -lcn
为了保证其时效性,Hash table中“连接追踪”信息被定义了“生存时间”。LVS为记录“连接超时”定义了三个计时器:
1、空闲TCP会话;
2、客户端正常断开连接后的TCP会话;
3、无连接的UDP数据包(记录其两次发送数据包的时间间隔);
上面三个计时器的默认值可以由类似下面的命令修改,其后面的值依次对应于上述的三个计时器:
# ipvsadm --set 28800 30 600