免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4249 | 回复: 2

[原创]APACHE的代理扩展模块-mod_extract_forwarded [复制链接]

论坛徽章:
0
发表于 2007-06-12 15:20 |显示全部楼层
这几天在玩webserver 的代理功能,希望使用代理的功能,无意中发现了apache的一个proxy模块叫做mod_extract_forwarded,于是写了这篇文档,在这里共享给大家,希望大家喜欢,更希望不妥的地方,知道CU的大虾都是很厉害的,所以请各位大虾不吝赐教,小弟会及时修改  
BTW   方便的话就多多定哦~~~~


     好了,书归正传,下面我们来看一下mod_extract_forwarded模块

    mod_extract_forwarded模块的设计目的是用来透明地更改一个连接,使得它看起来是来自于一个代理服务器后面的IP地址而不是来自于代理服务器本身。这个指令的处理将会影响到所有的由于请求进程引发的其它程序,包括访问控制,日志纪录和CGI调用。它如何处理依赖于包头里面的"X-Forwarded-For"的值。对于所有正常的代理,发起的数据包里面都应该有这个字段。但是如果代理没有加入这个字段,我们也是无能为力的
    如果一个数据包在它请求的路上经过了多个代理的话,那么在这种情况下X-Forwarded-For就会是几个IP。也可以建立一个委托代理列表,然后包头中的第一个不是委托代理列表中的IP就被认为是客户端的IP
因为我们改变了连接纪录,即把其中的references改成了连接的“真正的IP”,那么纪录用户真正的IP就显得比较有用了。我们就在源日志被改变了以前,就先把真正的客户端IP存储在变量PROXY_ADDR中。如果需要这些客户端的变量,那么可以启动CGI来把它们提取出来。其它的APACHE模块也可以通过request_rec的子进程的环境变量表来把变量PROXY_ADDR提取出来
    使用这个模块对于基于host的访问控制的服务器,存在着潜在的严重的危险性。因为在请求的包头欺骗里面"X-Forwarded-For"只是一个平文,所以它是没有价值的。(?)为了补偿这个缺点,mod_extract_forwarded提供了一个配置文件指令来限制X-Forwarded-For变量中纪录的代理主机名称,而且确定对哪些进行处理。不允许某个代理服务器使用这个指令,并不是说目标代理服务器不可以取得你机器上的页面,只是为了forwarded IP不可以使用。这里强烈建议只是对来自于可以信任委托的代理服务器才采用"X-Forwarded-For"来处理
   如果一个请求经历了几个不同的代理服务器的话,那么X-Forwarded-For变量可能就包含了几个IP值,就像下面这个值:
   X-Forwarded-For: client1, proxy1, proxy2
    另外,还有一个请求主机自身的IP,这个IP没有包含在头里面。我们假设请求的HOST是proxy3。那么首先会在允许列表里面检查host,然后我们从右向左遍历包头,而且遇到了第一个IP,这个IP并没有在允许列表里面,所以就用它来作为客户端的IP。例如如果proxy1,proxy2, 和proxy3在允许列表里面,那么上面的包头中,client1就会显示为连接的IP。但是在下面这个头中:
   X-Forwarded-For: client1, untrusted1, proxy1, proxy2
    不可信untrusted1就会显示为连接的IP,即使untrusted1是真正的客户端client1的代理服务器(因为untrusted1是可以“说谎”的)
   这里还有一个命令来允许或者拒绝代理服务器使用缓存来回复请求的内容。你可能处在过这样的一种情况,在一台缓存代理后面的一些host是可以通过一个URI来访问,但是在同一台代理服务器后面的其它的一些主机就是不可以访问的。如果当代理在响应了合法客户端的时候,缓存了请求的内容,在把这个缓存的内容发送给另一个用户以前,他不会再次核对你的服务器。这种情况下,你使用了前面提到的命令AllowForwarderCaching指令缓存本地所保存的缓存内容不可访问
  配置的指令如下:
指令        描述
AllowForwarderCaching: On 或 Off        是否允许缓存保存整个请求路径上的所有的内容
AddAcceptForwarder:        加入IP或者主机名到主机列表里面,从这个主机列表中我们授予包头中"X-Forwarded-For"字段的值
RemoveAcceptForwarder:        从主机列表里面移除一个由AddAcceptForwarder 建立的IP或者主机名
    如果配置文件里面没有使用任何的指令,那么默认的情况是忽略所有的代理服务器的ignore X-Forwarded-For同时允许缓存。换句话说,如果加载了这个模块但是却没有配置他,那么它什么也不会做。
同其它的指令类似,可以在其它所有的的容器指令的外面指定这些指令,那么它就可以覆盖容器内部的指令了。如果AllowOverride选项启用了的话,也可以在容器内部的.htaccess文件里使用这些指令,那么这些指令的效果是叠加的。例如:
AddAcceptForwarder 10.1.26.180
AddAcceptForwarder 10.1.26.181
AllowForwarderCaching On

<Location /foobar>
RemoveAcceptForwarder 10.1.26.181
AllowForwarderCaching Off
</Location>

     按照上面的这个配置,现在在容器/foobar里面依然可以接收10.1.26.181的请求,但是10.1.26.180的请求是不可以被接收的(可能/foobar里面包括了一些敏感的内容吧)
AddAcceptForwarderRemoveAcceptForwarder同样也接受”all”关键字,这个关键字(跟准确的说是"AddAcceptForwarder all")为accept,所有的代理服务器的X-Forwarded-ForRemoveAcceptForwarder all会清空整个accpcet列表,关键字all使得可能像下面一些配置来使用:
AddAcceptForwarder all
RemoveAcceptFowarder 10.1.26.180

<Location /foobaz>
RemoveAcceptForwarder all
AddAcceptFowarder 10.1.26.181
</Location>

     在配置文件的顶部,除了10.1.26.180以外,所有的代理服务器都可以接受。但是在/foobaz容器里面,我们会清空整个accept列表,然后只是接受10.1.26.181的请求。
在某个容器里面的指令的顺序是不确定的,但是它们处理的过程可能会发生冲突,例如
(1) RemoveAcceptForwarder all
(2) AddAcceptForwarder all
(3) any other RemoveAcceptForwarders
(4) any other AddAcceptForwarders

     这些规则开始一看起来似乎是有所限制的,但是在实际运用中,你甚至不需要去了解它们。它们都是基于一个前提的,这个前提就是你并不想从你的容器的内部的AddAcceptForwarders里面出去主机。如果你这么作(为什么?!)你不会得到你所期待的东西。但是在整体上,规则将会很自然的运行。
   [1] 我没有能得到squid 2.2以后的版本来作这些试验(例如,返回缓存的内容给一个“不合法的”客户端)但是我也没能有试图试验其它的代理服务器。所有的可能都是存在的,一旦内容被缓存了,你就会对它失去控制。
   [2]原因是因为我们没有授予任何的X-Forwarded-Fors来放置我们被欺骗,所以缓存就是安全的。一旦你放置了AddAcceptForwarder的话,你就应该考虑一下使用缓存了。

[ 本帖最后由 sohu2000000 于 2007-6-12 15:30 编辑 ]

论坛徽章:
0
发表于 2007-06-12 16:00 |显示全部楼层
终于可以坐一下沙发了
支持ing

论坛徽章:
0
发表于 2007-12-28 17:22 |显示全部楼层
好文!






jsp空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP