第 29 章 代理服务器 Squid

目录

29.1. 有关代理超速缓存的一些事实
29.2. 系统要求
29.3. 启动 Squid
29.4. 配置文件 /etc/squid/squid.conf
29.5. 配置透明代理
29.6. cachemgr.cgi
29.7. squidGuard
29.8. 使用 Calamaris 生成超速缓存报告
29.9. 参见信息

摘要

Squid 是 Linux 和 UNIX 平台广泛使用的代理超速缓存。就是说它会将请求的因特网对象(例如万维网或 FTP 服务器上的数据)存储在与请求工作站距离更近(与服务器相比)的机器上。本章将讨论其配置、运行所需的设置、如何配置系统提供透明代理、如何借助程序(如 Calamaris 和 cachemgr)收集有关使用超速缓存的统计信息,以及如何使用 squidGuard 过滤万维网内容。

Squid 可以充当代理超速缓存。它将来自客户机(这里指来自万维网浏览器)的对象请求重定向至服务器。当服务器回复所请求的对象后,它会将这些对象传递给客户机并在硬盘超速缓存中保存对象副本。超速缓存的一个优点就是:当多个客户机请求同一对象时,可以从硬盘超速缓存中提供该对象。这样客户机接收数据的速度要比从因特网接收快得多。此过程还可以减少网络流量。

除实际的超速缓存外,Squid 还提供众多功能,如在代理服务器的相互通讯的层次之间分配负载、为所有访问代理的客户机定义严格的访问控制列表、借助其它应用程序允许或拒绝访问特定的万维网网页,以及生成有关频繁访问的万维网网页的统计信息以评估用户的浏览习惯。Squid 不是通用代理。通常只充当 HTTP 连接的代理。它确实还支持 FTP、Gopher、SSL 和 WAIS 等协议,但不支持其它的因特网协议,如 Real Audio、新闻或视频会议。由于 Squid 只支持使用 UDP 协议在不同的超速缓存间通讯,所以很多其它多媒体程序都不受支持。


29.1. 有关代理超速缓存的一些事实

作为代理超速缓存,Squid 的使用方法分为几种。与防火墙结合使用时,能够提高安全性。可以一起使用多个代理。还能确定应该超速缓存的对象的类型以及超速缓存的时间。

29.1.1. Squid 和安全性

Squid 可以与防火墙结合起来,通过使用代理超速缓存防止内部网络遭受外部攻击。防火墙会拒绝 Squid 之外的所有客户机访问外部服务。所有万维网连接都必须通过代理方式建立。经过此配置后,Squid 便可全面控制万维网访问。

如果防火墙配置中包含 DMZ,代理应该在此区域内操作。第 29.5 节 “配置透明代理”描述了如何实施透明代理。它能简化客户机的配置,因为在这种情况下,它们不需要代理的任何信息。

29.1.2. 多个超速缓存

可以配置 Squid 的几个实例从而在它们之间交换对象。这样会减少系统负载,同时提高找到本地网络中已有对象的几率。还可以配置超速缓存的层次,以便能够将对象请求转发给同级超速缓存或父超速缓存 使其从本地网络中的其它超速缓存或直接从数据源获取对象。

为了不给网络增加总体数据流量,为超速缓存层次选择适当的拓扑结构是十分重要的。对于超大型网络,合理的做法是:为每个子网配置一个代理服务器并将其连接至父代理,再通过父代理连接至 ISP 的代理超速缓存。

所有这些通讯都通过在 UDP 协议之上运行的 ICP(因特网超速缓存协议)来处理。超速缓存间的数据传送使用基于 TCP 的 HTTP(超文本传送协议)来处理。

要找到从中可获得对象的最合适的服务器,一个超速缓存会向所有同级代理发送 ICP 请求。同级代理会通过 ICP 响应回复请求(如果检测到对象就回复 HIT 代码,如果未检测到则回复 MISS 代码)。如果发现多个 HIT 响应,代理服务器会根据哪个超速缓存回复最快或哪个最近等因素决定从哪个服务器下载。如果没有收到满意的响应,该请求将被发送至父超速缓存。

[Tip]提示

为了避免网络中不同超速缓存中的对象重复,还会使用其它 ICP 协议,如 CARP(超速缓存阵列路由协议)或 HTCP(超文本超速缓存协议)。网络中维护的对象越多,找到所需对象的可能性就越大。

29.1.3. 超速缓存因特网对象

网络中的对象并不全都是静态的。网络中有许多动态生成的 CGI 页面、访问计数器和加密的 SSL 内容文档。由于每次访问这类对象时它们都会更改,所以它们不会被超速缓存。

一直以来的问题是:储存在超速缓存中的所有其它对象应在其中保留多久。要确定保留时间,超速缓存中的所有对象都会被指派几种可能状态之一。万维网和代理服务器会通过为这些对象添加报头找出对象的状态(如“Last modified”或“Expires”)以及相应的日期。同时还会使用其它报头指定不能超速缓存对象。

超速缓存中的对象通常会因为缺少可用硬盘空间而使用 LRU(最近最少使用)之类的算法进行替换。一般来说,这意味着代理会销毁未被请求时间最长的对象。