34 代理服务器 Squid #
Squid 是广泛用于 Linux 和 UNIX 平台的代理超速缓存。这表示它会将请求的因特网对象(例如 Web 或 FTP 服务器上的数据)储存在离请求工作站更近(与服务器相比)的计算机上。可以在多个层次中设置它,以确保即使在对最终用户来说是透明的模式下,也能达到最佳的响应速度和较低的带宽用量。可以使用其他诸如 squidGuard 的软件来过滤 Web 内容。
Squid 可以充当代理缓存。它将来自客户端(这里指来自 Web 浏览器)的对象请求重定向至服务器。当服务器回复所请求的对象后,它会将这些对象传递给客户端并在硬盘缓存中保存对象副本。超速缓存的其中一个优点是,当多个客户端请求同一对象时,可以从硬盘超速缓存提供该对象。这样客户端接收数据的速度要比从因特网接收快得多。此过程还可以减少网络流量。
除实际的超速缓存外,Squid 还提供众多其他功能:
在代理服务器的互通层次之间分配负载
为所有访问代理的客户端定义严密的访问控制列表
允许或拒绝使用其他应用程序访问特定网页
生成有关频繁访问的网页的统计数字以评估用户的浏览习惯
Squid 不是通用代理。通常只充当 HTTP 连接的代理。它支持 FTP、Gopher、SSL 和 WAIS 协议,但不支持其他因特网协议,如新闻协议或视频会议协议。由于 Squid 只支持将 UDP 协议用于在不同的超速缓存间提供通讯功能,因此很多多媒体程序都不受支持。
34.1 有关代理缓存的一些事实 #
作为代理缓存,Squid 的使用方法分为几种。与防火墙结合使用时,能够提高安全性。可以一起使用多个代理。还能确定应该缓存的对象的类型以及缓存的时间。
34.1.1 Squid 和安全性 #
Squid 可以与防火墙结合起来,通过使用代理缓存防止内部网络遭受外部攻击。防火墙会拒绝 Squid 之外的所有客户端对外部服务的访问。所有 Web 连接都必须通过代理方式建立。经过此配置后,Squid 便可全面控制 Web 访问。
如果防火墙配置中包含 DMZ,代理应该在此区域内操作。第 34.6 节 “配置透明代理”介绍如何实施透明代理。它能简化客户端的配置,因为在这种情况下,它们不需要有关代理的任何信息。
34.1.2 多个缓存 #
可以配置 Squid 的几个实例从而在它们之间交换对象。这样会降低系统总负载,提高从本地网络检索对象的几率。还可以配置超速缓存层次,以便超速缓存能够将对象请求转发给同级超速缓存或父超速缓存,如此其可从本地网络中的其他超速缓存或直接从数据源请求对象。
为了不给网络增加总体数据流量,为缓存层次选择适当的拓扑结构是十分重要的。对于超大型网络,合理的做法是:为每个子网配置一个代理服务器并将其连接至父代理,再通过父代理连接至 ISP 的代理超速缓存。
所有这些通讯都通过在 UDP 协议之上运行的 ICP(因特网缓存协议)来处理。缓存间的数据传送使用基于 TCP 的 HTTP(超文本传送协议)来处理。
为了找到最适合向其请求对象的服务器,一个超速缓存会向所有同级代理发送 ICP 请求。同级代理会通过 ICP 响应回复这些请求。如果检测到对象,它们会使用代码 HIT
,若未检测到,则会使用 MISS
。
如果发现多个 HIT
响应,代理服务器会根据哪个超速缓存发送回复的速度最快或哪个服务器较近等因素决定从哪个服务器下载。如果没有收到满意的响应,该请求会发送至父超速缓存。
为了避免网络中不同缓存中的对象重复,还会使用其他 ICP 协议,如 CARP(缓存阵列路由协议)或 HTCP(超文本缓存协议)。网络中维护的对象越多,找到所需对象的可能性就越大。
34.1.3 缓存因特网对象 #
网络中提供的许多对象都不是静态的,例如动态生成的页面和 TLS/SSL 加密内容。由于每次访问这类对象时它们都会更改,所以它们不会被超速缓存。
为确定对象应保留在超速缓存中的期限,系统会为对象指派多个状态中的一种。Web 和代理服务器会通过为这些对象添加报头来找出对象的状态(如“Last modified”或“Expires”)以及相应的日期。也可以使用指定不能超速缓存的对象的其他报头。
超速缓存中的对象通常会因缺少可用磁盘空间而通过 LRU(最近最少使用)之类的算法进行替换。这意味着代理会删除未被请求时间最长的对象。
34.2 系统要求 #
系统要求主要取决于系统必须承受的最大网络负载。由于负载在高峰期间可能是日均值的四倍以上,因此需要检查负载峰值。如果不能确定,请将系统要求稍微高估一点。让 Squid 在濒临其处理能力上限的状态下工作可能会严重影响其服务质量。以下几节按重要程度依次阐述了各个系统要素:
RAM 大小
CPU 速度/物理 CPU 内核
磁盘超速缓存的大小
硬盘/SSD 及其体系结构
34.2.1 RAM #
Squid 所需内存 (RAM) 大小与超速缓存中的对象数有直接的关系。随机存取内存比硬盘/SSD 快得多。因此,请务必让 Squid 进程拥有充足的内存,因为如果使用交换磁盘,系统性能会显著降低。
Squid 还会在主储存器中储存缓存对象引用和经常请求的对象,以加速对这些数据的检索。除此之外,Squid 还要在内存中保存其他数据,如:所有已处理 IP 地址的表、准确域名缓存、最常请求的对象、访问控制列表、缓冲区等等。
34.2.2 CPU #
Squid 已经过优化,最适合处理器内核较少的环境(4–8 个物理内核),这样每个内核都能提供高性能。提供虚拟核心的技术(如超线程)可能会降低性能。
要充分利用多个 CPU 内核,必须设置多个写入不同超速缓存设备的工作线程。默认情况下,多核心支持通常都是禁用的。
34.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 的磁盘空间来保存一天内超速缓存的数据浏览量。
34.2.4 硬盘/SSD 体系结构 #
速度在缓存过程中起到重要作用,所以此要素值得特别关注。对于硬盘/SSD,此参数通过以毫秒度量的随机搜索时间或随机读取性能来描述。Squid 从硬盘/SSD 读取或写入其中的数据块一般都较小,因此硬盘/SSD 的搜索时间/读取性能比其数据吞吐量更重要。
如果要充当代理,高转速硬盘或者 SSD 会是最好的选择。使用硬盘时,使用多个较小硬盘的效果可能更好,这样每个硬盘都有单独的超速缓存目录,可避免读取次数过多。
如果使用 RAID 系统,可以通过牺牲速度来提高可靠性。不过,出于性能原因,请避免使用(软件)RAID5 及类似设置。
文件系统的选择通常无关紧要。不过,使用装入选项 noatime
可以提高性能 - Squid 提供其自己的时间戳,如此便不需要文件系统来跟踪访问时间。
34.3 Squid 的基本用法 #
如果尚未安装,请安装包
squid
。SUSE® Linux Enterprise Server
上默认不会安装 squid 包。
Squid 已在 SUSE Linux Enterprise Server 中预先配置好,因此安装完后即可直接启动。为保证顺利启动,应该对网络进行配置,使其至少能连接一个名称服务器和因特网。如果拨号连接使用动态 DNS 配置,则可能出现问题。在这种情况下,至少应该指定名称服务器,因为如果在 /etc/resolv.conf
中未检测到 DNS 服务器,Squid 便不会启动。
34.3.1 启动 Squid #
要启动 Squid,请使用:
tux >
sudo systemctl start squid
如果想让 Squid 随系统一起启动,请使用 systemctl enable squid
启用该服务。
34.3.2 检查 Squid 是否正在工作 #
要检查 Squid 是否在运行,请选择以下其中一种方法:
使用
systemctl
:tux >
systemctl status squid
此命令的输出应指出 Squid
已装载
且处于活动状态(运行中)
。使用 Squid 本身:
tux >
sudo squid -k check | echo $?
此命令的输出应当为
0
,但也可能包含其他警告或讯息。
要测试 Squid 在本地系统上的功能,请选择以下其中一种方法:
要进行测试,您可以使用命令行工具
squidclient
,它可向 Web 请求输出响应,类似于wget
或curl
。与这些工具不同的是,
squidclient
将自动连接到 Squid 的默认代理设置localhost:3128
。不过,如果您更改过 Squid 的配置,则需要通过命令行选项将squidclient
配置为使用不同的设置。有关详细信息,请参见squidclient --help
。例 34.1︰ 通过squidclient
提交的请求 #tux >
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>例 34.1 “通过
squidclient
提交的请求”中显示的输出可分成两个部分:响应的协议报头:空白行前面的行。
响应的实际内容:空白行后面的行。
要校验是否使用了 Squid,请参见所选的报头行:
使用浏览器:将代理设置为
localhost
并将端口设置为3128
。然后您可以装载页面,并在浏览器的检查器或开发人员工具的 面板中检查响应报头。报头应该会以例 34.1 “通过squidclient
提交的请求”中所示的类似方式再现。
要允许用户从本地系统和其他系统访问 Squid 和因特网,需要将配置文件 /etc/squid/squid.conf
中的项 http_access deny all
改为 http_access allow all
。但在这样做时,要考虑到此操作会让所有人都不受任何限制地访问 Squid。因此,需定义可控制对代理的访问权限的 ACL(访问控制列表)。修改配置文件后,必须重新装载或重启动 Squid。有关 ACL 的详细信息,请参见第 34.5.2 节 “访问控制选项”。
如果 Squid 在成功启动后不久就退出,请检查名称服务器项是否有误,或者是否缺少 /etc/resolv.conf
文件。Squid 会在 /var/log/squid/cache.log
文件中记录启动失败的原因。
34.3.3 停止、重新装载和重启动 Squid #
要重新装载 Squid,请选择以下其中一种方法:
使用
systemctl
:root #
systemctl
reload squid或者
root #
systemctl
restart squid使用 YaST:
在 Squid 模块中,单击
按钮.
要停止 Squid,请选择以下其中一种方法:
使用
systemctl
:root #
systemctl
stop squid使用 YaST
在 Squid 模块中,单击
按钮.
关闭 Squid 可能需要一些时间,因为 Squid 会等待最长半分钟时间,来中断与客户端的连接并将其数据写入磁盘(请参见 /etc/squid/squid.conf
中的 shutdown_lifetime
选项)。
使用 kill
或 killall
终止 Squid 可能会损坏超速缓存。要能够重启动 Squid,必须删除损坏的超速缓存。
34.3.4 去除 Squid #
从系统中去除 Squid 并不会去除超速缓存层次和日志文件。要删除这些内容,请手动删除 /var/cache/squid
目录。
34.3.5 本地 DNS 服务器 #
建立本地 DNS 服务器很有意义,即便并不用它来管理自己的域。它仅起到缓存专用名称服务器的作用,并且可以在无需任何特殊配置的情况下通过 root 名称服务器解析 DNS 请求(请参见 第 26.4 节 “启动 BIND 名称服务器”)。如何完成上述操作,取决于您在配置因特网连接的过程中是否选择了动态 DNS。
- 动态 DNS
使用动态 DNS 时,因特网服务提供商通常在建立因特网连接过程中设置 DNS 服务器,并自动调整本地文件
/etc/resolv.conf
。可以在文件/etc/sysconfig/network/config
中使用以下 sysconfig 变量控制此行为:NETCONFIG_DNS_POLICY
。设置NETCONFIG_DNS_POLICY
更改为""
。然后在
/etc/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中所述在
/etc/resolv.conf
文件中指定本地 DNS 服务器。此外,还必须在/etc/named.conf
文件中的forwarders
下手动指定提供商的静态名称服务器及其 IP 地址。
如果运行了防火墙,应确保 DNS 请求能够通过。
34.4 YaST Squid 模块 #
YaST Squid 模块包含以下选项卡:
指定启动 Squid 的方式,以及在哪些接口上打开哪个防火墙端口。
定义 Squid 将用来侦听客户端 HTTP 请求的所有端口。
定义 Squid 如何处理超速缓存中的对象。
定义有关超速缓存内存、最大和最小对象大小等的设置。
定义 Squid 将用来储存所有超速缓存交换文件的顶层目录。
通过 ACL 组控制对 Squid 服务器的访问。
定义用于访问、超速缓存和超速缓存储存日志文件的路径,以及连接超时和客户端有效期。
设置管理员的语言和电子邮件地址。
34.5 Squid 配置文件 #
所有 Squid 代理服务器设置都在 /etc/squid/squid.conf
文件中进行。首次启动 Squid 时,不必在此文件中进行任何更改,但是外部客户端最初不具备访问权。代理可供 localhost
使用。默认端口为 3128
。预装的配置文件 /etc/squid/squid.conf
提供了有关选项的详细信息和许多示例。
许多条目都已注释掉,因此以注释字符 #
开头。行尾处提供了相关规范。给定值通常与默认值相关,因此仅去除注释符号而不更改任何参数通常没有什么影响。如果可能,请保留原始的注释行,在该行下方插入选项及修改过的值。这样,便可容易地恢复默认值,并将其与所作更改进行比较。
如果已从较早的 Squid 版本更新,建议编辑新的 /etc/squid/squid.conf
,并只应用以前文件中的更改。
有时,该文件中会添加、去除或修改 Squid 选项。因此,如果尝试使用旧的 squid.conf
,Squid 可能会无法正常工作。
34.5.1 一般配置选项 #
下面列出了 Squid 的一些配置选项,但并不详尽。/etc/squid/squid.conf.documented
中列出了 Squid 包的完整选项列表,其中仅做了简要记录。
http_port 端口
这是 Squid 侦听客户端请求所用的端口。默认端口为
3128
,但也常使用8080
。-
cache_peer 主机名 类型 代理端口 ICP 端口
此选项允许创建能够协同工作的超速缓存网络。超速缓存对等是一台也托管了网络超速缓存并与您自己的计算机有某种关系的计算机。类型指定关系的类型。类型可以是
parent
或sibling
。对于主机名,请指定要使用的代理的名称或 IP 地址。对于代理端口,请指定浏览器中要使用的端口号(通常为
8080
)。请将 ICP 端口设置为7
,如果父代理的 ICP 端口未知并且该端口的使用与提供商无关,则设置为0
。要让 Squid 以 Web 浏览器而非代理的方式工作,请禁止使用 ICP 协议。您可以通过追加
default
和no-query
选项来实现此目的。cache_mem 大小
此选项定义 Squid 可用于常用答复的内存大小。默认为
8 MB
。它不指定 Squid 的内存使用率,并且可能已经超过。-
cache_dir 储存类型 超速缓存目录 超速缓存大小 1 级目录 2 级目录
cache_dir
选项定义磁盘超速缓存的目录。在 SUSE Linux Enterprise Server 上的默认配置中,Squid 不会创建磁盘超速缓存。占位符储存类型可以是以下其中一个:
基于目录的储存类型:
ufs
、aufs
(默认值)、diskd
。这三种类型都是ufs
储存形式的变体。不过,虽然ufs
作为核心 Squid 线程的一部分运行,但aufs
是在单独的线程中运行,而diskd
则使用单独的进程。这表示后两种类型可避免因磁盘 I/O 而阻止 Squid。基于数据库的储存系统:
rock
。此储存格式依赖于单一数据库文件,其中每个对象占用一个或多个固定大小的内存单元(“槽”)。
下文将只介绍基于
ufs
的储存类型的参数。rock
的参数有些不同。超速缓存目录是磁盘超速缓存的目录,默认为
/var/cache/squid
。超速缓存大小是该目录的最大大小(以兆字节为单位),默认设置为 100 MB。请将其设置为可用磁盘空间的 50% 到最大 80% 之间的值。最后两个值(1 级目录和 2 级目录)指定超速缓存目录中创建的子目录数量。默认情况下,在超速缓存目录下的第一级会创建 16 个子目录,在其中的每个子目录下创建 256 个子目录。提高这些值时应谨慎,因为创建过多的目录可能会导致性能问题。
如果有多个磁盘共享一个超速缓存,请指定数行
cache_dir
。cache_access_log 日志文件
,cache_log 日志文件
,cache_store_log 日志文件
这三个选项指定 Squid 记录其所有操作的路径。通常无需在这里进行任何更改。如果 Squid 负担过重,则可能需要将超速缓存和日志文件分散到多个磁盘上。
client_netmask 网络掩码
此选项允许通过应用子网掩码在日志文件中屏蔽客户端的 IP 地址。例如,要将 IP 地址的最后一位设置为
0
,请指定255.255.255.0
。ftp_user 电子邮件
此选项允许设置 Squid 应该用于匿名 FTP 登录的口令。请在此处指定有效的电子邮件地址,因为有些 FTP 服务器会检查这些信息来验证有效性。
cache_mgr 电子邮件
如果 Squid 意外崩溃,将会向此电子邮件地址发送一封邮件。默认为 webmaster。
logfile_rotate 值
如果运行
squid
-k rotate
,Squid
可以轮转日志文件。在此过程中会给文件编号,并且在达到指定值后重写最旧的文件。默认值为10
,即轮转编号为 0 到 9 的日志文件。不过,在 SUSE Linux Enterprise Server 上,日志文件的轮转是通过使用
logrotate
和配置文件/etc/logrotate.d/squid
自动执行的。append_domain 域
使用 append_domain 可指定当未指定域时自动追加的域。通常在此处指定您自己的域,因此在浏览器中指定 www 将访问您自己的 Web 服务器。
forwarded_for 状态
如果此选项设置为
on
,将会向报头添加如下所示的一行:X-Forwarded-For: 192.168.0.1
如果将此选项设置为
off
,Squid 会将客户端的 IP 地址和系统名称从 HTTP 请求中去除。negative_ttl 时间
,negative_dns_ttl 时间
如果设置了这些选项,Squid 将会超速缓存某些类型的失败,例如
404
响应。以后,它将拒绝发出新请求,即使当时资源可用。默认情况下,
negative_ttl
设置为0
,negative_dns_ttl
设置为1 minute
。这表示默认不会超速缓存 Web 请求的负响应,但会将 DNS 请求的负响应超速缓存 1 分钟。never_direct allow ACL 名称
为防止 Squid 接受直接来自因特网的请求,可使用选项
never_direct
强制连接连到另一个代理。事先必须已在cache_peer
中指定该代理。如果将 ACL 名称指定为all
,则所有请求都将直接转发给父代理
。有时这可能是必要的,例如,您使用的提供商规定了其代理的使用方式或拒绝通过其防火墙直接访问因特网时。
34.5.2 访问控制选项 #
Squid 为控制针对代理的访问提供了一套周密的系统。这些访问控制列表 (ACL) 都是包含按顺序处理的规则的列表。使用 ACL 之前必须先定义 ACL。一些默认的 ACL 已经存在,如 all
和 localhost
。但是,仅仅定义 ACL 并不意味着实际应用 ACL。只有存在相应的 http_acces
规则时,才会应用。
选项 acl
的语法如下所示:
acl ACL_NAME TYPE DATA
此语法中的占位符含义如下:
名称 ACL_NAME 可以任意选择。
对于 TYPE,
/etc/squid/squid.conf
文件的ACCESS CONTROLS
部分提供了多个不同的选项,您可以从中加以选择。DATA 的规格取决于单个 ACL 类型,也可从文件中读取。例如,“通过”主机名、IP 地址或 URL。
要在 YaST Squid 模块中添加规则,请打开该模块,然后单击
选项卡。在“ACL 组”列表下单击 ,输入规则的名称、类型及其参数。有关 ACL 规则类型的详细信息,请参见 http://www.squid-cache.org/Versions/v3/3.5/cfgman/acl.html 上的 Squid 文档。
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
- http_access allow ACL 名称
http_access
定义谁可以使用代理,以及谁能够访问因特网上的什么内容。对于此选项,必须定义 ACL。上文中已经定义了localhost
和all
,您可以通过deny
或allow
拒绝或允许对它们的访问。可以创建一个包含任意数量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 路径
使用此选项可以指定 URL 重写程序。例如,它可以是 squidGuard (
/usr/sbin/squidGuard
),用于阻止不需要的 URL。通过此选项,可以使用代理身份验证和适当的 ACL 针对不同用户组分别控制因特网访问。有关 squidGuard 的详细信息,请参见第 34.8 节 “squidGuard”。
auth_param basic program 路径
如果必须在代理上对用户进行身份验证,请设置一个相应的程序,如
/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 名称
使用此选项,可以运行 ident 请求,以便为类型为
src
的 ACL 定义的所有客户端确定各个用户的身份。或者,可对所有客户端使用此选项,至于 ACL 名称,则应用预定义的 ACLall
。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 查找过程。
34.6 配置透明代理 #
使用代理服务器的一般方式如下:Web 浏览器向代理服务器的某端口发送请求,代理始终会提供要求的这些对象,而不论它们是否在其超速缓存中。不过,在某些情况下,Squid 的透明代理模式很有效:
如果出于安全考虑,建议所有客户端都使用代理来浏览因特网。
如果所有客户端都必须使用代理,无论客户端是否清楚这一点。
如果网络中的代理已转移,但是现有客户端需要保留其原有配置。
透明代理会截获并回复 Web 浏览器的请求,因此 Web 浏览器可接收到所请求的页面,但并不知道它们来自何处。顾名思义,整个处理过程对用户而言是透明的。
在
/etc/squid/squid.conf
的选项http_port
行中添加参数transparent
:http_port 3128 transparent
重启动 Squid:
tux >
sudo systemctl restart squid
设置 SuSEFirewall2 以将 HTTP 流量重定向到
http_proxy
中指定的端口(在上面的示例中为端口 3128)。为此,请编辑配置文件/etc/sysconfig/SuSEfirewall2
。本示例假设您使用的是以下设备:
设备指向因特网:
FW_DEV_EXT="eth1"
设备指向网络:
FW_DEV_INT="eth0"
在防火墙上定义供不可信的(外部)网络(如因特网)访问的端口和服务(请参见
/etc/services
)。在下例中,仅对外部提供 Web 服务:FW_SERVICES_EXT_TCP="www"
定义防火墙上从安全(内部)网络访问的端口或服务(请参见
/etc/services
),包括通过 TCP 和 UDP:FW_SERVICES_INT_TCP="domain www 3128" FW_SERVICES_INT_UDP="domain"
这会允许访问 Web 服务和 Squid(Squid 的默认端口为
3128
)。服务“域”代表 DNS(域名服务)。此服务很常用。否则,只需从上面的条目中去除domain
并将下面的选项设置为no
即可:FW_SERVICE_DNS="yes"
选项
FW_REDIRECT
非常重要,因为它用于将 HTTP 流量实际重定向到特定端口。配置文件中选项上方的注释中解释了其语法:# Format: # list of <source network>[,<destination network>,<protocol>[,dport[:lport]] # Where protocol is either tcp or udp. dport is the original # destination port and lport the port on the local machine to # redirect the traffic to # # An exclamation mark in front of source or destination network # means everything EXCEPT the specified network
即:
指定访问代理防火墙的内部网络的 IP 地址和网络掩码。
指定这些客户端的请求发往的 IP 地址和网络掩码。如果使用的是 Web 浏览器,请指定网络
0/0
(表示“至任意地址的通配符”)。指定这些请求最初发送到的端口。
指定所有这些请求要重定向到的端口。在下面的示例中,Web 服务(端口
80
)重定向到代理端口(端口3128
)。如果要添加更多网络或服务,请在相应条目中用空格分隔它们。由于 Squid 支持 HTTP 以外的协议,您也可以将请求从其他端口重定向到该代理。例如,还可以重定向端口 21 (FTP) 和端口 443(HTTPS 或 SSL)。
因此,对于 Squid 配置,您可以使用:
FW_REDIRECT="192.168.0.0/16,0/0,tcp,80,3128"
在配置文件
/etc/sysconfig/SuSEfirewall2
中,请确保START_FW
这一项设置为"yes"
。重启动 SuSEFirewall2:
tux >
sudo systemctl restart SuSEfirewall2
要确认是否一切正常,请检查
/var/log/squid/access.log
中的 Squid 日志文件。要校验所有端口是否都已正确配置,请从网络外的任意计算机对本计算机上的端口进行扫描。只有 Web 服务(端口 80)应该是打开的。要使用nmap
扫描端口,请使用:nmap
-O IP_ADDRESS
启动 YaST Squid 模块:
在
选项卡中,启用 。单击 以选择要在其上打开端口的接口。此选项只有在启用防火墙后才可用。在
选项卡中,选择包含端口3128
的第一行。单击
按钮。此时会显示一个小窗口,您可在其中编辑当前的 HTTP 端口。选择 。单击
完成。
按照过程 34.1 “Squid 充当透明代理 (命令行)”的步骤 3 中所述配置防火墙设置。
34.7 使用 Squid 超速缓存管理器 CGI 接口 (cachemgr.cgi
) #
Squid 超速缓存管理器 CGI 接口 (cachemgr.cgi
) 是一个 CGI 实用程序,用于显示正运行的 Squid 进程所占用内存的相关统计数字。这也是在不登录服务器的情况下,管理超速缓存和查看统计数字的一种便捷方式。
cachemgr.cgi
#确保 Apache Web 服务器正在系统上运行。按第 32 章 “Apache HTTP 服务器”中所示配置 Apache。请着重参见第 32.5 节 “启用 CGI 脚本”。要检查 Apache 是否已在运行,请使用:
tux >
sudo systemctl status apache2
如果显示
inactive
,您可以使用 SUSE Linux Enterprise Server 默认设置启动 Apache:tux >
sudo systemctl start apache2
现在,在 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
进行任何更改。但需校验/etc/squid/squid.conf
是否包含以下几行:http_access allow manager localhost http_access deny manager
这几行允许您从您自己的计算机 (
localhost
) 访问管理器界面,但不允许从其他位置访问。如果 Squid 与 Apache Web 服务器在不同的计算机上运行,您需要添加额外的规则以允许从 Squid 的 CGI 脚本访问。定义服务器的 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
(可选) (可选)您可以为
cachemgr.cgi
配置一个或多个口令。这样还可允许执行更多操作,例如远程关闭超速缓存或查看超速缓存的更多信息。为此,请使用管理器的一个或多个口令和允许的操作列表配置选项cache_mgr
和cachemgr_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
定义使用哪个口令允许哪些操作。none
和disable
是特殊关键字:none
表示无需输入口令,disable
会完全禁用功能。登录
cachemgr.cgi
后便可全面查看完整的操作列表。要了解配置文件中需如何参照操作,请查看操作页 URL 中&operation=
后面的字符串。all
是一个特殊关键字,表示所有操作。配置文件更改后重新装载 Squid 和 Apache:
tux >
sudo systemctl reload squid
要查看统计数字,请转到先前设置的
cachemgr.cgi
页。例如http://webserver.example.org/squid/cgi-bin/cachemgr.cgi
。选择正确的服务器,如已设置,请指定用户名和口令。然后单击
浏览不同的统计数字。
34.8 squidGuard #
本节的目的并不是要解释 squidGuard 的详细配置,而只是介绍该程序并为使用该程序提些建议。要深入了解配置问题,请参见 squidGuard 的 网站 http://www.squidguard.org。
squidGuard 是一款用于 Squid 的免费 (GPL)、灵活而快捷的过滤器、重定向器和访问控制器插件。使用它可以针对 Squid 缓存定义多种访问规则,对不同用户组加以不同的限制。squidGuard 使用 Squid 的标准重定向接口。squidGuard 可以执行以下操作:
将某些用户的 Web 访问权限制为只能访问一组可接受的或知名 Web 服务器或 URL。
防止某些用户访问某些列出的或在黑名单中列出的 Web 服务器或 URL。
防止某些用户访问与一组正则表达式或单词匹配的 URL。
将拦截的 URL 重定向至基于 CGI 的“智能”信息页面。
将未注册用户重定向至注册表单。
将横幅重定向至空白 GIF。
使用基于时间、周中各天、日期等的不同访问规则。
对不同用户组使用不同规则。
squidGuard 和 Squid 不能用于:
编辑、过滤或审查文档内的文本。
编辑、过滤或检查 HTML 嵌入脚本语言,如 JavaScript。
在使用 squidGuard 之前,请先安装 squidGuard 。
提供最小的配置文件,如
/etc/squidguard.conf
。可在 http://www.squidguard.org/Doc/examples.html 中找到配置示例。以后可尝试更为复杂的配置设置。接下来,创建一个“拒绝访问”HTML 页面或 CGI 页面,以便在客户端请求列在黑名单中的网站时,Squid 可重定向到该页面。强烈建议使用 Apache。
现在,配置 Squid 以使用 squidGuard。使用
/etc/squid/squid.conf
文件中的以下项:redirect_program /usr/bin/squidGuard
名为
redirect_children
的另一选项配置在该计算机上运行的“重定向”(在此例中是 squidGuard)进程数。设置的进程越多,所需的 RAM 就越多。先尝试使用较小的数字,例如4
。redirect_children 4
最后,通过运行
systemctl reload squid
让 Squid 装载新配置。现在,可以通过浏览器测试这些设置。
34.9 使用 Calamaris 生成缓存报告 #
Calamaris 是一个 Perl 脚本,用来以 ASCII 或 HTML 格式生成缓存活动的报告。它可以处理本机 Squid 访问日志文件。Calamaris 的主页为 http://cord.de/calamaris-english。此工具不属于 SUSE Linux Enterprise Server 默认安装范围 — 要使用它,请安装 calamaris
包。
以 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 来查看这些报告。
34.10 更多信息 #
访问 Squid 的主页 http://www.squid-cache.org/。在此可找到 “Squid 用户指南”及有关 Squid 的大量 FAQ(常见问题解答)信息。
此外还通过 http://www.squid-cache.org/Support/mailing-lists.html 提供 Squid 的邮件列表。