LVS的NAT模式

上次总结了DR模式的转发流程这次模拟一下LVS的NAT模式来抓包分析一下流程

LVS NAT原理

类似于防火墙的私有网络结构,Director Server作为所有服务器节点的网关,即作为客户端的访问入口,也是各节点回应客户端的访问出口,其外网地址作为整个群集的VIP地址,其内网地址与后端服务器Real Server在同一个物理网络,Real Server必须使用私有IP地址。

LVS的NAT模式_第1张图片

数据包流向分析:

用户发送请求到Director Server,请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。

内核空间判断数据包的目标IP是本机,此时IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,重新封装数据包(源IP为CIP,目标IP为RIP),然后选路将数据包发送给Real Server。

Real Server比对发现目标IP是本机的IP,重新封装报文(源IP为RIP,目标IP为CIP)发回给Director Server。

Director Server重新封装数据包,将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。

NAT模型的特点

(1)RS必须使用私有IP地址,网关指向DIP。

(2)DIP与RIP必须在同一网段内。

(3)DS作为所有服务器节点的网关,也就是说请求和响应报文都需要经过Director Server。

(4)支持端口映射,高负载场景中,Director Server压力比较大,易成为性能瓶颈。

实验环境:GNS3

实验拓扑:

LVS的NAT模式_第2张图片

本拓扑中,内网网段是192.168.1.0/24,外网网段是192.168.2.0/24两个RS的ip地址分别是192.168.1.2和192.168.1.3,lvs的内网ip地址为192.168.1.1,外网ip是192.168.2.1,client的ip为192.168.2.2

环境搭建:

1. 按照拓扑所示在各个虚拟机上配置ip地址

lvs

RS1

RS2

client

2. 在lvs上配置用iptables配置nat转发

192.168.1.0/24是内网网段,ens37是连接外网的网卡

3. 用ipvsadm添加服务

这里采用简单的轮询算法,-m表示使用nat模式

4. 在RS上添加路由并开启http服务

在client上使用curl命令查看效果

LVS的NAT模式_第3张图片

抓包分析过程:(以请求到web2上为例)

在lvs的两侧进行抓包来分析这个过程,在client和lvs之间的链路上抓包结果如下

前三个包是tcp连接建立的三次握手的过程,来看一下第一个syn数据包

可以看到这个数据包的源ip是client的IP,源mac是client的mac,目的ip是lvs的公网ip,目的mac是lvs的外网网卡的mac地址,这个syn数据包在lvs的另一个链路上的结果为

LVS的NAT模式_第4张图片

可以看到这个syn数据包的源ip和源端口同样是client的ip,但是目的ip被lvs转换成了web2的IP地址,源mac是lvs的连接内网的网卡的mac地址,目的mac是web2的mac地址,这样交换机会把这个数据包转发给web2,web2收到这个数据包后会返回syn,ack数据包

LVS的NAT模式_第5张图片

可以看到这个数据包的源ip是web2的IP地址目的ip是client的ip地址,源mac是web2的mac,目的mac是lvs的内网网卡的mac地址,这个数据包经过lvs后会变成这样

LVS的NAT模式_第6张图片

可以看到源ip地址变成了lvs的外网ip地址,目的ip还是client的IP,源mac是lvs的外网网卡的mac地址,目的mac是client的mac地址,这样这个syn,ack数据包就会返回给client,client收到这个数据包后发发送第三次握手请求,整个过程和刚才的过程一样,都是经过lvs后,目的ip地址会变成RS的IP地址,而请求的响应经过lvs后源ip会变成lvs的ip地址,所以整个总结起来如下:

(1)客户端请求lvs的公网ip(即VIP)

(2)所有的请求经过lvs后目的ip会变成内网RS的ip地址,源ip不变(源ip是客户端的ip),即发生DNAT

(3)所有的响应经过lvs后源ip会变成lvs的公网ip地址,目的ip不变(目的ip是客户端的ip),即发生SNAT

(4)对于MAC地址的更新过程和三层交换一样,都是经过lvs后把对链路层解封装,然后根据各主机的mac地址对mac地址重新封装,因此可以把lvs比作一个三层交换设备

所以从这个过程来看,lvs的功能=三层交换+对源ip或者目的ip的转换

端口转换:

另外,lvs的nat模式同样支持端口转换,在刚才的实验环境基础上做出如下改变

1. 修改/etc/httpd/conf/httpd.conf改变web1和web2的http服务的端口

然后用systemctl restart httpd命令重启http服务

2. 改变ipvsadm注册的服务,将vip的80端口关联到RS的8080端口

LVS的NAT模式_第7张图片

改变之后,在client上使用curl进行请求发现还是可以进行的

LVS的NAT模式_第8张图片

这说明lvs的nat模式支持端口转换,来抓包看一下这个过程,同样以请求到web2为例,首先client还是发送syn数据包

这个数据包和没有使用端口转换的情况是一样的,经过lvs的转换后数据包会变成这样

 

 
  LVS的NAT模式_第9张图片

 

 

可以看到这个数据包的源ip还是不变,目的ip变成了web2的ip地址,源端口不变还是客户端的端口,但是目的ip已经转换成了8080,也就是变成了RS的开放的http服务的端口,这样这个数据包可以被RS来处理,RS收到这个syn数据包后会返回如下syn,ack数据包

LVS的NAT模式_第10张图片

目的ip和目的端口都是客户端的,但是源ip和源端口是web2的,经过lvs转换后会变成这样

LVS的NAT模式_第11张图片

源ip和源端口都会变成lvs的VIP和当时在ipvsadm上注册的80端口,目的ip和目的端口还是客户端的,后边的数据包的转换过程和上述过程一样

 

可以看出来关于端口的转换逻辑和ip转换的逻辑也是一样的,所以总结起来:

(1)客户端请求lvs的vip和端口

(2)所有的请求经过lvs后目的ip会变成内网RS的ip地址,目的端口转换为RS的端口,源ip不变和源端口不变(源ip是客户端的ip,源端口是客户端的端口)

(3)所有的响应经过lvs后源ip会变成lvs的公网ip地址,源端口会变成lvs的端口,目的ip不变和目的端口不变(目的ip是客户端的ip,目的端口是客户端的端口)

 

那么DR模式是否支持这种端口转换呢

按照上次笔记构建出来lvs的DR模式的实验环境

LVS的NAT模式_第12张图片

按照刚才的做法,我们把web1和web2的http的端口改成8080,并在ipvsadm上注册相应的服务

此时在客户端上使用curl命令发现请求是失败的

来抓包看一下这个过程为什么会失败,首先看到client会发送syn数据包

LVS的NAT模式_第13张图片

目的端口是80,目的mac是lvs的mac,lvs收到这个数据包后会对其进行转换

LVS的NAT模式_第14张图片

可以看到,转换后的数据包目的mac变成了web1的mac地址,但是目的端口没有做出改变,而此时web1的http端口是8080,所以不能正常建立连接,也就是说lvs工作在DR模式的时候是不支持端口转换的,所以即使是lvs接收到客户端的请求后将目的mac转换为RS的mac地址,但是端口不是RS的端口仍然是无法建立连接的

为了能够实现这种端口转换,可以在RS上配置iptable来实现端口转换,在RS上输入如下命令

LVS的NAT模式_第15张图片

这样就实现了在RS上的的80和8080端口之间的转换,再次实验发现可以正常工作

LVS的NAT模式_第16张图片

这个时候当RS再次收到经过lvs转发的报文的时候,即使是端口没进行转换,但是在RS上进行了转换,也能将这个数据包发到8080端口上,从而能够正常提供http服务,同时经过RS返回给客户端的响应的源端口也会是80端口而不是8080端口,这样就和客户端发出请求的目的端口是一致的,这样这个通信就能够正常进行,以下是抓到的RS返回给客户端的syn,ack数据包

LVS的NAT模式_第17张图片

 

你可能感兴趣的:(LVS,NAT模式)