下一页 上一页 目录

2. 透明代理概述

2.1 动机

在“普通”代理中,客户端在其网页浏览软件中指定代理的主机名和端口号。然后浏览器向代理发出请求,代理将这些请求转发到原始服务器。 这在大多数情况下都很好,但有时会出现以下几种情况之一。要么

这就是透明代理的用武之地。Web 请求可以被代理透明地拦截。也就是说,就客户端软件而言,它认为自己正在与原始服务器对话,而实际上是在与代理服务器对话。(请注意,透明性仅适用于客户端;服务器知道代理的参与,并且将看到代理的 IP 地址,而不是用户的 IP 地址。尽管,Squid 可能会传递一个 X-Forwarded-For 标头,以便服务器可以确定原始用户的 IP 地址,如果它理解该标头)。

Cisco 路由器支持透明代理。许多交换机也是如此。但是,(令人惊讶的是)Linux 可以充当路由器,并且可以通过将 TCP 连接重定向到本地端口来执行透明代理。但是,我们还需要使我们的 Web 代理意识到重定向的影响,以便它可以连接到正确的原始服务器。这通常有两种工作方式

第一种情况是当您的 Web 代理不感知透明代理时。您可以使用一个名为 transproxy 的漂亮的小守护程序,它位于您的 Web 代理前面,并为您处理所有繁琐的细节。transproxy 由 John Saunders 编写,可从以下位置获取

ftp://ftp.nlc.net.au/pub/linux/www/ 或您本地的 metalab 镜像站点。本文档将不再进一步讨论 transproxy。

一个更简洁的解决方案是使用一个本身就感知透明代理的 Web 代理。我们在这里要关注的是 Squid。Squid 是一个用于 Unix 系统的开源缓存代理服务器。它可从 www.squid-cache.org 获取

或者,除了将连接重定向到本地端口,我们可以将连接重定向到远程端口。这在 远程 Box 的透明代理 部分中讨论。对这种方法感兴趣的读者应该跳到该部分。对在一个 Box 上完成所有操作感兴趣的读者可以安全地忽略该部分。

2.2 本文档的范围

本文档将重点介绍 Squid 2.4 版本和 Linux 内核 2.4 版本,这是截至本文撰写时(2002 年 8 月)最新的稳定版本。它也应该适用于大多数后续的 2.3 内核。如果您需要有关早期版本的 Squid 或 Linux 的信息,您可以在 http://users.gurulink.com/transproxy/ 找到一些早期文档。请注意,此站点已从其先前的位置移动。

如果您正在使用开发内核或开发版本的 Squid,您需要自行承担风险。本文档可能会对您有所帮助,但结果可能因人而异 (YMMV)。

请注意,本文档仅关注 HTTP 代理。我收到很多关于透明 FTP 代理的电子邮件。Squid 做不到这一点。现在,据称一个名为 Frox 的程序可以做到。我还没有亲自尝试过,所以我不能说它的效果如何。您可以在 http://www.hollo32.fsnet.co.uk/frox/ 找到它。

我在这里只关注 Squid,但 Apache 也可以用作缓存代理服务器。(如果您不确定使用哪个,我建议使用 Squid,因为它从一开始就被构建为缓存代理服务器,而 Apache 的缓存代理功能更像是对现有系统的补充。)如果您想使用 Apache 而不是 Squid:请遵循本文档中所有与内核和 iptables 规则相关的说明。忽略特定于 Squid 的部分,而是查看 http://lupo.campus.uniroma2.it/progetti/mod_tproxy/ 以获取 Apache 透明代理模块的源代码和说明(感谢 Cristiano Paris (c.paris@libero.it) 的贡献)。

2.3 HTTPS

最后,至于透明地代理 HTTPS(例如,使用 SSL、TSL 等的安全网页),您无法做到。甚至不要问。有关解释,请搜索“中间人攻击”。请注意,您可能根本不需要透明地代理 HTTPS,因为 Squid 无法缓存安全页面。

2.4 代理身份验证

您不能透明地使用代理身份验证。有关(稍微)更详细的信息,请参阅 Squid FAQ


下一页 上一页 目录