DR模式(直接路由)
概念
- Direct Routing,简称DR模式
- 采用半开放式的网络结构,与TUN模式的结构类似,但内网服务器并不是分散在各地,而是与调度器位于同一个物理网络
- 负载调度器与内网服务器通过本地网络连接,不需要建立专用的IP隧道
- 因为调度器只接收外网的请求,内网服务器的响应则是直接由网关路由出去,所以减轻了调度器的压力
- 针对大规模集群
忽略网关的DR模式工作原理
这里简化工作流程,忽略网关来讲解局域网内数据的转发流程
也就是说目前的场景是:内网中的交换机、后端服务器、调度器
-
外网客户端发送请求数据包
- 网络层:源IP地址为客户端IP,目标IP地址为LVS的VIP(Virtual IP)地址
- 传输层:源IP的一个随机端口。VIP的80端口
- 数据链路层:源MAC地址是客户端的MAC地址,目标MAC地址是调度器的MAC地址
-
交换机接收到数据包后
- 交换机收到数据包后,根据MAC地址表来转发给对应的调度器
- 交换机将下一跳的源MAC地址是交换机的MAC地址,目标MAC地址修改为调度器的MAC地址,封装成数据帧,然后传递给调度器
-
调度器转发数据包到后端服务器
- 调度器将收到的数据包根据调度策略分配给选定的后端服务器
- 网络层:此时源地址还是客户端的IP地址保持不变,目标IP地址还是VIP
- 调度器不能转发数据包,而是调度,数据包内的源、目标地址不变
- 数据链路层:调度器重新封装数据帧,源MAC地址是调度器的MAC地址,目标MAC地址是后端服务器的真实MAC地址
-
后端服务器处理请求
- 后端服务器收到请求后去掉帧头部信息解析,进行应答,生成响应的数据包
- 网络层:此时响应数据包的源IP地址是后端服务器虚拟子 接口绑定的VIP,目标IP地址是客户端的IP
- 数据链路层:后端服务器重新封装数据帧,源MAC地址是后端服务器的MAC地址,目标MAC地址是客户端的MAC地址
- (如果不忽略网关的话,目标MAC地址就是网关的内网接口MAC地址)
-
交换机转发响应给外网客户端
- 最后,交换机将响应数据包返回给外网客户端
- 此时源MAC地址是交换机的MAC地址,目标MAC地址是客户端的MAC地址
- 如果有网关:网关重新封装数据帧,源MAC地址是网关的外网接口MAC地址,目标MAC地址是客户端的MAC地址
注意
IP地址的重要性
- 源IP地址:在整个通信过程中,源IP地址标识了数据包的发送方,即客户端的地址。这是确保服务器能够正确返回响应的关键。
- 目标IP地址:目标IP地址则标识了数据包的最终接收方,如调度器或后端服务器的地址。这确保了数据包在网络中正确路由到达目的地。
注:如果在传输过程中源IP地址被修改,会导致客户端不接受该数据包,从而导致通信失败或安全问题。
数据帧的重新封装
- 数据帧在每个网络设备之间传输时,会根据下一个设备的MAC地址进行重新封装。这是数据链路层的操作,确保数据能够通过物理网络正常传输。
- 每次重新封装时,会保留原始的网络层(IP层)信息,包括源和目标IP地址。这样做的目的是确保数据包在经过多个网络设备时,能够继续被正确地路由到下一个目标,直到达到最终的接收方。
DR模式中的关键问题
每个节点的VIP
在LVS-DR负载均衡群集中,负载均衡器与节点服务器都要配置相同的VIP地址
为什么VIP要在每个节点上都配置?
是为了让后端服务器生成的响应报文的源地址始终保持是VIP,客户端请求的是VIP,最后应答的也是VIP,保持一致
后端服务器真实IP接收—VIP应答
后端服务器接收请求用的是自己的真实IP接收的,但是响应请求的源地址用的却是VIP
解决方法
需要在每一个后端服务器设置路由条目
本主机内两个网卡接口的路由
本地回环增加一个子接口
当使用ens33网卡收到报文后,如果访问的是VIP的地址,就交给lo:0去处理报文封装
通过路由条目把下一跳修改为本地的另一个虚拟网卡(lo:0)
注:所以DR模式叫做直接路由
ARP
如果交换机和调度器是第一次通信,就需要发出ARP广播来查找调度器服务器
但是在局域网中调度器和后端服务器具有相同的VIP地址,会造成各服务器ARP通信的混乱
- 当ARP广播发送到LVS-DR集群时,因为调度器和后端服务器都是连接到相同的网络上,他们都会接收到ARP广播
- 应该设置只有前端的调度器进行响应。其他后端服务器不响应 该ARP广播
解决方法
- 对后端服务器进行处理,使其不响应针对VIP的ARP请求
- 使用虚拟接口lo:0承载VIP地址
- 设置内核参数arp_ignore=1表示系统只响应目标地址为本地真实IP的ARP请求
IP地址
- 当交换机第一次与调度器通信后,网关内ARP缓存表存储的是VIP对应调度器的MAC地址
- 但是到后端服务器发送响应报文给网关时,这个响应报文的源地址还是VIP但是MAC地址就变成了后端服务器的MAC地址
- 网关接收到响应以后,会发现VIP对应的MAC地址与ARP缓存表记录的信息对不上
- 此时如果不处理,那么下次再有外网请求转发时就会直接发送给后端服务器,而不是调度器了
解决方法
对后端服务器进行处理,设置内核参数arp_announce=2表示系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
设置完参数以后,后端服务器再发送报文的IP地址就不使用VIP作为地址,而是使用自己的真实地址来发送报文,那么网关接收到了报文就不会冲突了
注:发送ARP请求时,Linux默认使用IP包的源IP地址(VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址
总结
后端服务器的VIP不参与ARP的请求和应答