论坛首页 综合技术论坛

何为“反向代理”

浏览 11038 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-26  
   通常的代理服务器,只用于代理内部网络对 Internet 的连接请求,客户机必须指定代理服务器,并将本来要直接发送到 Web 服务器上的 http 请求发送到代理服务器中。由于外部网络上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设计为在 Internet 上搜寻多个不确定的服务器,而不是针对 Internet 上多个客户机的请求访问某一个固定的服务器,因此普通的 Web 代理服务器不支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务(也称为逆向代理)。   
   通过反向代理服务器,可以记录用户所有的访问行为,但这也会带来系统资源相当大的额外开销。但对于不同的服务器来说,其保护的资源类型是有限的,我们只需要记录、控制用户对我们所关心的资源的访问即可。比如对一个 mp3 服务提供商来说,只需要控制用户对 .mp3 文件的请求次数即可。

   从用户访问的角度来分,非法访问主要有以下两个方面:瞬间恶意多次请求和长时间持续攻击。针对这两种情况我们制定了以下控制策略:

1) 对抗瞬间恶意攻击

   这种情况是恶意的网上用户使用多线程访问同一资源,或者是在短时间内访问多个资源。对于第一种情况,可以定义一个参数 m ,即同一用户同时访问的线程数量,若超过这个数量,则将他的请求暂缓发出或者废除他的请求。为了对付第二种情况,访问控制系统应定义两个参数,一个是时间 t ,以秒为单位。第二个是资源个数 g 。用这两个参数确定一个规则 r ,即 r=F(g, t) 。 r 的含义就是最多允许网上用户在 t 秒内访问 g 个资源。同时,规则 r 可以有多条,这样为精确控制带来方便。

2) 对抗长时间持续攻击

   用上面提到的规则 r=F(g, t) 也可以对抗长时间持续下载。这里再定义一种规则 k=F(t1,t2) 。 t1 、 t2 都是时间长度,以秒为单位。 t1 是最长持续时间。 t2 是判断用户是否连续访问的间隔时间。例如可以规定网上用户连续访问一类资源 3 小时(参数 t1 ),若有 8 小时(参数 t2 )未访问此类资源,则可认为用户是重新开始访问。

   将 t1 、 t2 定义的比较长并不能防止恶意用户定时攻击。比如他为了不违反上面的规则,就每隔 8 小时下载 3 个小时。对付这种情况,可以定义多条 k 规则,例如用户每访问 3 分钟就必须休息 1 分钟;每访问 10 分钟必须休息 3 分钟等。
    反向代理是访问控制系统最核心的部分,其核心技术就是地址转换。通过它可以保证使用者对客户端计算机不进行任何设置的情况下就使用访问控制系统。从外观看来,也就是从普通用户看来,反向代理就像普通的 Web 服务器一样。而反向代理所代理的每一个 Web 服务器都好像是反向代理服务器中的一个目录。例如反向代理服务器本身的 URL 是 http://reverse-proxy ,它可以代理清华主页服务器( http://www.tsinghua.edu.cn/index.html ),普通的用户想通过反向代理服务器来访问清华主页服务器就只需要访问 http://reverse-proxy/www.tsinghua.edu.cn/index.html 就行了。

反向代理的实现
   在反向代理中,等于把反向代理服务器中的目录映射到其它需要被代理的服务器上。这样做只能解决用户的一次访问问题,不能做到让用户通过反向代理连续访问。因为被代理的服务器上的信息是未知的,对于 HTTP 协议来讲,很有可能出现绝对地址或者绝对链接,这样的话,普通用户的下一次访问将会跳过反向代理而直接访问真实的服务器。这是我们不希望看到的。因此,必须对服务器返回给用户的信息进行过滤,将所有的绝对 URL 更改成为通过反向代理的相对 URL 。为此,我们使用了正则表达式对所有的链接进行检测、替换。于是就实现了通过反向代理连续访问的功能。

   当用户的请求到达反向代理服务器之后,反向代理通过一定的规则将 URL 中的目录信息解析成服务器以及端口的信息,从而进行 socket 链接,即反向代理服务器模拟一个客户端向真正的 Web 服务器发出 http 请求。当得到回应信息的时候,通过 HTTP 头中的 Content-Type 和文件的扩展名来判断得到的信息的类别。若是非 HTML 信息(如 jpg, gif, zip 等),则将其原样照发还给用户,若是 HTML(html, htm, shtml 等),则用先用正则表达式建立字符串识别自动机,查找 html 文本中所有的链接信息。例如, <a href="......"> 、 <img src="......"> 等。然后判定链接的类型,对于在代理范围之内(代理范围之外不予理会)的绝对 URL (以“ http:// ”打头),则把它改写成通过反向代理的格式。例如

<a href="http://www.test.org">

就会被改成

<a href="http://reverse-proxy/www.test.org">

对于绝对 URI (以“ / ”打头的),也需要更改,例如

<img src="/img/1.jpg">

就要被改成

<img src="/www.test.org/img/1.jpg"> 。

   对于相对链接,则不需要改动。除了对 HTML 本身进行更改之外,对 HTTP 的头信息也要解析。其中最关键的就是对 Cookie 路径的改写。例如收到 www.test.org 的 cookie 为

Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/

就要改写成

Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/www.test.org/

此外,不仅是收到服务器的信息需要改写,用户发给服务器的请求信息也要改写,其情形与上面所说的类似,这里不再举例。

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics