1.DR模式
DR(Direct Routing)直接路由模式
过程:
Client发送请求 --> DS(调度器) -->prerouting --> INPUT -->postrouting -->RS(Real Server)–>lo --> 网卡eth0 -->Client
用户(client)发送请求给调度器(DS),DS调度器先把请求发往prerouting链(内核空间kernal space),确定请求的是不是VIP;
到了INPUT链之后,如果请求的是集群服务,会在这里修改MAC地址,把源MAC地址改为DS的MAC地址,把目的MAC地址改为RS的MAC地址,此时IP仍然不变,处理完成后把请求发往postrouting链;
postrouting链检测请求的是否为RS(会检测请求的MAC地址),如果是,接受请求,把请求通过回环接口发给出口的网卡,再发回给客户端。
2.部署实验环境
实验前提:
- 需要3台虚拟机:sever1 sever2 sever3
- server1作为lvs调度器,而server2和server3作为后端服务器
1)在server2和server3中安装apache,并且写好测试页,以方便查看实验效果:
1.yum install httpd -y
2.cd /var/www/html/
3.vim index.html
cat index.html ##分别写入vm2和vm3
4.systemctl start httpd
2)配置ipvsadm:
在server1中:
1.yum install ipvsadm -y
2.ipvsadm -l #查看策略(解析ip与域名的对应关系,查看速度较慢)
3.ipvsadm -ln #-n不解析(速度快)
3.ipvsadm -A -t 172.25.10.100:80 -s rr #添加策略:tcp,通过80端口访问172.25.10.100,以轮询的调度算法
4.ipvsadm -a -t 172.25.10.100:80 -r 172.25.10.2:80 -g #添加策略:tcp,通过80端口访问172.25.254.100,以轮询的调度算法,使用DR(直接路由)模式,转发到172.25.254.2的80端口
5.ipvsadm -a -t 172.25.10.100:80 -r 172.25.10.3:80 -g ##添加策略:tcp,通过80端口访问172.25.254.100,以轮询的调度算法,使用DR(直接路由)模式,转发到172.25.254.3的80端口
6.ipvsadm -ln
3)添加VIP:
在server1、server2、server3中分别添加VIP地址:
ip addr add 172.25.10.100/24 dev eth0 #添加VIP地址到eth0上
ip addr show
4)测试:
在客户端(真机)中:
curl 172.25.10.100
注意:用上面的方法配置lvs,server1、server2、server3都有可能被访问到:
- 如果绑定的MAC地址是server1,则在server2和3中轮询
- 如果绑定的MAC地址是sever2或sever3的,那么我们会发现,在测试端根本不会形成轮询,而是直接去了MAC绑定的后端服务器 (显然这样在企业中是不允许的)
绑定的MAC地址是server1
1.在真机中进行 curl 172.25.10.100 ##在server2和server3中轮询
2.通过arp -an | grep 100命令查看绑定的MAC地址
3.经ip addr show 查询server1的地址,与server1的MAC地址一致
绑定的MAC地址是server2
1.arp -d 172.25.10.100 #删除现有绑定的MAC地址
2.curl 172.25.10.100 #显示为server2
3.arp -an | grep 100 #查看绑定的MAC地址
4.ip addr show #查询server2的地址,与server2的MAC地址一致
绑定的MAC地址是server3
1.arp -d 172.25.10.100 #删除现有绑定的MAC地址
2.curl 172.25.10.100 #显示为server3
3.arp -an | grep 100 #查看绑定的MAC地址
4.ip addr show #查询server3的地址,与server3的MAC地址一致
5)解决方法:
为避免这种情况:
-
要求只能绑定server1(调度器)的MAC地址
-
配置server2和server3的arp路由策略:为arptables网络的用户控制过滤的守护进程
在server2中:
yum whatprovides arptables/*
yum install arptables-0.0.4-8.el7.x86_64 -y
arptables -A INPUT -d 172.25.10.100 -j DROP #当网内广播需要172.25.10.100这个ip时,它丢弃所有网内的请求
arptables -A OUTPUT -s 172.25.10.100 -j mangle --mangle-ip-s 172.25.254.2 #当它自身需要在网内发包时,伪装为自己原本的ip172.25.254.2
在server3中:
yum whatprovides arptables/*
yum install arptables-0.0.4-8.el7.x86_64 -y
arptables -A INPUT -d 172.25.10.100 -j DROP #当网内广播需要172.25.254.100这个ip时,它丢弃所有网内的请求
arptables -A OUTPUT -s 172.25.10.100 -j mangle --mangle-ip-s 172.25.254.3 #当它自身需要在网内发包时,伪装为自己原本的ip172.25.254.3
6)测试:
在真机中:
arp -d 172.25.10.100 #先删除现有绑定MAC地址
curl 172.25.10.100 #重复此命令,实现了server2和server3的轮询
MAC---server1:
[root@foundation18 images]# arp -an | grep 100
? (172.25.18.100) at 52:54:00:94:87:0e [ether] on br0
[root@server1 ~]# ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:94:87:0e brd ff:ff:ff:ff:ff:ff
在server1中:
ipvsadm -ln #查看策略
[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.18.100:80 rr
-> 172.25.18.2:80 Route 1 0 2
-> 172.25.18.3:80 Route 1 0 3