LVS的三种模式

9/14/2022

# 1.NAT 与 Full-NAT

Network Address Translation 网络地址转换

# 1.1 NAT

  • 将请求包的 DIP-DPort 转为 RS 的地址 RIP-RPort
  • 将响应包的源地址转为 VIP 的地址

这种只转换目的地址,而不修改源地址的称之为 D-NAT。反之则称之为S-NAT。

此时在 RS 上查看TCP链接的四元组为 CIP:CPort - RIP:RPort

NAT 模式下为了保证响应包能被 DS 处理,RS 的默认网关必须要配置成 DIP,也就变相要求 RS 和 DIP必须在同一个局域网中。

# 1.2 Full-NAT

普通 NAT 对部署的 VLAN 有要求,为解决该问题,在 LVS-NAT 基础上添加了一种新的转发模式 Full-NAT。

  • 对于请求包,目的地址转为RS的地址,同时将源地址改为DIP
  • 对于响应包,源地址改为 VIP 的地址,同时将目的地址改为Client的地址

这种既转换目的地址,又转换源地址的,被称为 Full-NAT。

此时在 RS 上查看TCP链接的四元组为 DIP:DPort - RIP:RPort

# 1.3 ClientIP

Full-NAT 不再要求必须在同一个局域网,性能与 NAT 相比,下降约 10%;

然而带来了另一个问题:数据包被修改后,RS 就无法拿到 client 的真实IP了。

如果确实需要拿到 clientIP,需要 DS和RS 引入扩展模块,然后将 CIP 放入 TCP Option、UDP Option中。

# 2.DR模式

Direct route 直接路由模式。

NAT 模式下,响应数据还要经过分发器,响应数据一般比请求数据大很多,如果能将响应数据直接发给client,将极大降低分发器压力。因此有了DR模式。

  • 只有请求包经过 LVS,并且LVS 没有修改 IP Port,而是修改了 MAC 地址(类似网关)
  • 由于只是修改 MAC 地址,因此要求 DIP 和 RIP 必须在同一个局域网(同NAT)
  • RS 拿到数据包,而数据包是发给 VIP 的;如果 RS 上没有 VIP 会把数据包丢弃。因此DR模式要求 RS上一定也要绑定 VIP。
  • RS处理完数可以直接返回给client,因此RS和CIP的通信的路上,一定不能再有 NAT。

# 2.1原理

VIP 已经绑定到了分发器上,有些甚至还是公网IP,如何做到 RS 上也绑定VIP?

为了防止IP冲突,需要在 RS 实现一个仅对本机可见,对外不可见的 IP 绑定。

实现方式是

  • 将 VIP 绑定到 Loopback 接口
  • 调整 arp 配置中的响应级别和通告级别:对于VIP,不响应,不通告。

# 2.2特性

  • DIP 和 RS 必须在同一网段
  • 不支持端口转发
  • 需要所有 RS 增加配置

# 3.TUN模式/IP-Tunnel模式

DR减少了分发器的压力,但是又要求必须在同一网段。为了解除这个限制,又提出了TUN模式。

  • DS 将原始数据包封装了一层
  • RS 要支持两次IP 数据包拆包的功能

# 4.三种模式对比

  • FULL-NAT 最简单,但是 LVS 压力大
  • DR 对LVS压力小,但是 RS 需要做网络配置,且要求必须在同一局域网
  • TUN 是 DR 的另一种实现,RS不仅要做网络配置,还要支持额外协议,但是解除了必须在同一局域网的束缚

# 5.附录1:ARP相关

# 5.1arp协议

主要包括通告和响应

  • 计算机接入网络后,会广播通报自己的 IP 和 MAC 地

  • 同网段内,如果A想查询某IP的MAC地址,需要发ARP广播。如果B发现A问的是自己,那就响应,如果不是自己就不响应

  • 通告和响应的配置是关联到接口的

# 5.2通告级别

arp_announce 参数,常用的级别有0,1,2

  • 0 - 默认 - 任何接口接入网络后,都会上报本机所有绑定的IP和MAC
  • 1 - 只上报接入同网段的所有绑定
  • 2 - 只上报本接口接入的所有绑定

LVS-DR 模式中,RS的接入接口需要设为2,不上报 VIP

# 5.3响应级别

arp_ignore 参数,常用级别 0,1,2

  • 0 - 默认 - 只要本机有,就响应
  • 1 - 被询问的接口上有被询问的IP时,才响应
  • 2 - 被询问的接口上有被询问的IP 且 必须是同网段

LVS-DR 模式中,RS的接入接口需要设为1或2,不响应VIP

# 6.附录2:简单的网络传输过程

A想发给B,已知项为 A的IP、Port、MAC地址 和 B的IP、Port;但是没有B的MAC地址

A通过自己的子网掩码,比对两个IP。

如果发现 A 和 B 的IP在同网段就走同网段通信,否则走跨网段通信

# 6.1 同网段内传输

  • A 通过 arp 协议获取 B 的 MAC 地址。
  • 发数据包 给网关
  • 网关转发给B

# 6.2 跨网段传输

  • A把数据发给网关(路由器)
  • 网关将数据发给下一跳路由

如果A想A 将数据包发给 网关

# 7.附录3

# 7.1网络连接四元组

标识一个连接的四元组:

  • SIP:Source IP
  • SPort:Source Port
  • DIP:Destination IP
  • DPort:Destination Port

SIP:SPort 组成了源地址

DIP:DPort 组成了目标地址

tcp    0   0 10.208.34.208:443    10.216.18.78:41865    ESTABLISHED 2989/nginx
tcp    0   0 10.208.34.208:443    10.216.17.180:32689   ESTABLISHED 2989/nginx
tcp    0   0 10.208.34.208:443    10.216.18.170:11596   ESTABLISHED 2987/nginx
tcp    0   0 10.208.34.208:443    10.216.18.200:35603   ESTABLISHED 2989/nginx

# 7.2.LVS与 Nginx 对比

Nginx 也是常用的反向代理服务器。其有两种代理方式:

  • 应用层:http、https、grpc、websocket代理
  • 传输层代理:stream

应用层代理更灵活,可配置项更多,如Hostname,请求路径;甚至可以内嵌Lua脚本做更复杂的逻辑判断。

还可以支持更复杂的操作,如:使用gzip压缩数据包。

相应的代价就是应用层代理的性能不如传输层代理。

Nginx 的 传输层代理是通过 stream 模块实现的,类似于LVS。对比如下:

  • Nginx 会与 Client 建立链接,而LVS并不会。
  • LVS的DR和TUN模式下,响应流量由RS直接返回;而Nginx的代理中,响应流量必须经过 Nginx。
  • Nginx对网络架构依赖并不强,而LVS的DR和NAT模式要求LVS集群必须在同一局域网。(Full-NAT不依赖)

# 8.参考