DR模式意为Direct Routing(直接路由),是调度器与实际服务器都有一块网卡连在同一物理网段上的情况。
而LVS-DR的工作原理就是:通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址,源IP/PORT,以及目标IP/PORT均保持不变。
(1) Director和各RS都配置有VIP
(2) 确保前端路由器将目标IP为VIP的请求报文发往Director
在前端网关做静态绑定VIP和Director的MAC地址
在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
(3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络; RIP的网关不能指向DIP,
以确保响应报文不会经由Director
(4)RS和Director要在同一个物理网络
(5)请求报文要经由Director,但响应报文不经由Director,而由RS直接发往 Client
(6)不支持端口映射(端口不能修败)
(7)RS可使用大多数OS系统
服务器 | ip | VIP |
---|---|---|
director-server | 192.168.233.150 | 192.168.233.145 |
RS1 | 192.168.233.160 | 192.168.233.145 |
RS2 | 192.168.233.147 | 192.168.233.145 |
1)安装nginx,可以正常访问
访问
[root@localhost html]# curl 192.168.233.160
RS1 192.168.233.160
[root@localhost html]# curl 192.168.233.147
R2 192.168.233.147
确保director-server可以正常访问RS的页面。
2)修改内核参数
这两个RS配置的VIP不对局域网做ARP通报和ARP请求响应,
同时配置路由,目标IP为VIP的报文转发至VIP所在接口,并在各RS上配置好VIP
为了配置方便我们可以写脚本,然后在RS上执行脚本即可
#/bin/bash
#date 2020.3
vip='192.168.233.145'
mask='255.255.255.255'
interface='lo:0'
case $1 in
start)
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
ifconfig $interface $vip netmask $mask broadcast $vip up
route add -host $vip dev $interface
;;
stop)
ifconfig $interface down
echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore
;;
*)
echo "Usage:bash $0 start|stop"
exit 1
;;
esac
如图查看
可以看到执行脚本后VIP和相关路由也都添加成功;
同样RS2也只需要把上面的脚本运行一遍
#### 2.3 在LVS服务器上配置VIP,定义集群服务
lvs-dr模式不需要开启地址转发,ip_forward功能,因为director发给rs的数据包是修改过的包,不是原包,不经过ip_forward转发,而是经过修改后的mac根据l路由决策直接路由到rip
1)首先给director绑定VIP
先查看地址
添加VIP
ifconfig ens33:0 192.168.233.145 netmask 255.255.255.255 broadcast 192.168.233.145 up
route add -host 192.168.233.145 dev ens33:0
2)在Director安装ipvsadm,并添加ipvsadm规则
[root@dr ~]# yum install -y ipvsadm
[root@dr ~]# ipvsadm -A -t 192.168.233.145:80 -s rr
[root@dr ~]# ipvsadm -a -t 192.168.233.145:80 -r 192.168.233.147 -g
[root@dr ~]# ipvsadm -a -t 192.168.233.145:80 -r 192.168.233.160 -g
[root@dr ~]# 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.233.145:80 rr
-> 192.168.233.147:80 Route 1 0 0
-> 192.168.233.160:80 Route 1 0 0
[root@dr ~]service ipvsadm save
[root@dr ~]service ipvsadm restart
-C:清除已有规则。
-A:添加VIP服务,后跟服务的访问地址。
-t:TCP协议,还是UDP协议(-u)。
-s:负载均衡算法,rr表示RoundRobin。
-a:添加RealServer到VIP,后跟虚地址。
-r:添加RealServer到VIP,后跟实地址。
-g:透传模式(-g表示Direct Routing即DR模式,-i表示ipip封装即Tunneling模式,-m表示Network Access Translation即NAT模式)
-p:Session粘连,同一客户端的请求在一段时间内都负载到同一RealServer。
上规则表示添加一个集群服务192.168.233.145:80,调度算法是rr(轮询),在集群服务下添加了2个real server 分别是192.168.233.147和192.168.233.160,并且添加为DR类型
同一个局域网客户机下面进行测试,可以看到显示成功。
[root@lvs ~]# curl http://192.168.233.145
test1
[root@lvs ~]# curl http://192.168.233.145
test2
(1) 在前端网关做静态绑定
(2) 在各RS使用arptables
(3) 在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告