一、DR模式:调度器和服务器必须在同一网段,也就是在一个局域网内
LVS-DR模式的工作原理:
1.客户端发出请求到调度器,调度器上的虚拟ip(VIP)根据负载均衡算法选择一台后端服务器(realserver)将数据包转发过去,最后realserver再将数据包转发给用户
2.DR模式下调度器和服务器集群都必须在物理机上有一个网卡通过不分断的局域网相连,也就是通过交换机或者高速的HUB连接,中间没有通过路由器通信
3.VIP(虚拟IP)地址是调度器和服务器共享的,调度器配置的VIP地址是对外可见的(子网掩码为24),用于接收虚拟服务器的请求,但是后端服务器集群配置的(VIP)是不接受外部请求的,只提供内部服务(子网掩码为32)
实验环境:
主机名 | IP | 服务 | 作用 |
---|---|---|---|
server1 | 172.25.22.1 172.25.22.100/24 | ipvsadm | 调度器 |
server2 | 172.25.22.2 172.25.22.100/32 | htttpd arptables | 服务器 |
server3 | 172.25.22.3 172.25.22.100/32 | htttpd arptables | 服务器 |
ipvsadm常用参数
-s | 指定调度算法(十种) |
---|---|
rr | 轮循 |
-t | 指定tcp服务地址(是一个虚拟ip,需要添加) |
-r | 指定服务器(真实服务器的ip) |
-g | 路由直连 |
-a | 添加服务器 |
-A | 添加虚拟服务器 |
-i | TUN隧道模式 |
配置ipvsadm:
1.安装lvs的管理工具ipvsadm,这个工具不用在官网下载,他是linux系统自带的只是没有在内核中,但在镜像中可以找到,将他写进yum仓库中直接下载即可
(1)物理机:
在镜像挂载点找到安装包
[root@foundation22 ~]# cd /var/www/html/westos
[root@foundation22 westos]# ls
(2)server1:
server1作为调度器,将安装包写入yum仓库
[root@server1 ~]# cd /etc/yum.repos.d
[root@server1 yum.repos.d]# ls
rhel-source.repo
[root@server1 yum.repos.d]# vim rhel-source.repo
写入的内容如下:
(3)安装lvs管理工具:ipvsadm
[root@server1 yum.repos.d]# yum install -y ipvsadm
2.server2和server3作为真实服务器(rs),在其中安装httpd,编辑测试页,并且开启服务(这一步因情况而定,有的话就不用安装了)
server2:
[root@server2 ~]# rpm -qa | grep httpd
httpd-tools-2.2.15-29.el6_4.x86_64
httpd-2.2.15-29.el6_4.x86_64
[root@server2 ~]# cat /var/www/html/index.html
<h1>server2.example.com</h1>
[root@server2 ~]# /etc/init.d/httpd start ##开启服务
server3:
[root@server3 ~]# rpm -qa | grep httpd
httpd-tools-2.2.15-29.el6_4.x86_64
httpd-2.2.15-29.el6_4.x86_64
[root@server3 ~]# cat /var/www/html/index.html
<h1>server3.example.com</h1>
[root@server3 ~]# /etc/init.d/httpd start
3.物理机访问服务器测试:
可以访问
[root@foundation22 westos]# curl 172.25.22.2
<h1>server2.example.com</h1>
[root@foundation22 westos]# curl 172.25.22.3
<h1>server3- www.westos.org</h1>
4.server1中配置:
(1)添加虚拟服务器的ip即添加访问的入口(172.25.22.100的80端口)轮循模式方便观察效果,-l列出当前的列表
[root@server1 yum.repos.d]# ipvsadm -A -t 172.25.22.100:80 -s rr
[root@server1 yum.repos.d]# ipvsadm -l
(2)添加两个真实服务器的ip
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.22.100:80 -r 172.25.22.2:80 -g
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.22.100:80 -r 172.25.22.3:80 -g
[root@server1 yum.repos.d]#
[root@server1 yum.repos.d]# ipvsadm -l
(3)保存当前列表的状态
[root@server1 yum.repos.d]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
(4)因为指定的入口是一个虚拟ip,所以现在添加这个虚拟ip到eth0
[root@server1 yum.repos.d]# ip addr add 172.25.22.100/24 dev eth0
[root@server1 yum.repos.d]# ip addr show
5.测试:
此时客户端访问是不会有结果的,因为两台真实服务器上是没有这个虚拟ip的,lvs访问的流程时这样的:
client----> 访问虚拟服务器(vs)----> 再到 真实服务器(rs)----> 再将数据返回给客户端 (client)
所以要在两台真实服务器上添加这个虚拟ip
[root@foundation22 westos]# curl 172.25.22.100
^C
server2:
[root@server2 ~]# ip addr add 172.25.22.100/32 dev eth0
[root@server2 ~]# ip a
server3:
[root@server3 ~]# ip addr add 172.25.22.100/32 dev eth0
[root@server3 ~]# ip a
注意:这里子网掩码设置为32是因为server2和server3真正部署的服务器,不接受外部请求,写32是为了只提供内部服务
再次访问,访问成功,并且采用的是轮循调度:
[root@foundation22 westos]# curl 172.25.22.2
<h1>server2.example.com</h1>
[root@foundation22 westos]# curl 172.25.22.3
<h1>server3- www.westos.org</h1>
在server1中可以查看到每台服务器被访问的次数,两台服务器被访问的次数是一人一次,所以实现了轮循调度
[root@server1 yum.repos.d]# ipvsadm -l
也可以多测试几次观察效果
6.查看虚拟ip的信息,他访问的是一个MAC地址,对比发现这个MAC地址是调度器server1的MAC地址
[root@foundation22 westos]# arp -an | grep 100
? (172.25.22.100) at 52:54:00:23:b4:78 [ether] on br0
查看server1的MAC地址
(1)清除缓存,再次查看没有信息
[root@foundation22 westos]# arp -d 172.25.22.100
[root@foundation22 westos]# arp -an | grep 100
? (172.25.22.100) at <incomplete> on br0
(2)再次访问,出现的只有server3
查看100ip,的信息,这次访问的是server3的MAC地址
[root@foundation22 westos]# curl 172.25.22.100
<h1>server3- www.westos.org</h1>
[root@foundation22 westos]# arp -an | grep 100
? (172.25.22.100) at 52:54:00:2c:f1:db [ether] on br0
查看server3的MAC地址
(3)重复上一步骤,这次出现的是server2的MAC地址
[root@foundation22 westos]# arp -d 172.25.22.100
[root@foundation22 westos]# curl 172.25.22.100
[root@foundation22 westos]# arp -an | grep 100
查看server2的MAC地址:
总结:可以看到在访问的过程中ip没有变,改编的只有MAC地址
在实际的的生产环境中访问的MAC地址,只允许是调度器的,如果访问到后端服务器这显然是不安全的
这个问题的解决方法有两个 1.修改内核参数 2.加arp路由策略
二、配置arp路由策略
1.server2和server3都安装arptables_jf工具
[root@server2 ~]# yum install arptables_jf -y
[root@server3 ~]# yum install -y arptables_jf
安装之后可以arptables-nL查看列表
2.server2和server3都添加以下内容:,这实际上是编写防火墙策略
server2:
[root@server2 ~]# arptables -A IN -d 172.25.22.100 -j DROP
[root@server2 ~]# arptables -A OUT -s 172.25.22.100 -j mangle --mangle-ip-s 172.25.22.2
[root@server3 ~]# arptables -A IN -d 172.25.22.100 -j DROP
##将访问100的请求全部丢弃
[root@server3 ~]# arptables -A OUT -s 172.25.22.100 -j mangle --mangle-ip-s 172.25.22.3
##当自身需要发送数据包是伪装成自己原本的ip
3.物理机测试:
清除缓存之前访问都只能访问到一个服务器
root@foundation22 westos]# curl 172.25.22.100
<h1>server2.example.com</h1>
[root@foundation22 westos]# curl 172.25.22.100
<h1>server2.example.com</h1>
清除缓存,再次访问,出现轮循
查看100ip的信息,出现的是调度器的MAC地址
[root@foundation22 westos]# arp -an | grep 100
? (172.25.22.100) at 52:54:00:23:b4:78 [ether] on br0