背景介绍
LVS的NAT模型所有的请求和响应报文会经过director,此时director就成为了性能瓶颈,而为了解决这个问题LVS也默认采用的是DR模型(下图),请求报文(蓝色)向director发出请求,响应报文(红色)由RS服务器直接返还给用户不经由director,通常RS的网关都是指向IDC机房的出口路由,这样性能比通过director要好很多。VIP为公网IP地址,RIP和DIP需要连接在同一物理交换设备上,只要中间没有隔路由器,即使不是同一网段也可以,大多数情况RIP和DIP都位于内网所以习惯上将它们放在同一网段。
实验介绍
为便于实验,将上图简化下面的结构,目的是演示VIP和DIP在不同的网段。本实验在workstation上进行模拟,所有设备连载VMnet1虚拟交换机上,创建5台虚拟机,操作系统版本为CentOS6.5
操作步骤
1.在路由器上添加20网段地址,并开启核心转发功能,其他设备的网关都指向路由器
]# ip addr add 172.16.20.40/24 dev eth0
]# sysctl -w net.ipv4.ip_forward=1
2.给director的本地接口绑定VIP地址,安装ipvsadm包并设置规则
]# yum install ipvsadm.i686 -y
]# ip addr add 172.16.10.100/32 dev eth0
]# ipvsadm -A -t 172.16.10.100:80 -s rr
]# ipvsadm -a -t 172.16.10.100:80 -r 172.16.20.30 -g
]# ipvsadm -a -t 172.16.10.100:80 -r 172.16.20.30 -g
注:经测试VIP地址也可绑定到lo接口,必须是32位掩码
3.修改realserver内核参数,开启arp抑制,并在lo接口绑定VIP地址。为演示效果给realserver安装httpd服务,设置不同的主页(步骤略)
]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
]# ip addr add 172.16.10.100/32 dev lo
注:经测试VIP地址也可绑定到本地接口,必须是32位掩码
4.适用客户端访问172.16.10.100测试效果,至此操作全部完成
补充说明
在绑定VIP地址时注意,在使用ip或ifconfig绑定地址时一定要将地址设置为32位掩码,即172.16.10.100/32,否则网站无法正常访问。以realserver为例,在本地接口绑定32位掩码的VIP地址,或在lo接口绑定任意掩码长度的VIP地址,路由条目保持不变
如果本地接口绑定非32位掩码的VIP地址,以24位掩码为例,会增加一条路由条目
第一次测试时将director和realserver上VIP地址掩码写成24位,即172.16.10.100/24,发现realserver的web页面无法正常打开,在realserver上抓包发现,mac地址在传输过程中发生了改变
对照mac表印证了DR模式下director时通过修改mac地址完成请求的调度,说明请求已送到realserver,但此时realserver未做出响应
将realserver上的VIP地址掩码改为32位恢复正常,需要注意的是:经测试realserver上VIP地址掩码无论在哪种接口必须为32位,director上本地接口VIP地址掩码是24位还是32位无所谓,lo接口VIP地址掩码必须为32位
产生的疑惑
将director上本地接口VIP地址掩码长度设置为32位,即172.16.10.100/32,客户端172.16.10.10/24使用ping命令ping该地址,发送时会将目标地址(172.16.10.100)与自己的掩码(255.255.255.0)做与运算,得出目标地址与自己(172.16.10.10)在同一网段,而返回时realserver同样会使用目标地址(172.16.10.10)与自己的掩码(255.255.255.255)做与运算,得出目标地址与自己(172.16.10.100)不在同一网段从而走默认路由。下图时路由器上的抓包截图
对照下图客户端的arp地址表得知:客户端发起ping命令后,由于判断目标地址与自己在同一网段,所以直接会找到目标地址(红框1);目标地址再返回时判断目标地址于自己不在同一网段所以走默认路由(红框2)
从红框3、4看到数据流向在进入路由器后由172.16.10.40>172.16.10.100,对照路由器的arp地址表知道172.16.10.100与172.16.20.30认为是同一个mac地址,这也印证了DR模式在工作时director会将mac地址改为挑选出来realserver的mac地址再返回给路由器的机制,此处挑选出来的realserver是172.16.20.30,所以172.16.10.100与172.16.20.30是同一个mac地址,至于在ping操作时为啥会有这一步原因尚不清楚
最后通过路由器将结果返回给客户端(红框5),至此结束。