详解正向代理、反向代理和负载均衡的真实区别

政林 2021-01-04 4480浏览 1条评论
首页/正文
分享到: / / / /

详解正向代理、反向代理和负载均衡的真实区别

一、正向代理介绍

正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

这种代理其实在生活中是比较常见的,比如科学上网技术,其用到的就是代理技术。

有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。所以,正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器"进行交互。通过正向代理服务器访问目标服务器,目标服务器是不知道真正的客户端是谁的,甚至不知道访问自己的是一个代理。

1.1 正向代理的用途

  • 突破访问限制

通过代理服务器,可以突破自身IP访问限制,访问国外网站,教育网等。即,租客可以通过中介,来解决无法联系上房东的问题。

  • 提高访问速度

通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。即,中介手里留存了很多房源信息和钥匙,可以直接带租客去看房。

  • 隐藏客户端真实IP

上网者也可以通过这种方法隐藏自己的IP,免受攻击。

二、反向代理介绍

反向代理(reverse proxy):是指以代理服务器来接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就变现为一个反向代理服务器。对于常用的场景,就是我们在Web开发中用到的负载均衡服务器,客户端发送请求到负载均衡服务器上,负载均衡服务器再把请求转发给一台真正的服务器来执行,再把执行结果返回给客户端。

所以,反向代理,其实是"代理服务器"代理了"目标服务器",去和"客户端"进行交互。通过反向代理服务器访问目标服务器时,客户端是不知道真正的目标服务器是谁的,甚至不知道自己访问的是一个代理。

2.1 反向代理的用途

  • 隐藏服务器真实IP

使用反向代理,可以对客户端隐藏服务器的IP地址。
即,租客并不房东知道的真实身份。

  • 负载均衡

反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。

  • 提高访问速度

反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。

  • 提供安全保障

反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。

三、正向代理和反向代理的区别

虽然正向代理服务器反向代理服务器所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端,但是二者之间还是有一定的差异的。

  • 正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。
  • 正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。
  • 正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的客户端。
  • 正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度

再谈负载均衡。负载均衡的出现,是通过横向的扩展,尽可能地降低单台服务器的压力。常见WEB层面的负载均衡的方案有硬件F5、Nginx代理、LVS、各个云商的负载均衡服务(如AWS的ELB服务)等。负载均衡后面连的一般是实际提供服务的服务器,如通过ELB服务,可以做到流量的均匀分担,从而减少单机服务器的压力。

四、常用的是四层和七层负载均衡

1、二层负载均衡

负载均衡服务器对外依然提供一个VIP(虚IP),集群中不同的机器采用相同IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。

2、三层负载均衡

和二层负载均衡类似,负载均衡服务器对外依然提供一个VIP(虚IP),但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。

3、四层负载均衡

四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。

4、七层负载均衡

七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。

5、负载均衡工具

市面上有很多开源的负载均衡的工具或软件,基本都是基于前面提到的方案实现的,大多数是工作在第七层和第四层的。Nginx/LVS/HAProxy 是目前使用最广泛的三种负载均衡软件。

1. LVS

LVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

LVS主要用来做四层负载均衡。

2. Nginx

Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。

Nginx主要用来做七层负载均衡。

3. HAProxy

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

在整个报文交互过程中,采用 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的请求报文也会直接丢弃报文,不作回应。

 

九、负载均衡算法

负载均衡算法分为两类:静态负载均衡算法动态负载均衡算法

静态负载均衡算法包括:轮询,比率,优先权

动态负载均衡算法包括: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务器补充,服务质量,服务类型,规则模式。

  • 轮询(Round Robin):顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。
  • 比率(Ratio):给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配, 直到其恢复正常。
  • 优先权(Priority):给所有服务器分组,给每个组定义优先权,BIG-IP 用户的请求,分配给优先级最高的服务器组(在同一组内,采用轮询或比率算法,分配用户的请求);当最高优先级中所有服务器出现故障,BIG-IP 才将请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
  • 最少的连接方式(Least Connection):传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配, 直到其恢复正常。
  • 最快模式(Fastest):传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
  • 观察模式(Observed):连接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
  • 预测模式(Predictive):BIG-IP利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的请求。(被BIG-IP 进行检测)
  • 动态性能分配(Dynamic Ratio-APM):BIG-IP 收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。
  • 动态服务器补充(Dynamic Server Act.):当主服务器群中因故障导致数量减少时,动态地将备份服务器补充至主服务器群。
  • 服务质量(QoS):按不同的优先级对数据流进行分配。
  • 服务类型(ToS): 按不同的服务类型(在Type of Field中标识)负载均衡对数据流进行分配。
  • 规则模式:针对不同的数据流设置导向规则,用户可自行。

以上,就是目前实现负载均衡的主流算法。不同的负载均衡服务器会选择不同的算法。

十、总结

由于反向代理模式中在RS侧只能收到源为负载均衡设备IP的报文,因此可以使用防火墙增加安全性,只允许源IP为负载均衡设备的IP地址的报文通过,同时增加X-Forwarded-For字段也可以让RS只允许有此字段的报文进行访问,因此安全性相对较高。负载均衡,是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。为了提升网站的各方面能力,我们一般会把多台机器组成一个集群对外提供服务。然而我们的网站对外提供的访问入口都是一个的,比如当用户访问www.taobao.com的时候将用户的请求分发到集群中不同的机器上。

点击这里给我发
消息
最后修改:2021-01-04 22:46:02 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

评论列表

匿名用户 2022-03-31 00:26:59
[url=https://oscialipop.com]cialis 20mg[/url] Qdsozh Direct Levaquin Website Internet <a href=https://oscialipop.com>cialis coupons</a> Cialis 20mg 8 Filmtabl https://oscialipop.com - Cialis Precio De La Viagra En Farmacias
回复