正向代理与反向代理

正向代理与反向代理

客户端在访问目标服务器时,可能会遇到:1) 目标服务器允许客户端访问,但受到其他限制(如客户端防火墙等)导致客户端无法访问目标服务器的情况;2)目标服务器拒绝客户端访问资源(如服务器端防火墙、IP限制等)的情况。

正向代理与反向代理则是分别用于应对这两种情况的。

第一种情况下,为了能够访问到目标服务器,我们就在客户端与目标服务器中间设立一个代理服务器(当然要确保代理服务器可以访问目标服务器),客户端向代理服务器发送一个请求,告知代理要访问的目标服务器,代理接收到请求后向目标服务器转交访问请求并且将获得的内容返回给客户端。

第二种情况下,为了能够访问到目标服务器,我们也要在客户端与目标服务器中间设立一个代理服务器(当然也要确保代理服务器可以访问目标服务器),客户端向目标服务器发送请求(实际是发到了反向代理服务器上),反向代理访问目标服务器并且将获得的内容返回给客户端;这个行为是将目标服务器上的资源反代到了代理服务器上,使得客户端可以访问。

区别

个人认为正向代理与反向代理最本质的区别在于代理服务器代理的是客户端还是目标服务器端:如果代理服务器与客户端常态连接[1],那么我们认为其代理的是客户端,称其为正向代理;如果代理服务器与目标服务器端常态连接,那么我们认为其代理的是目标服务器端,称其为反向代理。

看一下其他文章的看法[2]
有一些文章强调反向代理对客户端是透明的(即反向代理隐藏了真实的服务器端),没有隐藏客户端,客户端不需要进行任何配置;正向代理对服务器端是透明的(即正向代理隐藏了真实的客户端),隐藏了客户端,客户端需要进行配置。

对于前者,我认为这是局限于反向代理服务器为目标服务器服务的场景(如负载均衡、静态缓冲等),并不恰当;在解除目标服务器对IP的限制等反向代理为客户端服务的场景下,反向代理变为对服务器端透明了,而且可能隐藏了客户端,此时客户端是需要配置指向反代服务器;而如果是内网穿透场景,客户端和目标服务器端都需要配置,反代服务器对任何一方都不是透明的。

对于后者,科学访问、加速访问等场景下,客户端是需要进行配置的,如果正向代理用来做授权访问的话,通常客户端就不需要配置,至于是将客户端的IP暴露给服务器端(正向代理对服务器端透明,客户端未被隐藏),还是将正向代理的IP暴露给服务器端(正向代理隐藏了客户端,对服务器端并不透明)也不确定。

也就是说,代理服务器的透明与否、是否隐藏客户端完全取决于代理服务器自身的配置,由此又有透明代理、匿名代理、混淆代理、高匿代理的区别[3];是否需要配置客户端则完全由应用场景决定。

正向代理应用场景

  • 科学访问

如图1所示,假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

  • 加速访问

仍如图一所示,假设路由器R1、R2已经恢复连接,但是用户A通过路由器R1、R2访问到服务器B的速度较慢,而通过代理服务器为访问服务器B的速度更快,人们就会使用代理服务器来加速访问。

  • 缓存(Cache)

仍如图一所示,如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B上得数据J,那么代理服务器Z会把数据J保存一段时间,如果有人正好取该数据J,那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A。这一技术被称为缓存命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据J,而不必再去服务器B下载数据了。

  • 客户端授权访问

)

如图2所示,在内网中,用户A和用户B都设置了代理服务器,如果A有访问互联网的权限,用户A被允许访问互联网,则可以通过代理服务器Z访问到服务器B;用户B不被允许访问互联网,其访问服务器B的数据包就会被丢弃。授权在代理服务器Z上做出。

反向代理应用场景

  • 用于负载均衡

1)需要有一个负载均衡设备来分发用户请求,将用户请求分发到空闲的服务器上
2)服务器返回自己的服务到负载均衡设备
3)负载均衡将服务器的服务返回用户

  • 缓存(Cache)

反向代理也可以用于缓存,客户端访问时可以从代理服务器直接读回数据。常有人将反向代理的缓存功能用于镜像网站的制作。

  • 用于内网穿透

反向代理用于内网穿透的应用十分广泛。外网通常无法直接访问内网,但如果为内网设备配置了反向代理,客户端就可以透过反向代理服务器访问到内网设备。
更多细节可以移步我的博客 外网访问内网(内网穿透)方法总结 反向代理部分。

  • 解除目标服务器对IP的限制

请看下面的反向代理实例。

正向代理实例

Nginx搭建HTTP正向代理服务器

该实例使用nginx搭建了一个HTTP正向代理服务器,使得公司内网中访问外网受限的电脑可以通过正向代理访问外网。

反向代理实例

自建反代服务器解决云音乐海外限制

该实例搭建了一个反向代理服务器,对网易云音乐网页文件及其 API 接口进行反带,使得网易云音乐客户端可以访问资源;实验的反代服务器位于国外,本身也是受限的,无法访问网易云音乐,但是这里使用了一个小Trick,反代服务器暴露给网易云音乐的是一个查得的国内IP,从而避免了网易云音乐的IP限制。当然,如果服务器本身位于国内,就不必使用这个Trick了。

[Reference]

反向代理为何叫反向代理?
nginx 反向代理
图解正向代理、反向代理、透明代理
Nginx搭建HTTP正向代理服务器
自建反代服务器解决云音乐海外限制


  1. 常态连接并不意味着双方有着绝对的持续连接状态,只要有着必要的映射关系即可。例如反向代理的负载均衡场景,代理服务器会将请求分发到哪些服务器上这是固定了的;再如正向代理的HTTP代理,代理服务器与客户端之间存在HTTP服务(端口)的映射关系,代理服务器具体访问哪个目标服务器则是由客户端指定的,不存在常态连接。 ↩︎

  2. 正向代理和反向代理、透明代理的区别?, 正向代理与反向代理【总结】 ↩︎

  3. 透明代理、匿名代理、混淆代理、高匿代理有什么区别? ↩︎

Author

Forskamse

Posted on

2018-12-13

Updated on

2022-03-29

Licensed under

Comments