跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 管理指南 / 服务 / Squid 缓存代理服务器
适用范围 SUSE Linux Enterprise Server 15 SP6

44 Squid 缓存代理服务器

Squid 是广泛用于 Linux 和 UNIX 平台的缓存代理服务器。这表示它会将请求的互联网对象(例如 Web 或 FTP 服务器上的数据)存储在离请求工作站更近(与服务器相比)的计算机上。可以在多个层次中设置它,以确保即使在对最终用户来说是透明的模式下,也能达到最佳的响应速度和较低的带宽用量。

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

除实际的缓存外,Squid 还提供众多其他功能:

  • 在代理服务器的互通层次之间分配负载

  • 为所有访问代理服务器的客户端定义严格的访问控制列表

  • 允许或拒绝使用其他应用程序访问特定网页

  • 生成有关频繁访问的网页的统计信息,以评估用户的浏览习惯

Squid 不是通用的代理服务器。通常只充当 HTTP 连接的代理。它支持 FTP、Gopher、SSL 和 WAIS 协议,但不支持其他互联网协议,如新闻协议或视频会议协议。由于 Squid 只支持将 UDP 协议用于在不同的缓存间提供通讯功能,因此很多多媒体程序都不受支持。

44.1 有关代理服务器的信息

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

44.1.1 Squid 和安全性

可将 Squid 与防火墙结合使用,来防止内部网络遭受外部攻击。防火墙会拒绝 Squid 之外的所有客户端对外部服务的访问。所有 Web 连接必须通过代理服务器建立。在此配置下,Squid 可全面控制 Web 访问。

如果防火墙配置中包含某个隔离区域 (DMZ),代理服务器应在此区域内操作。第 44.6 节 “配置透明代理”介绍如何实施透明代理。如此可简化客户端的配置,因为在这种情况下,它们不需要有关代理服务器的任何信息。

44.1.2 多个缓存

可以配置 Squid 的几个实例从而在它们之间交换对象。这样会降低系统总负载,提高从本地网络检索对象的几率。还可以配置缓存层次,以便缓存能够将对象请求转发给同级缓存或父缓存,如此其便可从本地网络中的其他缓存或直接从数据源请求对象。

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

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

为了找到最适合向其请求对象的服务器,一个缓存会向所有同级代理发送 ICP 请求。同级代理会通过 ICP 响应回复这些请求。如果检测到对象,它们会使用代码 HIT,若未检测到,则会使用 MISS

如果发现多个 HIT 响应,代理服务器会根据哪个缓存发送回复的速度最快或哪个服务器较近等因素决定从哪个服务器下载。如果没有收到满意的响应,该请求会发送至父缓存。

注意
注意:Squid 如何避免对象重复

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

44.1.3 缓存互联网对象

网络中提供的许多对象都不是静态的,例如动态生成的页面和 TLS/SSL 加密内容。由于每次访问这类对象时它们都会更改,所以它们不会被缓存。

为确定对象应保留在缓存中的期限,系统会为对象指派多个状态中的一种。Web 和代理服务器会通过为这些对象添加报头来找出对象的状态(如Last modifiedExpires)以及相应的日期。也可以使用指定不能缓存的对象的其他报头。

缓存中的对象通常会因缺少可用磁盘空间而通过 LRU(最近最少使用)之类的算法进行替换。这意味着代理会删除未被请求时间最长的对象。

44.2 系统要求

系统要求取决于系统必须承受的最大网络负载。由于负载在高峰期间可能是日均值的四倍以上,因此需要检查负载峰值。如果不能确定,请将系统要求稍微高估一点。让 Squid 在濒临其处理能力上限的状态下工作可能会严重影响其服务质量。以下几节按重要程度依次阐述了各个系统要素:

  1. RAM 大小

  2. CPU 速度/物理 CPU 内核

  3. 磁盘缓存的大小

  4. 硬盘/SSD 及其体系结构

44.2.1 RAM

Squid 所需内存 (RAM) 大小与缓存中的对象数有直接的关系。随机存取内存比硬盘/SSD 快得多。因此,请务必让 Squid 进程拥有充足的内存,因为如果使用交换磁盘,系统性能会显著降低。

Squid 还会在主存储器中存储缓存对象引用和经常请求的对象,以加速对这些数据的检索。除此之外,Squid 还需在内存中保存其他数据,例如所有已处理 IP 地址的表格、精确的域名缓存、最常请求的对象、访问控制列表、缓冲区等等。

44.2.2 CPU

Squid 已经过优化,最适合处理器内核较少的环境(4–8 个物理内核),这样每个内核都能提供高性能。提供虚拟核心的技术(如超线程)可能会降低性能。

要充分利用多个 CPU 内核,必须设置多个写入不同缓存设备的工作线程。默认情况下,多核心支持处于禁用状态。

44.2.3 磁盘缓存的大小

在小型缓存中,HIT(在该处找到所请求的对象)的概率比较小,因为该缓存很容易就会填满,所以不常请求的对象会被较新的对象取代。例如,如果缓存的可用空间为 1 GB,而用户每天浏览所用的空间只有 10 MB,那么至少需要 100 多天才会占满缓存。

确定所需缓存大小的最简单的方法就是参考连接的最大传输速度。1 Mbit/s 连接的最大传输速度为 128 KB/s。如果所有流量都进入缓存,1 小时内累计可达到 460 MB。假设所有流量都是在 8 小时工作时间生成的,那么每天将达到 3.6 GB。由于连接速度一般不会达到流量上限,所以可以认为缓存处理的数据总量约为 2 GB。因此,在本示例中,Squid 需要 2 GB 的磁盘空间来保存一天内缓存的数据浏览量。

44.2.4 硬盘/SSD 体系结构

速度在缓存过程中起到重要作用,所以此要素值得特别关注。对于硬盘/SSD,此参数通过以毫秒度量的随机搜索时间随机读取性能来描述。Squid 从硬盘/SSD 读取或写入其中的数据块一般都较小,因此硬盘/SSD 的搜索时间/读取性能比其数据吞吐量更重要。

如果要充当代理服务器,高转速硬盘或者 SSD 会是最好的选择。使用硬盘时,使用多个较小硬盘的效果可能更好,这样每个硬盘都有单独的缓存目录,可避免读取次数过多。

如果使用 RAID 系统,可以通过牺牲速度来提高可靠性。不过,出于性能原因,请避免使用(软件)RAID5 及类似设置。

在大多数情况下,使用何种文件系统并不重要。不过,使用挂载选项 noatime 可以提高性能 - Squid 会提供自己的时间戳,如此便不需要文件系统来跟踪访问时间。

44.3 Squid 的基本用法

由于 SUSE® Linux Enterprise Server 上默认未安装 squid,请确保您的系统上已安装该软件包。

由于 SUSE Linux Enterprise Server 中已预先配置 Squid,因此安装该工具后便可立即将其启动。为避免启动过程中出现问题,请确保网络已连接到互联网,并且至少已配置一台名称服务器。使用设置了动态 DNS 配置的拨号连接可能会导致出现问题。在这种情况下,至少应指定名称服务器,因为如果 Squid 在 /var/run/netconfig/resolv.conf 中未检测到 DNS 服务器,便不会启动。

44.3.1 启动 Squid

要启动 Squid,请运行以下命令:

> sudo systemctl start squid

要在系统引导时启动 Squid,请使用 systemctl enable squid 启用该服务。

44.3.2 检查 Squid 是否正在运行

通过以下几种方法可检查 Squid 是否正在运行:

  • 使用 systemctl:

    > systemctl status squid

    输出应该会指出 Squid 已 loaded 且处于 active (running) 状态。

  • 使用 Squid 本身:

    > sudo squid -k check | echo $?

    输出应为 0,但也可以包含其他消息,如警告。

要在本地系统上测试 Squid 的功能,请选择以下其中一种方式:

  • 使用命令行工具 squidclient,它可向 Web 请求输出响应,与 wgetcurl 类似。

    wgetcurl 不同的是,squidclient 可自动连接到 Squid 的默认代理设置 localhost:3128。不过,如果您修改过 Squid 的配置,则必须相应地配置 squidclient。有关详细信息,请访问 squidclient --help

    例 44.1︰ 通过 squidclient 提交的请求
    > squidclient http://www.example.org
    HTTP/1.1 200 OK
    Cache-Control: max-age=604800
    Content-Type: text/html
    Date: Fri, 22 Jun 2016 12:00:00 GMT
    Expires: Fri, 29 Jun 2016 12:00:00 GMT
    Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
    Server: ECS (iad/182A)
    Vary: Accept-Encoding
    X-Cache: HIT
    x-ec-custom-error: 1
    Content-Length: 1270
    X-Cache: MISS from moon1
    X-Cache-Lookup: MISS from moon:3128
    Via: 1.1 moon (squid/3.5.16)2
    Connection: close
    
    <!doctype html>
    <html>
    <head>
        <title>Example domain</title>
    [...]
    </body>
    </html>

    例 44.1 “通过 squidclient 提交的请求”中显示的输出由以下两部分组成:

    1. 响应的协议报头(空白行前面的行)。

    2. 响应的实际内容(空白行后面的行)。

    要校验是否使用了 Squid,请参见所选的报头行:

    1

    报头 X-Cache 的值显示所请求的文档不在计算机 moon 的 Squid 缓存 (MISS) 中。

    上面的示例包含两行 X-Cache。可以放心忽略第一个 X-Cache 报头,因为它是由源 Web 服务器的内部缓存软件生成的。

    2

    报头 Via 的值显示 HTTP 版本、计算机名称以及所使用的 Squid 版本。

  • 使用浏览器:将代理设置为 localhost 并将端口设置为 3128。然后加载页面,并在浏览器的检查器开发人员工具网络面板中检查响应报头。报头应该会以例 44.1 “通过 squidclient 提交的请求”中所示的类似方式再现。

要允许用户从本地系统和其他系统访问 Squid 和互联网,需要将配置文件 /etc/squid/squid.conf 中的 http_access deny all 项改为 http_access allow all。但请注意,这样任何人都能完全不受限制地访问 Squid。因此,需定义可控制对代理服务器的访问权限的 ACL(访问控制列表)。修改配置文件后,必须重新加载或重启动 Squid。有关 ACL 的详细信息,请参见第 44.5.2 节 “访问控制选项”

如果 Squid 运行较短时间后即停止,请检查名称服务器项是否有误,或者是否缺少 /var/run/netconfig/resolv.conf 文件。Squid 会在 /var/log/squid/cache.log 文件中记录启动失败的原因。

44.3.3 停止、重新加载和重启动 Squid

使用以下两种方式可重新加载 Squid:

  • 使用 systemctl:

    > sudo systemctl reload squid

    > sudo systemctl restart squid
  • 使用 YaST:

    在 Squid 模块中,单击立即保存设置并重启动 Squid 按钮。

要停止 Squid,请使用以下其中一种方式:

  • 使用 systemctl:

    > sudo systemctl stop squid
  • 使用 YaST

    在 Squid 模块中,单击立即停止 Squid按钮.

关闭 Squid 可能需要一些时间,因为 Squid 会等待最长半分钟时间,来中断与客户端的连接,并将其数据写入磁盘(请参见 /etc/squid/squid.conf 中的 shutdown_lifetime 选项)。

警告
警告:终止 Squid

使用 killkillall 来终止 Squid 有可能会损坏缓存。要能够重启动 Squid,必须删除损坏的缓存。

44.3.4 去除 Squid

从系统中去除 Squid 并不会去除缓存层次和日志文件。要去除这些数据,请手动删除 /var/cache/squid 目录。

44.3.5 本地 DNS 服务器

建立本地 DNS 服务器很有意义,即便并不用它来管理自己的域。在该情况下,它将充当仅供缓存的名称服务器,并且无需任何特殊配置即可通过根名称服务器解析 DNS 请求(请参见第 39.4 节 “启动 BIND 名称服务器”)。如何完成上述操作,取决于您在配置互联网连接的过程中是否选择了动态 DNS。

动态 DNS

通常,使用动态 DNS 时,服务提供方会在建立互联网连接时设置 DNS 服务器,并且本地文件 /var/run/netconfig/resolv.conf 会自动调整。可以在文件 /etc/sysconfig/network/config 中使用 NETCONFIG_DNS_POLICY sysconfig 变量指定此行为。使用 YaST sysconfig 编辑器将 NETCONFIG_DNS_POLICY 设置为 ""

然后在 /var/run/netconfig/resolv.conf 文件中添加本地 DNS 服务器,并为 localhost 指定 IP 地址 127.0.0.1。这样,Squid 每次一启动就能找到本地名称服务器。

为了使提供方的名称服务器可供访问,请在配置文件 /etc/named.conf 中的 forwarders 下指定该名称服务器及其 IP 地址。如果使用动态 DNS,则可在建立连接时自动完成此操作,只需将 sysconfig 变量 NETCONFIG_DNS_POLICY 设置为 auto 即可。

静态 DNS

有了静态 DNS,在建立连接时自动 DNS 调整便不会发生,所以不需要更改任何 sysconfig 变量。但是,必须按动态 DNS 中所述在 /var/run/netconfig/resolv.conf 文件中指定本地 DNS 服务器。此外,还必须在 /etc/named.conf 文件中的 forwarders 下手动指定提供方的静态名称服务器及其 IP 地址。

提示
提示:DNS 和防火墙

如果防火墙在运行,请确保 DNS 请求能够通过防火墙。

44.4 YaST Squid 模块

YaST Squid 模块包含以下选项卡:

入门

指定 Squid 的启动方式,以及在哪些接口上打开哪个防火墙端口。

HTTP 端口

定义 Squid 将用来侦听客户端 HTTP 请求的所有端口。

刷新模式

定义 Squid 如何处理缓存中的对象。

缓存设置

定义缓存内存、最大和最小对象大小等相关设置。

缓存目录

定义 Squid 将用来存储缓存交换文件的顶层目录。

访问控制

通过 ACL 组控制对 Squid 服务器的访问。

日志记录和超时

定义访问和缓存路径、缓存存储日志文件,以及连接超时和客户端生命周期。

杂项

指定管理员的语言和邮件地址。

44.5 Squid 配置文件

Squid 代理服务器设置存储在 /etc/squid/squid.conf 文件中。虽然首次启动 Squid 不需要对文件进行任何更改,但是外部客户端最初会被拒绝访问。代理可供 localhost 使用。默认端口为 3128.预装的配置文件 /etc/squid/squid.conf 提供了有关选项的详细信息和许多示例。

其中的许多项都已通过注释字符 # 禁用。行尾处提供了相关规范。给定值通常与默认值相关,因此仅去除注释符号而不更改任何参数通常没有什么影响。如果可能,请保留原始的注释行,在该行下方插入选项及修改过的值。这样,便可容易地恢复默认值,并将其与所作更改进行比较。

提示
提示:更新后调整配置文件

如果您是从较早的 Squid 版本更新,建议编辑新的 /etc/squid/squid.conf,并只应用旧文件中所做的更改。

有时,该文件中会添加、去除或修改 Squid 选项。因此,如果尝试使用旧的 squid.conf,Squid 可能会无法正常工作。

44.5.1 一般配置选项

下面列出了 Squid 的一些配置选项,但并不详尽。/etc/squid/squid.conf.documented 中列出了 Squid 软件包的完整选项列表,但仅做了简要说明。

http_port PORT

这是 Squid 侦听客户端请求所用的端口。默认端口为 3128,但也常使用 8080

cache_peer HOST_NAME TYPE PROXY_PORT ICP_PORT

此选项允许创建能够协同工作的缓存网络。缓存对等是一台也托管了网络缓存并与您自己的计算机有某种关系的计算机。TYPE 指定关系的类型。类型可能是 parentsibling

对于 HOST_NAME,请指定要使用的代理服务器的名称或 IP 地址。对于 PROXY_PORT,请指定浏览器中要使用的端口号(通常为 8080)。请将 ICP_PORT 设置为 7,如果父层的 ICP 端口未知并且其用途与提供方无关,则设置为 0

要使 Squid 像 Web 浏览器而非代理服务器一样运行,请通过追加 defaultno-query 选项来禁用 ICP 协议。

cache_mem SIZE

此选项定义 Squid 可为频率最高的答复使用的内存大小。默认值为 8 MB。它不指定 Squid 的内存使用率,并且可能已经超过。

cache_dir STORAGE_TYPE CACHE_DIRECTORY CACHE_SIZE LEVEL_1_DIRECTORIES LEVEL_2_DIRECTORIES

cache_dir 选项定义磁盘缓存的目录。在 SUSE Linux Enterprise Server 上的默认配置中,Squid 不会创建磁盘缓存。

占位符 STORAGE_TYPE 可以是以下其中一个:

  • 基于目录的存储类型:ufsaufs(默认值)、diskd。这三种类型都是 ufs 存储形式的变体。不过,虽然 ufs 作为核心 Squid 线程的一部分运行,但 aufs 是在单独的线程中运行,而 diskd 则使用单独的进程。这表示后两种类型可避免因磁盘 I/O 而阻止 Squid。

  • 基于数据库的存储系统:rock。此存储格式依赖于单一数据库文件,其中每个对象占用一个或多个固定大小的内存单元()。

下文只介绍基于 ufs 的存储类型的参数。rock 的参数不同。

CACHE_DIRECTORY 是磁盘缓存的目录,默认为 /var/cache/squidCACHE_SIZE 是该目录的最大大小(以 MB 为单位),默认设置为 100 MB。请将其设置为可用磁盘空间的 50% 到最大 80% 之间的值。

LEVEL_1_DIRECTORIESLEVEL_2_DIRECTORIES 值指定应在 CACHE_DIRECTORY 中创建的子目录数量。默认情况下,在 CACHE_DIRECTORY 下的第一级会创建 16 个子目录,在其中的每个子目录下会创建 256 个子目录。提高这些值时应谨慎,因为创建过多的目录可能会导致性能问题。

如果有多个磁盘共享一个缓存,请指定数行 cache_dir

cache_access_log LOG_FILE, cache_log LOG_FILE, cache_store_log LOG_FILE

这三个选项指定 Squid 记录其所有操作的路径。通常无需在这里进行任何更改。如果 Squid 负荷过重,则可能需要将缓存和日志文件分散到数个磁盘上。

client_netmask NETMASK

此选项允许通过应用子网掩码在日志文件中屏蔽客户端的 IP 地址。例如,要将 IP 地址的最后一位设置为 0,请指定 255.255.255.0

ftp_user E-MAIL

此选项允许设置 Squid 应该用于匿名 FTP 登录的口令。请在此处指定有效的电子邮件地址,因为 FTP 服务器会检查这些信息来验证有效性。

cache_mgr E-MAIL

Squid 崩溃时会向指定的电子邮件地址发送消息。默认为 webmaster

logfile_rotate VALUE

squid-k rotate 一起使用时,squid 会轮换日志文件。它会给文件编号,并且会在达到指定的值后覆盖最旧的文件。默认值为 10,即轮转编号为 0 到 9 的日志文件。

不过,在 SUSE Linux Enterprise Server 上,日志文件的轮换是通过使用 logrotate 和配置文件 /etc/logrotate.d/squid 自动执行的。

append_domain DOMAIN

使用 append_domain 可指定当未指定域时自动追加的域。通常在此处指定您自己的域,因此将浏览器指向 www 将导航到您自己的 Web 服务器。

forwarded_for STATE

如果此选项设置为 on,将会向报头添加如下所示的一行:

X-Forwarded-For: 192.168.0.1

如果将此选项设置为 off,Squid 会将客户端的 IP 地址和系统名称从 HTTP 请求中去除。

negative_ttl TIME, negative_dns_ttl TIME

如果配置了这些选项,Squid 会缓存某些类型的失败,例如 404 响应。之后,它会拒绝发出新请求,即使资源变为可用状态也不例外。

默认情况下,negative_ttl 设置为 0negative_dns_ttl 设置为 1 minutes。这表示默认不会缓存 Web 请求的负响应,但会将 DNS 请求的负响应缓存 1 分钟。

never_direct allow ACL_NAME

要防止 Squid 接受直接来自互联网的请求,可使用选项 never_direct 强制连接到另一个代理服务器。事先必须已在 cache_peer 中指定该代理。如果将 all 指定为 ACL_NAME,则所有请求都将直接转发给 parent。有时这可能是必要的,例如,您使用的提供商规定了其代理的使用方式或拒绝通过其防火墙直接访问互联网时。

44.5.2 访问控制选项

Squid 可通过访问控制列表 (ACL) 控制对代理服务器的访问。访问控制列表包含按顺序处理的规则。使用 ACL 之前必须先定义 ACL。Squid 包含默认 ACL,例如 alllocalhost。但要使 ACL 生效,它必须具有对应的 http_access 规则。

选项 acl 的语法如下所示:

acl ACL_NAME TYPE DATA

此语法中的占位符含义如下:

  • ACL_NAME 可以是任何名称。

  • 对于 TYPE,请选择 /etc/squid/squid.conf 文件的 ACCESS CONTROLS 部分提供的选项。

  • 指定什么 DATA 取决于相应的 ACL 类型(例如,主机名、IP 地址或 URL)。

要在 YaST Squid 模块中添加规则,请打开该模块,然后单击访问控制选项卡。在“ACL 组”列表下单击添加,输入规则的名称、类型及其参数。

有关 ACL 规则类型的详细信息,请参见 https://www.squid-cache.org/Versions/v3/3.5/cfgman/acl.html 上的 Squid 文档。

例 44.2︰ 定义 ACL 规则
acl mysurfers srcdomain .example.com 1
acl teachers src 192.168.1.0/255.255.255.0 2
acl students src 192.168.7.0-192.168.9.0/255.255.255.0 3
acl lunch time MTWHF 12:00-15:00 4

1

此 ACL 将 mysurfers 定义为来自 .example.com 中的所有用户(由 IP 的反向查找确定)。

2

此 ACL 将 teachers 定义为其计算机 IP 地址以 192.168.1. . 开头的用户。

3

此 ACL 将 students 定义为其计算机 IP 地址以 192.168.7.192.168.8.192.168.9. 开头的用户。

4

此 ACL 将 lunch 定义为星期一至星期五的中午到下午 3 点之间的某个时间。

http_access allow ACL_NAME

http_access 定义谁可以使用代理服务器,以及谁能够访问互联网上的什么内容。您需要为此定义 ACL。上文中已经定义了 localhostall ACL,您可以通过 denyallow 拒绝或允许访问它们。可以创建包含任意多个 http_access 项的列表,并按从上到下的顺序处理这些项。根据哪项先发生,系统会允许或拒绝访问相应的 URL。最后一项应该一律为 http_access deny all。在下例中,localhost 可随意访问任何内容,而所有其他主机则被拒绝访问:

http_access allow localhost
http_access deny all

在另外一个使用这些规则的示例中,teachers 组总能访问互联网。students 组只能在星期一到星期五的午餐时间访问:

http_access deny localhost
http_access allow teachers
http_access allow students lunch time
http_access deny all

为了提高可读性,请在配置文件 /etc/squid/squid.conf 中将所有 http_access 选项都指定为一个块。

url_rewrite_program PATH

使用此选项可指定 URL 重写程序。

auth_param basic program PATH

如果必须在代理服务器上对用户进行身份验证,请设置相应的程序,如 /usr/sbin/pam_auth。用户首次访问 pam_auth 时,系统会提示其提供用户名和口令。此外,您还需要一个 ACL,只让具有有效登录信息的客户端使用互联网:

acl password proxy_auth REQUIRED

http_access allow password
http_access deny all

acl proxy_auth 选项中,使用 REQUIRED 表示接受所有有效的用户名。REQUIRED 还可替换为允许的用户名列表。

ident_lookup_access allow ACL_NAME

使用此选项可启用 ident 请求操作,以便为类型为 src 的 ACL 所定义的所有客户端确定各个用户的身份。要对所有客户端启用此选项,请使用预定义的 ACL all 作为 ACL_NAME

ident_lookup_access 指定的所有客户端都必须运行 ident 守护程序。在 Linux 上,您可以使用 pidentd(软件包 pidentd)作为 ident 守护程序。为确保只有 ident 查找成功的客户端才有权访问,请定义相应的 ACL:

acl identhosts ident REQUIRED

http_access allow identhosts
http_access deny all

acl identhosts ident 选项设置为 REQUIRED 可确保接受所有有效的用户名。REQUIRED 还可替换为允许的用户名列表。

使用 ident 会延缓访问时间,因为对每个请求都要重复 ident 查找过程。

44.6 配置透明代理

透明代理会截获并回复 Web 浏览器的请求,因此 Web 浏览器可接收到所请求的页面,但并不知道它们来自何处。顾名思义,整个处理过程对用户而言是透明的。

使用代理服务器的标准方式如下:Web 浏览器向代理服务器的某端口发送请求,代理始终会提供要求的这些对象,而不论它们是否在其缓存中。不过,在以下情况下,使用 Squid 的透明代理模式很有效:

  • 出于安全考虑,所有客户端都需要使用代理服务器来访问互联网。

  • 所有客户端都必须使用代理服务器,无论客户端是否清楚这一点。

  • 网络中的代理服务器已转移,但是现有客户端需要保留其原有配置。

过程 44.1︰ Squid 充当透明代理服务器(命令行)
  1. /etc/squid/squid.conf 中,将 transparent 参数添加到 http_port 一行。此时应该有 2 行:

    http_port 3128⎄
    http_port 3128 transparent
  2. 重启动 Squid:

    > sudo systemctl restart squid
  3. 设置防火墙,以将 HTTP 流量重定向到 http_proxy 中指定的端口(在上例中为端口 3128)。然后重新加载防火墙配置。此操作假设已将区域 internal 指派给您的 LAN 接口。

    > sudo firewall-cmd --permanent --zone=internal \
        --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=LAN_IP
    > sudo firewall-cmd --permanent --zone=internal --add-port=3128/tcp
    > sudo firewall-cmd --reload

    用您的 LAN 接口或 Squid 所侦听接口的 IP 地址替换 LAN_IP

  4. 要确认是否一切正常,请检查 /var/log/squid/access.log 中的 Squid 日志文件。

44.7 使用 Squid 缓存管理器 CGI 接口 (cachemgr.cgi)

Squid 缓存管理器 CGI 接口 (cachemgr.cgi) 是一个 CGI 实用程序,用于显示正运行的 Squid 进程所占用内存的相关统计信息。它还提供了在不登录服务器的情况下管理缓存和查看统计信息的便捷方式。

过程 44.2︰ 设置 cachemgr.cgi
  1. 确保 Apache Web 服务器正在系统上运行。按第 42 章 “Apache HTTP 服务器中所示配置 Apache。请着重参见第 42.5 节 “启用 CGI 脚本”。要检查 Apache 是否已在运行,请使用:

    > sudo systemctl status apache2

    如果状态为 inactive,请使用 SUSE Linux Enterprise Server 默认设置启动 Apache:

    > sudo systemctl start apache2
  2. 现在,在 Apache 中启用 cachemgr.cgi。要执行此操作,请为 ScriptAlias 创建一个配置文件。

    在目录 /etc/apache2/conf.d 中创建该文件并将其命名为 cachemgr.conf。在该文件中添加以下内容:

    ScriptAlias /squid/cgi-bin/ /usr/lib64/squid/
    
    <Directory "/usr/lib64/squid/">
    Options +ExecCGI
    AddHandler cgi-script .cgi
    Require host HOST_NAME
    </Directory>

    HOST_NAME 替换为您要从中访问 cachemgr.cgi 的计算机的主机名。这样,只有您的计算机才能访问 cachemgr.cgi。要允许从任何位置访问该文件,请改为使用 Require all granted

    • 如果 Squid 和 Apache Web 服务器在同一台计算机上运行,则不需要修改 /etc/squid/squid.conf 配置文件。但需校验该文件是否包含以下几行:

      http_access allow manager localhost
      http_access deny manager

      其作用是让您仅可从您的计算机 (localhost) 访问管理器界面。

    • 如果 Squid 与 Apache Web 服务器在不同的计算机上运行,您需要添加额外的规则以允许从 CGI 脚本访问 Squid。定义服务器的 ACL(将 WEB_SERVER_IP 替换为 Web 服务器的 IP 地址):

      acl webserver src WEB_SERVER_IP/255.255.255.255

      确保以下规则都包含在配置文件中。请注意,顺序很重要。

      http_access allow manager localhost
      http_access allow manager webserver
      http_access deny manager
  3. (可选) (可选)您可以为 cachemgr.cgi 配置一个或多个口令。这样您还可以执行更多操作,例如远程关闭缓存或查看有关缓存的详细信息。要允许访问,请为选项 cache_mgrcachemgr_passwd 配置管理器的一个或多个口令和允许的操作列表。

    下面的示例配置允许用户无需身份验证即可查看索引页、菜单和计数器的 60 分钟平均值。该配置还允许使用口令 secretpassword 切换脱机模式,以及禁用其他所有功能。

    cache_mgr user
    cachemgr_passwd none index menu 60min
    cachemgr_passwd secretpassword offline_toggle
    cachemgr_passwd disable all

    cache_mgr 定义用户名。cache_mgr 定义使用哪个口令允许哪些操作。

    nonedisable 是特殊关键字:none 表示无需输入口令,disable 会完全禁用功能。

    登录 cachemgr.cgi 后便可全面查看完整的操作列表。要了解配置文件中需如何参照操作,请查看操作页面 URL 中 &operation= 后面的字符串。all 是一个特殊关键字,表示所有操作。

  4. 重新加载 Squid 和 Apache 以启用更改:

    > sudo systemctl reload squid
  5. 要查看统计信息,请转到先前设置的 cachemgr.cgi 页。例如 http://webserver.example.org/squid/cgi-bin/cachemgr.cgi

    选择正确的服务器。如果配置了用户名和口令,请指定这些信息。单击继续并浏览可用的统计信息。

44.8 使用 Calamaris 生成缓存报告

Calamaris 是一个 Perl 脚本,用来生成缓存活动的 ASCII 或 HTML 格式报告。它可以处理 Squid 访问日志文件。此工具不属于 SUSE Linux Enterprise Server 默认安装范围 — 要使用它,请安装 calamaris 软件包。有关 Calamaris 的更多信息,请访问 https://cord.de/calamaris-english

root 身份登录,然后输入:

# cat access1.log [access2.log access3.log] | calamaris OPTIONS > reportfile

使用多个日志文件时,请确保这些文件按时间顺序排列,越早的文件越靠前。这可以通过以下两种方式来实现:如上例一样逐一列出文件,或使用 access{1..3}.log

calamaris 接受下列选项:

-a

输出所有可用报告

-w

以 HTML 格式输出报告

-l

在报告标题处包含消息或徽标

有关选项的其他信息,请查看该程序的手册页 (man calamaris)。

典型示例如下:

# cat access.log.{10..1} access.log | calamaris -a -w \
> /usr/local/httpd/htdocs/Squid/squidreport.html

这会将报告保存到 Web 服务器的相应目录。需要通过 Apache 来查看这些报告。

44.9 更多信息

访问 Squid 的主页 https://www.squid-cache.org/。在此可找到Squid 用户指南及有关 Squid 的大量常见问题解答。

可在 https://www.squid-cache.org/Support/mailing-lists.html 上获得 Squid 邮件列表。