一、概述
通过修改请求报文的目标MAC地址,然后根据算法挑选出合适的RS节点,进行转发。(请求进入DS Server时做MAC地址替换,后端返回数据报文时无需经过DS Server节点,直接返回给客户端即可)
1、DR基础图解
2、DR底层实现
1、路由器如何找到VIP以及MAC地址呢
路由器通过ARP广播获取VMAC,然后封装CIP、VIP、CMAC、VMAC,通过交换机转发至目标主机
2、RS处理请求直接返回给CIP,不经过DS,那么RS如何将数据包回传给CIP
由于CIP请求的时VIP,而响应是通过RIP响应给CIP,所以数据报文一定会被丢弃,那么就需要在所有的RS的接口上配置VIP的地址,由RS上的VIP响应给CIP即可
3、所有RS节点都配置VIP,那么路由器在广播的时候,岂不是所有的VIP都会响应
方式1:在路由器上静态绑定VIP和VMAC的关系。(但可能没有操作权限)
方式2:在所有RS节点上配置ARP抑制,简单来说就是路由器广播获取VMAC时,所有的RS都不应答,其次所有的RS都不对外宣布自己的VIP
4、VIP、DIP、RIP需要再同一网段中吗
一般来说DIP和RIP在同一物理网络中,并不一定在同一网段中。
3、DR访问流程
1、当用户请求到达DS节点,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP
2、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
3、IPVS比对数据包请求的服务是否为集群服务,是则将请求报文中的源MAC修改为DMAC,将目标MAC修改为RMAC,然后将数据包通过POSTROUTING链
发出,此时的源IP和目的IP均未修改,仅将源MAC修改为DMAC,目标MAC修改为RMAC
4、RS拆解数据报文发现请求的IP地址是本机,则会接收该数据报文,而后构建响应报文向外发出,此时的源IP是VIP,目标IP是CIP
5、响应报文最终送达至客户端
4、DR特性总结
1、请求报文必须由DS节点转发,但响应报文必须不经过DS节点
2、RS不能将网关指向DS节点的DIP
3、DS和RS节点必须位于同一物理网络中
4、DR模型不支持地址转换,也不支持端口映射 #意味着ipvsadm设置的端口和后端端口必须一致
5、RS可以是常见的操作系统Windows、Linux、MacOS
6、RS在lo接口上配置VIP
5、DR ARP参数
arp_ignore (控制系统在收到外部的arp请求时,是否应答)
0默认值,将本机所有接口的所有信息向每个连接的网络进行通告
1只应答本地主机访问网络接口(eth0-->lo,才给予响应
arp_announce (控制系统是否对外宣布自己的地址)
0默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1"尽量避免"将接口信息向非直接连接网络进行通告
2"必须避免"将接口信息向非本网络进行通告
6、DR模型场景实践
1、客户端:
eth0: 10.0.0.10 gateway:
eth1: 关闭
[root@client ~]# ifdown eth1
[root@client ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.10
PREFIX=24
2、路由器:
eth0: 10.0.0.200 gateway: 10.0.0.2
eth1: 172.16.1.200
开启forward
eth0:
[root@route ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.200
PREFIX=24
GATEWAY=10.0.0.2
DNS1=223.5.5.5
eth1:
[root@route ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.200
PREFIX=24
开启forward
[root@route ~]# sysctl -p
net.ipv4.ip_forward = 1
清理IPtables规则
[root@route ~]# iptables -t nat -F
[root@route ~]# iptables -t nat -L -n
3、RS1节点: R2节点,除了eth1的IP不一样,其他所有操作一致;
eth0: 关闭
eth1: 172.16.1.5 gateway: 172.16.1.200
nginx
lo:0: 172.16.1.100
arp参数:
3.1.关闭eth0接口;
[root@proxy01 ~]# ifdown eth0
3.2.配置eth1IP地址:
[root@proxy01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.5
PREFIX=24
GATEWAY=172.16.1.200
[root@proxy01 ~]# ifdown eth1 && ifup eth1
3.3.配置Nginx
[root@proxy01 ~]# cat /etc/nginx/conf.d/lvs.qingchen.net.conf
server {
listen 80;
server_name lvs.qingchen.net;
root /opt;
location / {
index index.html;
}
}
3.4.配置VIP地址;
[root@proxy01 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@proxy01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=172.16.1.100
NETMASK=255.0.0.0
ONBOOT=yes
NAME=loopback
[root@proxy01 ~]# ifdown lo:0 && ifup lo:0
3.5.配置arp抑制:不对外宣告本机VIP地址,也不响应其他节点发起ARP请求本机的VIP
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/default/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/default/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
3.6检查RS节点路由信息
route -n
0.0.0.0 127.16.1.200 0.0.0.0 UG 100 0 0 eth1
4、LVS:
eth0: 关闭
eth1: 172.16.1.3 gateway: 172.16.1.200
vip: 172.16.1.100
配置LVS规则,配置DR模型:
[root@lvs01 ~]# ipvsadm -A -t 172.16.1.100:80 -s rr
[root@lvs01 ~]# ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.5:80 -g
[root@lvs01 ~]# ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.6:80 -g
[root@lvs01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.100:80 rr
-> 172.16.1.5:80 Route 1 0 0
-> 172.16.1.6:80 Route 1 0 0
5、端口路由器的映射:
[root@route ~]# iptables -t nat -A PREROUTING -d 10.0.0.200 -p tcp --dport 80 -j DNAT --to 172.16.1.100:80
[root@route ~]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.200 tcp dpt:80 to:172.16.1.100:80
6、客户端验证
curl -HHost:lvs.qingchen.net http://10.0.0.200