可编程透明代理

9 投票
4 回答
4189 浏览
提问于 2025-04-15 17:12

我在寻找一种方法,可以编写一个透明的转发代理,就像用户在浏览器的代理设置中指定的那样。

我发现转发代理在可编程性和稳定性之间有明显的权衡。例如,有很多用RubyPython开发的代理,它们允许你检查每个请求的响应,并随意记录、修改和过滤……但是这些代理要么无法代理所有需要的内容,要么在使用20分钟后就崩溃。

另一方面,我怀疑Squid和Apache非常稳定和可靠,但我就是搞不清楚如何通过脚本来开发动态行为。最终,我想设置配额,并根据这个配额进行动态过滤。我觉得将mod_proxy和mod_perl结合起来,可能会让代理变得有趣,但我不知道从哪里开始,也不确定这是否可行。

请给点建议。

4 个回答

2

我最近在用Python开发一个HTTP库,这个库特别考虑到了代理服务器的使用场景。现在这个库还不算成熟(肯定需要更多的测试和单元测试),但功能已经足够让我觉得有用。我不知道它是否能满足你的需求。

这个库叫做httpmessage,你可以在这个链接找到它的Google代码网站。在示例页面上有一个关于如何写代理服务器的例子。

我很乐意接受反馈和修复建议。

2

如果你在找Perl的解决方案,可以看看这个HTTP::Proxy

不过我不太确定有没有mod_perl的解决方案。你可以在CPAN上找到Apache::Proxy,而在谷歌上搜索会找到MyProxy。不过要注意,这两个工具都有点老旧,所以效果可能会有所不同,但你可能会觉得它们对你有帮助。

3

Squid和Apache都有一些机制,可以在每次请求时调用外部脚本来决定是否允许或拒绝。这意味着你可以使用这两个工具作为代理服务器,但每次请求时都可以调用你的外部脚本来处理复杂的逻辑。你的代码只需要处理业务逻辑,而不需要处理繁重的工作。

在Apache中,我从来没有用过mod_proxy以这种方式,但我用过mod_rewritemod_rewrite也可以用来代理请求。RequestMap指令允许你把决策交给外部脚本:

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

这里的源是一个程序,而不是一个映射文件。你可以用任何你喜欢的语言来创建它,但结果必须是一个可执行程序(可以是对象代码或以魔法字符串'#!/path/to/interpreter'作为第一行的脚本)。

这个程序在Apache服务器启动时只会启动一次,然后通过它的标准输入和标准输出与重写引擎进行通信。对于每次映射函数查找,它会在标准输入中接收到一个以换行符结束的字符串作为查找的键。然后,它必须在标准输出中返回查找到的值,格式也是以换行符结束的字符串,或者返回四个字符的字符串``NULL'',表示查找失败(也就是说,没有与给定键对应的值)。

在Squid中,你可以通过external_acl_type指令获得类似的功能:

这个标签定义了如何使用辅助程序来查找外部访问控制列表(acl)类的状态。

祝你好运!

撰写回答