LVS的概念
请看这篇博客:https://blog.csdn.net/weixin_38044888/article/details/97794685
DR模式详解
DR模式实验步骤
实验环境准备
主机 | 服务 |
---|---|
真实主机localhost | 客户端 |
server1 | DS(Director Sever——LVS调度器) |
server2 | RS(Real Server——后端真实提供服务的虚拟机) |
server3 | RS(Real Server——后端真实提供服务的虚拟机) |
注意:我们所有的虚拟机server1-3的实验环境都是rhel7.5版本。
配置各服务器环境
server1(DS)
- 安装软件ipvsadm
yum install -y ipvsadm
ipvsadm -ln # 查看lvs策略
systemctl status ipvsadm.service # 查看服务状态
touch /etc/sysconfig/ipvsadm # 创建该文件,否则服务会启动不了
systemctl start ipvsadm.service # 启动服务
vim /etc/sysconfig/ipvsadm-config
修改:no为yes
IPVS_SAVE_ON_RESTART="yes"
- 利用ipvsadm添加策略
ipvsadm -A -t 172.25.66.100:80 -s rr
# 说明:-A 添加策略 -t 指定VIP:端口 -s 指定调度算法 rr轮询
ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.2:80 -g
ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.3:80 -g
# 说明: -t 指定VIP:端口 -r 指定rs:端口 -g 指定模式为DR模式
- 此时,需要检查一下服务器上是否有80端口被其他服务占用,没有的话,重启ipvsadm服务,发现已经把策略写入配置文件中。
[root@server1 ~]# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1319/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1072/master
tcp6 0 0 :::22 :::* LISTEN 1319/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1072/master
[root@server1 ~]# cat /etc/sysconfig/ipvsadm
[root@server1 ~]# systemctl restart ipvsadm.service
[root@server1 ~]# cat /etc/sysconfig/ipvsadm
-A -t 172.25.66.100:80 -s rr
-a -t 172.25.66.100:80 -r 172.25.66.2:80 -g -w 1
-a -t 172.25.66.100:80 -r 172.25.66.3:80 -g -w 1
- 查看策略,发现已经生效:
[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.66.100:80 rr
-> 172.25.66.2:80 Route 1 0 0
-> 172.25.66.3:80 Route 1 0 0
- 给DS(lvs调度器)添加VIP网卡:
ip addr add 172.25.66.100/24 dev eth0
server2与server3(Real Server)
- 安装Apache,开启并写入各自的发布文件,便于检测实验效果:
yum install -y httpd
[root@server2 ~]# cat /var/www/html/index.html
server2
[root@server2 ~]# systemctl start httpd.service
- 添加一块IP与VIP一致,否则,从RS返回到client的数据包的源地址就不是VIP地址,client不会接收的。
ip addr add 172.25.66.100/24 dev eth0
真实主机上测试
[root@localhost images]# curl 172.25.66.100
server2
[root@localhost images]# curl 172.25.66.100
server3
[root@localhost images]# curl 172.25.66.100
server2
[root@localhost images]# curl 172.25.66.100
server3
发现已经轮询,此时我们查看VIP主机的mac地址:
发现与我们的DS调度器一致,说明正确找到了DS:
我们试着清除一下arp连接:
arp -d 172.25.66.100
再次请求VIP时,发现不轮询访问RS了,只是访问其中一台。
[root@localhost images]# curl 172.25.66.100
server2
[root@localhost images]# curl 172.25.66.100
server2
[root@localhost images]# curl 172.25.66.100
server2
用同样的方法查看VIP的mac地址:
发现与server2一致,说明此时客户端直接访问了RS,并没有经过调度器DS。我们回想一下刚刚的过程,发现DS和RS都有VIP地址,所以client访问时,就会发生这样的情况。
解决方法
我们需要在RS(server2、server3)上设置策略,拒绝接受想要访问VIP的请求。
- 安装arptables,设置相关策略
yum install -y arptables
arptables也有三条链,我们设置INPUT和OUTOUT链上的策略。
[root@server2 ~]# arptables -nL
Chain INPUT (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
arptables -A INPUT -d 172.25.66.100 -j DROP
# 拒绝网络里对于vip的arp请求,也就是避免了误请求
arptables -A OUTPUT -s 172.25.66.100 -j mangle --mangle-ip-s 172.25.66.2
# 将响应的arp源IP地址172.25.66.2改为 172.25.66.100,也就是说,让客户端以为是VIP发回的。
再次查看arptables策略:
[root@server2 ~]# arptables -nL
Chain INPUT (policy ACCEPT)
-j DROP -d 172.25.66.100
Chain OUTPUT (policy ACCEPT)
-j mangle -s 172.25.66.100 --mangle-ip-s 172.25.66.2
Chain FORWARD (policy ACCEPT)
为了防止服务重启失效,将arptables策略保存。
[root@server2 ~]# cat /etc/sysconfig/arptables
# Configure prior to use
[root@server2 ~]# arptables-save > /etc/sysconfig/arptables
[root@server2 ~]# cat /etc/sysconfig/arptables
*filter
:INPUT ACCEPT
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -j DROP -d 172.25.66.100
-A OUTPUT -j mangle -s 172.25.66.100 --mangle-ip-s 172.25.66.2
[root@server2 ~]# systemctl restart arptables.service
[root@server2 ~]# arptables -nL
Chain INPUT (policy ACCEPT)
-j DROP -d 172.25.66.100
Chain OUTPUT (policy ACCEPT)
-j mangle -s 172.25.66.100 --mangle-ip-s 172.25.66.2
Chain FORWARD (policy ACCEPT)
当然,server3设置同上。
再次测试
发现无论如何清楚arp连接,都是通过DS轮询访问两个RS,说明我们的lvsDR模式设置成功!!
[root@localhost images]# arp -d 172.25.66.100
[root@localhost images]# curl 172.25.66.100
server2
[root@localhost images]# curl 172.25.66.100
server3
[root@localhost images]# arp -d 172.25.66.100
[root@localhost images]# curl 172.25.66.100
server2
[root@localhost images]# curl 172.25.66.100
server3