LVS NAT模式与FULLNAT模式原理与配置差别
注意:
LVS NAT模式是LVS原生的一种工作方式,而FULLNAT是在NAT模式下通过配置SNAT来
实现FULLNAT的,而且配合SNAT这部分是靠我们自己来实现的
1、LVS NAT模式原理与特点
NAT模式的数据包请求流程:
- 1、当用户请求到达 Director Server,此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源 IP 为 CIP,目标 IP 为 VIP
- 2、PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
- 3、IPVS 比对数据包请求的服务是否为集群服务,若是,修改数据包的目标 IP 地址为后端服务器 IP,然后将数据包发至 POSTROUTING 链。 此时报文的源 IP 为 CIP,目标 IP 为 RIP
- 4、POSTROUTING 链通过选路,将数据包发送给 Real Server
- 5、Real Server 比对发现目标为自己的 IP,开始构建响应报文发回给 Director Server。 此时报文的源 IP 为 RIP,目标 IP 为 CIP
- 6、Director Server 在响应客户端前,此时会将源 IP 地址修改为自己的 VIP 地址,然后响应给客户端。 此时报文的源 IP 为 VIP,目标 IP 为 CIP
NAT模式特点:
- RS 应该使用私有地址,RS 的网关必须指向 DIP
- DIP 和 RIP 必须在同一个网段内
- 请求和响应报文都需要经过 Director Server,高负载场景中,Director Server 易成为性能瓶颈
- 支持端口映射
- RS 可以使用任意操作系统
2、为什么需要LVS FULLNAT模式
LVS NAT模式下,一般需要设置RS 的网关必须指向 DS:
因为RS收到的包的源ip是client ip,如果不设置RS 的网关必须指向 DS,默认将包送回DS,再由DS回复给client的话,那么RS直接回给client就会有问题,因为client发出的时候目的ip是vip,不是RS的ip,那么此时client对RS直接回过来的包会回复RST来终止这个连接,因为在client看来,不认为这个包是自己发出去的请求包的回包
如果采用LVS NAT + MASQUERADE实现FULLNAT的话,则不会有这个问题,因为RS看到的ip是DS的ip,也就是DS对client和对RS实现了双边连接,从而达到FULLNAT目的。虽然NAT模式也是RS流量都回给DS的,但是得将RS的默认网关设置为DS,这样有两个问题:
- 需要操作RS(有时候RS你没有权限操作,有可能是别人是server,你是LB提供方)
- 如果一个RS同时是多个DS的后端,这时候你无法配置一个RS有多个默认网关,而且你无法区分流量要给哪个DS
因此如果你是LB的提供方,你提供vip和负载均衡能力的时候只能使用FULLNAT,从而实现对于client和RS都无感知!
3、LVS NAT配合MASQUERADE实现FULLNAT要注意的地方
1、需要开启两个内核特性:
- net.ipv4.ip_forward
- net.ipv4.vs.conntrack
2、需要添加MASQUERADE
iptables -t nat -A POSTROUTING -m ipvs --vaddr xxxx --vport xxxxx -j MASQUERADE
3、参数的作用参考之前的博文:
- 【博客514】k8s中net.ipv4.ip_forward=1的意义
- 【博客607】linux路由过程分析与net.ipv4.ip_forward参数
- 【博客578】LVS NAT配合MASQUERADE实现FULLNAT的场景,及此场景下net.ipv4.vs.conntrack参数的重要作用
4、LVS NAT模式下为什么不需要开启net.ipv4.ip_forward和net.ipv4.vs.conntrack
原因是LVS NAT模式自己实现了一套连接跟踪机制,原理如下:
- 【博客588】ipvs nat模式下独立于iptables与conntrack的连接跟踪表和NAT机制