可编程透明转发代理

时间:2009-12-19 15:37:28

标签: python ruby perl apache proxy

我正在寻找一种方法来编写透明转发代理的脚本,例如用户将其浏览器指向代理设置的代理。

我在脚本性和稳健性之间的前向代理中发现了明显的权衡。例如,它们是RubyPython中开发的无数代理,允许您检查每个请求响应并随意记录,修改,过滤......但是这些代理无法代理所需的一切或崩溃之后使用20分钟。

另一方面,我怀疑Squid和Apache是​​非常健壮和稳定的,但是对于我的生活,我无法确定如何通过脚本开发动态行为。最终我想设置配额并动态过滤该配额。我的一部分感觉就像混合mod_proxy和mod_perl ??可以允许有趣的动态代理,但很难知道从哪里开始并知道它是否可能。

请告知。

4 个答案:

答案 0 :(得分:3)

Squid和Apache都有机制调用外部脚本来进行允许/拒绝每个请求的决策。这允许您使用其代理引擎,但每个请求调用外部脚本以处理任意复杂性。您的代码只需要管理业务逻辑,而不是繁重的工作。

在Apache中,我从未以这种方式使用mod_proxy,但我使用了mod_rewrite。 mod_rewrite还允许您代理请求。 RequestMap指令允许您将决策传递给外部脚本:

  

MapType:prg,MapSource:Unix文件系统到有效常规文件的路径

     

此处源是程序,而不是地图文件。要创建它,您可以使用您选择的语言,但结果必须是可执行程序(对象代码或带有魔术cookie技巧'#!/ path / to / interpreter'作为第一行的脚本)。

     

该程序在Apache服务器启动时启动一次,然后通过其stdin和stdout文件句柄与重写引擎通信。对于每个映射函数查找,它将接收在stdin上作为换行符终止的字符串进行查找的键。然后它必须将查找的值作为stdout上的换行符终止字符串或者如果失败则返回四字符串“NULL”(即,给定键没有相应的值)。

使用Squid,您可以通过external_acl_type指令获得类似的功能:

  

此标记定义了使用帮助程序的外部acl类应如何查找状态。

g'luck!

答案 1 :(得分:2)

如果您正在寻找Perl解决方案,请查看HTTP::Proxy

不确定是否有任何mod_perl解决方案。 CPAN确实显示Apache::Proxy,Google搜索引出MyProxy。但请注意,这两个都有点旧,所以YMMV,但你可能会发现它们很有用。

答案 2 :(得分:2)

我一直在使用python中的HTTP库,用代理服务器编写,特别是作为用例。它在这一点上还不是很成熟(当然需要更多的测试和单元测试),但它足够完整,我发现它很有用。我不知道它是否满足您的任何需求。

该库名为httpmessage,找到了Google代码网站here。有一个在examples page上编写代理服务器的例子。

我很高兴收到反馈和/或错误修复。

答案 3 :(得分:0)

我使用squid,可以执行其他程序来动态更改请求。