小默
zz 反向代理
http://en.wikipedia.org/wiki/Reverse_proxy
In
computer networks
, a
reverse proxy
is a type of
proxy server
that retrieves resources on behalf of a
client
from one or more
servers
. These resources are then returned to the client as though it originated from the reverse proxy itself.
[
1
]
While a
forward proxy
is usually situated between the client application (such as a
web browser
) and the server(s) hosting the desired resources, a reverse proxy is usually situated
closer to the server(s)
and will only return
a configured set
of resources.
---
http://www.hackbase.com/tech/2011-02-24/62751.html
通常的代理服务器,只用于
代理内部网络对 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/
此外,不仅是收到服务器的信息需要改写,用户发给服务器的请求信息也要改写,其情形与上面所说的类似,这里不再举例。
posted on 2011-09-18 12:09
小默
阅读(494)
评论(0)
编辑
收藏
引用
所属分类:
Network
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
zz 反向代理
httpget
CCNA
DNS解析的疑问
【转】DiG HOWTO
【转】网路协议
http 1.1 GET
python 给出ip,子网掩码,求网络内主机Ip列表
net helpmsg
【转】IP, Internet Protocol
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
导航
首页
新随笔
联系
聚合
管理
统计
随笔 - 289
文章 - 0
评论 - 84
引用 - 0
留言簿
(13)
给我留言
查看公开留言
查看私人留言
随笔分类
(287)
Algorithm(5)
(rss)
Database(7)
(rss)
DataStructure(1)
(rss)
Jiong(24)
(rss)
Language(68)
(rss)
Linux(54)
(rss)
Network(27)
(rss)
Security(23)
(rss)
Tools(14)
(rss)
Web(5)
(rss)
Windows(59)
(rss)
随笔档案
(289)
2013年8月 (1)
2012年2月 (1)
2011年10月 (2)
2011年9月 (10)
2011年6月 (6)
2011年3月 (5)
2011年2月 (1)
2011年1月 (4)
2010年12月 (2)
2010年11月 (10)
2010年10月 (6)
2010年9月 (3)
2010年8月 (23)
2010年7月 (7)
2010年6月 (16)
2010年5月 (16)
2010年4月 (37)
2010年3月 (15)
2010年2月 (38)
2010年1月 (5)
2009年12月 (50)
2009年11月 (5)
2009年10月 (23)
2009年9月 (3)
漏洞
sebug
搜索
积分与排名
积分 - 287155
排名 - 90
最新评论
1. re: django debug toolbar
其实,如果你访问不了谷歌,是用不了的,你还有修改一个地方
--berlin
2. re: 完美的 NSIS 安装脚本zz
路过留名。
--anopos
3. re: MFC - DECLARE_MESSAGE_MAP()
这个具体的有人回复吗?学习
--Stadium Series Hockey Jersey
4. re: MFC - #error include ’stdafx.h’ before including this file for PCH
学习了。O(∩_∩)O谢谢。。
--Stadium Series Hockey Jersey
5. re: Windows APC机制zzz
这么好的文章,才看到,惭愧
--zssure
阅读排行榜
1. MFC BEGIN_MESSAGE_MAP()(24558)
2. 【转】HTTP方法(7704)
3. 完美的 NSIS 安装脚本zz(7686)
4. ls命令是怎样实现的,getdents64,linux-2.6.27.5(7449)
5. TypeError: 'tuple' object does not support item assignment(5672)