1. 实验环境:
server1(3号) web1 IP:172.25.254.1
server2(2号) web2 IP:172.25.254.2
server3(3号) LB IP: 172.25.254.3
foundation13 client IP:172.25.254.250
2. 在client上搭建rhel6.5的网络YUM源:
3. 因为3号主机是LB,所以为了安装某些需要的套件,需要在其上配置如下的yum源:
4. 给1号、2号、3号主机配置相同的VIP(虚拟IP:172.25.254.100):
1号主机:
配置命令: ip addr add 172.25.254.100/32 dev eth0
配置结果:
2号主机:
用另外一种配置命令:ifconfig eth0:0 172.25.254.100 netmask 255.255.255.255 up
配置结果:
3号主机:
直接列出配置结果:
5. 在3号主机中下载IPVS的管理工具ipvsadm:
6. 在LB主机,也就是3号主机上配置虚拟服务器、后端真实服务器、调度方法以及工作模式:
使用该命令:ipvsadm -A -t 172.25.254.100:80 -s rr
-A 表示添加一个虚拟服务器, -t 表示添加tcp的端口, -s 表示配置调度方法, rr 表示 LB的调度方式是轮询。
使用该命令: ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.1:80 -g
-a 表示添加一个真实服务器, -t表示添加tcp的端口号,-r 后面亘的是真实服务器的IP和tcp端口号, -g表示采用DR的工作模式。
配置过程及结果如下:
ipvsadm -l 和 ipvsadm -ln 都可以显示配置的ipvs内容, 前者显示的时候将IP解析成了主机名,后者直接显示IP:
若想将配置内容永久保存,可以使用命令:
查看保存后的文件内容:
ipvsadm -C 命令可以清空所有的配置,进行重新配置IPVS的规则内容。
7. 开启1号主机和2号主机的httpd服务:
8. 现在进行一个小测试:
我们在client上面访问虚拟服务器:
实验结果明显不对,用arp -an 命令看一下arp的缓存内容:
发现VIP 和后面的MAC地址形成了映射关系,这个MAC是谁的呢?我们检查一下发现是server1的MAC地址,如下图:
难怪实验现象不对,因为在同一个局域网中,当client主机的http请求报文的目的IP是172.25.254.100的时候,而在我们当前的实验环境下,一个局域网中有1号、2号、3号主机都有相同的IP(VIP),在http报文寻找目的地的时候,会先通过arp协议广播一个报文,这个报文的目的是得到谁是VIP的主机,谁是这个主机,该主机接收这个请求,然后返回该主机的MAC地址给client,供其在数据链路层传输传输数据; 而当有多个相同的目标IP时,那就是谁响应的快,client就会屏蔽掉其它主机,将http报文传送给第一个响应的主机。
所以,现阶段响应的结果时随机的,不信我们再测试:
我们的目的当然是只让3号主机LB响应客户端的http请求了,那么该怎么解决这一问题呢?下面接解决这一问题。
9. 在1号、2号主机上配置arp抑制:
首先在1号、2号主机上下载arp内存空间的管理工具: arptables
注意!!!arptables的基本思路和iptables一样;不过,arptables处理arp协议有关的包!!!
1号、2号主机上都配置策略: arptables -A IN -d 172.25.254.100 -j DROP
-A 意思是添加arptable的匹配规则, IN表示当arp相关的包进来时, -d 表示目标地址是172.25.254.100, -j 表示匹配上规则后做的动作, DROP表示丢弃。
用命令arptables -L 查看配置规则:
要想使该规则永久生效,则做如下配置:
在主机2上做同样的配置。
10. 测试:
结果如下图,表明实验成功:
但是为了保险期间,我们在1号、2号主机上再配置一条arp规则:arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.1
配置这条规则的目的是,假若上调匹配规则出现了失误没匹配上,这条规则同样可以起到arp抑制的作用。 意思是,若要发送一个arp回应报文时,若源地址是VIP:172.25.254.100 则将arp报文发送给172.25.254.1这台主机,也就是自己。
做到这,博主猜想那么,在1号、2号主机上只配置这两条规则中的任意一个都是可行的。
故,清空之前配置的arp规则: arptables -F, 然后只添加后面一条:
2号主机做同样的配置,这里不再赘图。
在client主机上做测试:
其实,除了上面的方法,该实验还有第二种做法,第二种做法和第一种方法在思路上是一样的,不同之处在于处理arp抑制的方式。下面我们用第二种方法来实现该实验。
1. 在上一个实验的基础上,我们重启1号、2号主机,重启后因为在1、2主机上的vip和arptbles规则都是临时配置所以都会失效,这样省的我们一个一个清除。
2. 配置文件/etc/sysctl.conf,配置内容如下:
在1号、2号主机上都要做上面的配置。
然后用命令 sysctl -p 通知系统:
arp_ignore和arp_announce内核参数的含义可以参考:https://www.jianshu.com/p/a682ecae9693
3. 在回环接口上绑定vip:
1号主机:
2号主机:
4. 开启1号、2号主机上的httpd服务:
5. 测试现象: