LVS的三种模式
# 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不依赖)