先安装ipvsadm工具,这个工具能帮我们把生成的规则送给内核yum install -y ipvsadm
ipvsadm:
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
查看内核是否支持ipvs功能grep -i "ipvs" -C 10 /boot/config-3.10.0-229.el7.x86_64
image.png
因为是工作在四层上的所以不需要启动任何服务,只需要通过ipvsadm将规则送到内核中,就可以生效了。
lvs-nat:
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发;
(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
(2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标PORT;
(4)vs必须是Linux系统,rs可以是任意系统;
image.png
然后我们就可以在lvs的那台主机上做规则了
ipvsadm -A -t 192.168.31.100:80 -s rr #添加VIP
ipvsadm -a -t 192.168.31.100:80 -r 192.168.0.10 -m
ipvsadm -a -t 192.168.31.100:80 -r 192.168.0.11 -m
#-m表示地址伪装,-w表示权重
ipvsadm -Ln #查看规则
~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.31.100:80 rr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.11:80 Masq 1 0 0
然后我们要打开核心转发功能才能成功访问的到sysctl -w net.ipv4.ip_forward=1
循环请求十次,被平均分发到两台主机上
image.png
我们可以更改算法为wrr,将node1设置为2,node2设置为4
ipvsadm -E -t 192.168.31.100:80 -s wrr
ipvsadm -e -t 192.168.31.100:80 -r 192.168.0.10 -m -w 2
ipvsadm -e -t 192.168.31.100:80 -r 192.168.0.11 -m -w 3
image.png
可以看到发生了改变
image.png
lvs-rd:
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
Director和各RS都得配置使用VIP;
(1) 确保前端路由器将目标IP为VIP的请求报文发往Director:
- (a) 在前端网关做静态绑定;
- (b) 在RS上使用arptables;
- (c) 在RS上修改内核参数以限制arp通告及应答级别;
- arp_announce
- arp_ignore
(2) RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;
(3) RS跟Director要在同一个物理网络;
(4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
(5) 不支持端口映射;
image.png
我们只需要在回环地址上配置VIP,添加一条路由指向自己的lo接口,并且修改 arp_announce,arp_ignore两个参数。在这一次实验中我们再添加一台服务器,用它来做lvs负载均衡,这样RS响应的数据并不会经过Director而是直接发给客户端。
VS:
ipvsadm -A -t 192.168.0.20:80 -s wrr
ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.10 -g -w 1
ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.11 -g -w 1
RS1:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#响应ip地址是在lo接口上的arp请求,其余的忽略。
echo 2> /proc/sys/net/ipv4/conf/lo/arp_announce
#对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址.
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#配置所有网卡只响应自己接口上的ip的arp请求,其余的忽略。
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#必须避免将接口信息向非本网络进行通告
ifconfig lo:0 192.168.0.20/24 broadcast 192.168.0.20 up
route add -host 192.168.0.20 dev lo:0
#广播地址填自己是因为我们根本不需要去广播给别人
RS2:
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 192.168.0.20/24 broadcast 192.168.0.20 up
route add -host 192.168.0.20 dev lo:0
image.png
发现dr无法与rs通信,进一步排查发现rs配置回环地址vip的时候双方就无法通信了,这个问题留待下次解决。
image.png