正向代理、反向代理、透明代理

发布于 2016-01-08 来源 原文链接

今天试图了解一下正向代理,反向代理的具体定义和区别,找了几个页面,绕来绕去的搞得更懵了,后来看了其中一篇内容后稍微比较有feel了,也许这篇你觉得其实也还好,请看页面尾部的其他相关的参考资料的图文内容。

转载原文如下:

今天在网上看到有人提问"什么是代理?",看了看回答都算不上太准确,而且有一部分根本没搞清楚代理是什么就乱喷。仔细想了下,发现自己对代理也不算太了解,毕竟用到的也就是简单的翻墙,还是学习下比较好。

正向代理

这个想必大家都比较清楚了,翻墙就是正向代理的经典例子。通俗的说就是:

A用户无法访问twitter,但是我能访问B服务器,而B服务器可以访问twitter。于是我访问B服务器,告诉它" 嗨,伙计,我要访问twitter",B服务器收到请求后,去访问twitter,twitter把响应信息返回给B服务器,B服务器再把响应信息返回给 A。这样,通过B代理服务器,就实现了翻墙。

所以说,正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器),然后代理服务器向原始服务器转发请求并将获得的内容返回给客户端。客户端必须要进行一些设置才能使用正向代理。[注意,这里面指定目标、客户端必须设置是正向代理和反向代理的区别之处]

反向代理

反向代理很大情况是为了保护原始服务器。

比如现在服务器A域名为www.sina.com.cn,黑客H通过技术手段想去攻击,那服务器A可能就会挂掉。但如果我 在H和A之间搞一个代理服务器C冒充原始服务器,那么,对黑客而言,C服务器就是A服务器。即使他真的把C服务器搞挂了,对A服务器也不会有影响。实现起 来也很简单,就是在服务器A设置一个防火墙,保证只有C服务器才能访问A。其他任何请求都会被拒绝。这样就完成了A服务器的隐藏。服务器C实现的功能就叫 做反向代理。

所以说,反向代理是和正向代理相反,对于客户端而言,它就是原始服务器。并且客户端不需要进行任何特别的设置,客户端向反向代理的发送普通请求,接着反向代理将判断向何处(原始服务器)转发请求,并将获得的内容返回给客户端,就像这些内容就是代理服务器自己的一样

区别是神马?

那可能有人会问,正向代理和反向代理都是在H和A之间加一个代理,本质来说都是一样的呀。不管A能不能访问,我都可以搞个代理呀。嗯,这个问题确实应该搞清楚。

1. 从用途上来区分:

  • 正向代理:正向代理用途是为了在防火墙内的局域网提供访问internet的途径。另外还可以使用缓冲特性减少网络使用率
  • 反向代理:反向代理的用途是将防火墙后面的服务器提供给internet用户访问。同时还可以完成诸如负载均衡等功能

2. 从安全性来讲:

  • 正向代理:正向代理允许客户端通过它访问任意网站并且隐蔽客户端自身,因此你必须采取安全措施来确保仅为经过授权的客户端提供服务
  • 反向代理:对外是透明的,访问者并不知道自己访问的是代理。对访问者而言,他以为访问的就是原始服务器

3. 反向代理例子1

假设一种情况,我现在有一个原始服务器A。它没有域名,只有IP地址123.123.123.123,那么我访问只能通过IP地址了。作为一个 WEB应用让用户使用,IP地址是没有任何用户体验而言的。所以我在A服务器和用户之间搞了一个B服务器,B服务器有域名,叫做 www.sina.com.cn吧。现在用户想搜个东西,于是在表单中提交了一个query,请求URL就是 http://www.sina.com.cn/query=jay,然后就出来了相应的界面。于是用户以为它访问的就是原始服务器。但实际情况是如何 呢?

  1. 首先,B服务器只有一个域名,它上面没有query服务
  2. query服务是A服务器运行的程序

所以整个访问过程对用户是透明的:

  1. 用户访问www.sina.com.cn,query后URL为http://www.sina.com.cn/query=jay
  2. B服务器收到请求,将URL重组为http://123.123.123.123/query=jay,发送给A服务器
  3. A机器收到请求,防火墙检查这个请求是否来自B,如果不是则拒绝
  4. A服务器拿到query=jay进行处理,得到结果result
  5. A服务器将result发送给B服务器
  6. B服务器将result发送给用户

这个过程是反向代理的一个经典用法,正向代理就没法完成。因为正向代理服务器根本就没有query=jay这个服务。而反向代理因为是作为原始服务器的伪装,所以用户以为它访问的就是原始服务器。

4. 反向代理例子2

还有一种情况就是负载均衡,比如现在我服务假设在3个国家:中国、美国、瑞典,那么如果是正向代理的话,它是以能访问为目的,所以可能中国的用户正 向代理去请求了美国的服务器,那么响应速度就会很慢。当然了,正向代理也可以判断请求来源,去请求最适合的服务器,但这不是它的强项。

那么,使用反向代理的话,反向代理可以提供强大的负载均衡。比如我们项目目前使用的是Nginx实现的反向代理和负载均衡,Nginx给根据请求的 来源判断将请求发送给哪个机房,同时使用一致性哈希使这个机房的每台机器访问量大致相同,防止出现某个机房的几台机器请求量特别大,另外几台几乎没有请求 的情况出现。

5. 反向代理例子3

假如我的前端代码都是在本地开发,我怎么知道我的代码在线上运行是什么样子呢?你说在本地搭建一个网站?那假如公司网站非常非常大(比如一个视频网站),一个机房的机器都放不下,更别说我一台PC了。

这个时候就可以利用反向代理。我先把公司网址例如www.sina.com.cn改HOST方式指向127.0.0.1 也就是自己机器。然后在自己机器上装一个Apache,并且设置反向代理整站到线上服务器,但排除了目录test。

于是我输入http://www.sina.com.cn/sport/的时候,请求发送到本机的apache,本机的apache去线上获取内容 吐给我,就像他自己的一样。而我输入http://www.sina.com.cn/test/的时候,请求发送到本机的apache,apache发现 这是个排除的目录,于是找本机上对应的目录文件(开发目录)吐给我。这样子就实现了完全模拟线上环境的开发模式。

透明代理

透明代理的使用场景就是公司限制网络的访问。客户端根本不知道代理的存在,它改编你的request,并会传送真实IP。

比如为了工作效率或者安全,A公司屏蔽了QQ软件的使用。A公司的员工接上了网络,但发现无法使用qq。这就是透明代理捣 的鬼。公司在内网和外网的中间插入一个透明代理,这个代理会根据规则抓取请求内容,遇到qq的请求我就把这个请求给屏蔽掉,这样就完成了透明屏蔽。当然 了,如果你明白原理,就可以自己搞个正向代理来绕过公司的屏蔽。