可编程透明转发代理

jrh*_*cks 9 ruby python apache perl proxy

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

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

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

请指教.

J.J*_*.J. 3

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

在Apache中,我从来没有用过mod_proxy这种方式,但我用过mod_rewrite. mod_rewrite 还允许您代理请求。该RequestMap指令允许您将决策传递给外部脚本:

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

这里的源是一个程序,而不是一个地图文件。要创建它,您可以使用您选择的语言,但结果必须是可执行程序(目标代码或带有魔术饼干技巧“#!/path/to/interpreter”作为第一行的脚本)。

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

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

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

祝你好运!