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的请求和应答

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部