反向代理, 是把一些静态资源存储在服务器上, 当用户有请求的时候, 就直接返回反向代理服务器上的资源给用户, 而如果反向代理服务器上没有的资源, 就转发给后面的负载均衡服务器, 负载均衡服务器再将请求分发给后端的 web 服务器. 区别就是: 反向代理服务器是需要存储资源的, 让用户更快速的接收到资源 负载均衡就是, 为了保证后端 web 服务器的高可用, 高并发, 是不需要要存储资源, 只需要转发用户的请求.
一, SLB 产生背景:
SLB(服务器负载均衡): 在多个提供相同服务的服务器的情况下, 负载均衡设备存在虚拟服务地址, 当大量客户端从外部访问虚拟服务 IP 地址时, 负载均衡设备将这些报文请求根据负载均衡算法, 将流量均衡的分配给后台服务器以平衡各个服务器的负载压力, 避免在还有服务器压力较小情况下其他服务达到性能临界点出现运行缓慢甚至宕机情况, 从而提高服务效率和质量, 因此对客户端而言, RS(real server 实际服务器) 的 IP 地址即是负载均衡设备 VIP(虚拟服务地址 IP) 地址, 真正的 RS 服务器 IP 地址对于客户端是不可见的.
二, SLB 的三种传输模式:
七层 SLB 和四层 SLB 的区别:
四层 SLB: 配置负载均衡设备上服务类型为 tcp/udp, 负载均衡设备将只解析到 4 层, 负载均衡设备与 client 三次握手之后就会和 RS 建立连接;
七层 SLB: 配置负载均衡设备服务类型为 http/ftp/https 等, 负载均衡设备将解析报文到 7 层, 在负载均衡设备与 client 三次握手之后, 只有收到对应七层报文, 才会跟 RS 建立连接.
在负载均衡设备中, SLB 主要工作在以下的三种传输模式中:
反向代理模式
透传模式
三角模式
根据不同的模式, 负载均衡设备的工作方式也不尽相同, 但无论在哪种模式下, 客户端发起的请求报文总是需要先到达负载均衡设备进行处理, 这是负载均衡设备正常工作的前提. 模拟网络拓扑环境:
Client:10.8.21.40
负载均衡设备: 172.16.75.83
- VIP:172.16.75.84
- RS1IP:172.16.75.82
- RS2IP:172.16.75.85
在整个报文交互过程中, 采用 Tcpdump 和 Wireshark 分别在 RS 和 Client 处抓包, 然后使用 Wireshark 进行报文解析.
三, 反向代理模式:
反向代理: 普通的代理设备是内网用户通过代理设备出外网进行访问, 而工作在这种模式下的负载均衡设备, 则是外网用户通过代理设备访问内网, 因此称之为反向代理.
在反向代理模式下:
当负载均衡设备收到客户端请求后, 会记录下此报文 ( 源 IP 地址, 目的 IP 地址, 协议号, 源端口, 目的端口, 服务类型以及接口索引), 将报文目的地址更改为优选后的 RS 设备的 IP 地址, 目的端口号不变, 源地址修改为负载均衡设备下行与对应 RS 设备接口的 IP 地址, 源端口号随机发送给 RS;
当 RS 收到报文后, 会以源为 RS 接口 IP 地址, 目的 IP 设备地址回复给负载均衡设备, 负载均衡设备将源修改为 VIP, 目的端口号修改为客户端的源端口号, 目的 IP 修改为 Client 的源 IP 回复报文.
查看报文解析结果:
配置完成后, Client 访问 RS 服务器, 返回成功, 整个报文交互过程如下 :
Client 和负载均衡设备之间的报文交互过程
RS 和负载均衡设备之间报文交互过程
结果分析
分析整个报文交互过程:
TCP 握手过程:
首先 Client 向负载均衡设备发送 TCP SYN 报文请求建立连接, 源 IP 为 Client 的 IP 10.8.21.40, 源端口号 50894, 目的 IP 为 VIP 地址 172.16.75.84, 目的端口号 80;
收到请求报文后, 负载均衡设备会以源 IP 为 VIP 地址 172.16.75.84, 端口号 80, 目的 IP 10.8.21.40, 目的端口号 50894 回应 SYN ACK 报文;
Client 收到报文后回复 ACK 报文, TCP 三次握手成功.
HTTP 报文交互过程:
当负载均衡设备与 client 完成三次握手后, 因为配置的七层 SLB, 如果收到 HTTP 请求, 就会根据负载均衡算法和服务器健康状态优选出对应的 RS(在这次过程中选择的 RS 设备为 172.16.75.82), 然后与 RS 建立 TCP 连接:
负载均衡设备发送 TCP SYN 报文请求连接, 源 IP 为负载均衡设备与 RS 相连接口 IP 172.16.75.83, 源端口号随机 4574, 目的 IP 为 RS 的 IP 172.16.75.82, 目的端口号 80;
RS 收到报文后, 以源 IP 172.16.75.82, 端口号 80, 目的 IP 172.16.75.83, 目的端口号 4574 回复 SYN ACK 报文, 负载均衡设备回复 ACK 报文建立三次握手;
之后, 负载均衡设备再将收到的 HTTP 报文源 IP 修改为与 RS 相连下行接口 IP 地址 172.16.75.83, 源端口号为随机端口号, 将报文发送给 RS;
当 RS 收到报文后, 使用源为本地 IP 172.16.75.82, 目的 IP 为 172.16.75.83 进行回复, 所以报文直接回复给负载均衡设备;
当负载均衡设备收到 RS 的回应报文后, 将报文的源修改为 VIP 地址 172.16.75.84, 目的 IP 为 10.8.21.40 发送回 Client, 再将目的端口号修改为 HTTP 请求报文中的源端口号, 服务器访问成功.
由上述的过程可以看出, 在 RS 端上, client 的真实 IP 地址被负载设备修改成与 RS 相连接口的 IP 地址, 所以 RS 无法记录到 Client 的访问记录, 为了解决这个问题, 可以采用在 HTTP 报文头中添加 X-Forwarded-For 字段, 本文不做赘述, 可以自行查询.
四, 透传模式:
当负载均衡设备工作在透传模式中时, RS 无法感知到负载均衡设备的存在, 对于 Client 来说, RS 的 IP 地址就是负载均衡设备的 VIP 地址.
在这种模式下, 当负载均衡设备收到源为 Client 的 IP, 目的 IP 为本地 VIP 地址的报文时, 会将报文根据负载均衡策略和健康状况发送给最优的 RS 设备上, 继而 RS 设备会收到目的为本地 IP, 源为 Client 实际 IP 的请求报文;
然后 RS 将会直接回应此请求, 报文的目的 IP 地址为 Client 的 IP 地址, 当负载均衡设备收到此报文后, 将源 IP 地址修改为 VIP 地址, 然后将报文发送给 Client.
报文解析结果:
同样在 RS 端和 Client 端抓取交互报文:
Client 和负载均衡设备之间的报文交互过程
RS 和负载均衡设备之间的报文交互过程
结果分析:
TCP 握手过程:
同反向代理模式交互过程
HTTP 报文交互过程:
Client 向负载均衡设备的 VIP 地址 172.16.75.84 以源 IP 10.8.21.40 发送 HTTP 请求, 当负载均衡设备收到报文后, 与优选后的 RS 进行 TCP 三次握手, 过程同反向代理模式, 然后将收到的 HTTP 报文, 不改变报文的源 IP 地址和源 / 目的端口号, 只修改目的 IP 修改为优选后的 RS 地址 172.16.75.82;
当 RS 收到源来自 IP 10.8.21.40 的报文后, 回复报文给 IP 地址 10.8.21.40, 此时要注意, 必须在 RS 上配置回复报文经过负载均衡设备, 负载均衡设备会将源 IP 修改为 VIP 地址 172.16.75.84, 然后转发给 Client, 否则 Client 将会收到源 IP 为 172.16.75.82 的 HTTP 报文, 服务器访问失败.
五, 三角模式:
在三角模式下, 当客户端发送请求到负载设备上时, 负载均衡设备会计算出最优 RS, 然后直接根据 MAC 地址将报文转发给 RS, 在 RS 上配置报文的源 IP 为 VIP 地址 (一般配置在 loopback 口上), 因此在这种情况下, RS 会直接将报文发送给 Client, 即使回复报文经过负载均衡设备, 此设备不做任何处理. 由于报文在整个过程中传输途径类似于三角形, 因此称之为三角模式.
报文解析结果:
分别在 Client 端和 RS 端抓包, 内容如下:
Client 和负载均衡设备之间的报文交互过程
RS 和负载均衡设备之间的报文交互过程
结果分析:
TCP 握手过程:
由于采用了 4 层 SLB, 所以在 TCP 握手过程中与上述的 7 层 SLB 有些不同, 当 Client 和 RS 完成三次握手之后, 此时负载均衡设备会直接选择 RS, 然后跟 RS 建立 TCP 三次握手;
在三角模式环境中, 由于 RS 的 Loopback 口和负载均衡设备上都存在着 VIP 地址 172.16.75.84, 当负载均衡设备经过负载均衡算法选择出对应的 RS 后, 会根据实际配置的 RS 的 IP 地址对应的 mac 地址, 将报文以目的 mac 为 RS, 目的 IP 为 VIP 的方式建立 TCP 连接.
HTTP 报文交互过程:
首先 Client 向负载均衡设备的 VIP 发送 HTTP 请求, 源为 10.8.21.40, 当负载均衡设备收到报文后, 将报文直接转发给 RS, 当 RS 收到源 IP 为 10.8.21.40, 目的 IP 为本地 Loopback 口 IP 地址 172.16.75.84 的报文后, 直接将报文回复给 10.8.21.40, 同样源为 IP 地址 172.16.75.84, 由此访问服务器成功.
在三角模式中, 由于回复报文负载均衡设备不做任何处理, 所以非常适合于 RS 到 Client 方向流量较大或者连接数目较多的组网环境.
采用三角模式时, 必须注意 RS 有路由可以到达 Client, 并且在 RS 的 Loopback 接口上必须有负载均衡设备的 VIP 地址, 否则即使 RS 设备收到 Client 的请求报文也会直接丢弃报文, 不作回应.
六, 总结
由于反向代理模式中在 RS 侧只能收到源为负载均衡设备 IP 的报文, 因此可以使用防火墙增加安全性, 只允许源 IP 为负载均衡设备的 IP 地址的报文通过, 同时增加 X-Forwarded-For 字段也可以让 RS 只允许有此字段的报文进行访问, 因此安全性相对较高.
来源: https://cloud.tencent.com/developer/article/1091896?fromSource=waitui