跳至内容

第 5.3 部分 Squid

Squid

本章将介绍 Squid,HTTP 代理缓存。


目标:您将学习如何

✔ 安装 squid
✔ 配置它以作为代理和缓存 HTTP 内容。

🏁 squid, proxy, HTTP

知识⭐ ⭐
复杂度⭐ ⭐

阅读时间:20 分钟


概论

设置代理服务器涉及在两种类型的体系结构之间进行选择

  • 需要对每个客户端及其 Web 浏览器进行特定配置的标准代理体系结构
  • 俘获代理体系结构,它涉及拦截客户端发送的帧并将它们重写到代理服务器

无论哪种情况,网络都会出现中断:客户端不能再绕过代理服务器直接物理地址远程服务器。

两个防火墙保护客户端工作站,但从不直接与外部网络通信。

Proxy-based architecture

注意

此体系结构需要在客户端工作站上进行浏览器配置。

您无需使用俘获代理配置所有客户端工作站。

配置发生在网关级别,在那里它接收客户端请求并将帧透明地重写以将其发送到代理。

Captive proxy-based architecture

注意

此体系结构需要在路由器上进行特定配置。

在标准代理或俘获代理体系结构的情况下,此类服务的首要兴趣之一是充当缓存。

这样,从 WAN(可能比 LAN 速度慢的链路)下载一次的文件将存储在代理缓存的内存中,供后续客户端使用。 这优化了慢速链路上的带宽。

正如您将在后面看到的那样,代理还有其他用途。

部署代理可以

  • 根据各种参数拒绝访问特定资源
  • 设置客户端互联网活动的身份验证和监控
  • 设置分布式缓存的层次结构
  • 从 WAN 的角度隐藏 LAN 架构(LAN 上有多少个客户端?)

主要优点包括以下内容

  • 互联网匿名性
  • 身份验证
  • 客户端活动记录
  • 过滤
  • 限制访问
  • 带宽优化
  • 安全

注意

实施身份验证阻止了病毒对 LAN 的许多恶意影响。

警告

代理服务成为需要高可用性的关键服务。

在运行 Squid 代理服务器时,管理员必须利用日志。 因此,了解主要的 HTTP 响应代码至关重要。

代码类别
1XX信息
2XX成功
3XX重定向
4XX客户请求错误
5XX服务器错误

示例

  • 200:ok
  • 301:永久移动
  • 302:暂时移动
  • 304:未修改
  • 400:错误请求
  • 401:未授权
  • 404:未找到

关于 Squid

Squid 支持 HTTP 和 FTP 协议。

安装基于 Squid 服务器的解决方案的优点

  • 硬件解决方案价格昂贵
  • 自 1996 年起开发
  • 在 GNU/GPL 许可下发布
大小调整
  • 确保高可用性
  • 使用快速硬盘进行缓存
  • RAM 和 CPU 应该正确调整大小

注意

每 GB 磁盘缓存分配 14 MB 的 RAM。

安装

安装 squid 软件包

sudo dnf install squid

警告

注意在缓存初始化之前不要启动服务!

Squid 服务器树和文件

唯一的配置文件是 /etc/squid/squid.conf

服务日志(停止和重启)位于 /var/log/squid.cache.log,而客户端请求位于 /var/log/squid/access.log。默认情况下,缓存文件位于 /var/spool/squid/

squid 命令

squid 命令控制 squid 服务器。

命令的语法

squid [-z|-s|-k parse|-k rotate]
选项描述
-z初始化缓存目录
-s启用 syslog 日志记录
-k parse测试配置文件
-k rotate旋转日志

记录客户端请求会导致快速存储大量数据。

定期创建一个新的日志文件并将旧的日志文件归档为压缩格式是一个好主意。

您可以手动使用 squid 命令的 -k rotate 选项,或者使用专用的 Linux 服务 logrotate 自动执行此操作。

配置

/etc/squid/squid.conf 中配置 Squid。

  • 代理端口号(监听端口)http_port
http_port num_port

注意

端口号默认设置为 3128,但经常更改为 8080。请记住打开相应的防火墙端口!

当服务重启时,Squid 服务器将在 http_port 指令定义的端口上监听。

  • RAM 预留 cache_mem
cache_mem taille KB|taille MB|taille GB

例如

cache_mem 1 GB

提示

最佳实践:分配总 RAM 的 1/3

  • 互联网缓存协议 (ICP) icp_port

互联网缓存协议 (ICP) 使相邻的 Squid 服务器能够交换请求。通常建议建立一个代理层次结构,这些代理共享其信息库。

icp_port 指令定义 Squid 用于向相邻的 Squid 服务器发送和接收 ICP 请求的端口号。

提示

设置为 0 以停用。

  • 匿名 FTP 用户 ftp_user

ftp_user 指令将 FTP 用户与匿名 FTP 连接相关联。用户必须拥有有效的电子邮件地址。

ftp_user bob@rockylinux.lan
  • 设置访问控制列表

ACL 语法

acl name type argument
http_access allow|deny aclname

示例

acl LUNCHTIME time 12:00-14:00
http_access deny LUNCHTIME

对 ACL 的更深入讨论位于“高级配置”部分。

  • 缓存对象的最大大小 maximum_object_size

maximum_object_size 指令语法

maximum_object_size size

示例

maximum_object_size 32 MB

如果对象大小超过 maximum_object_size 限制,则不会缓存对象。

  • 代理服务器名称 visible_hostname

visible_hostname 指令的语法

visible_hostname name

示例

visible_hostname proxysquid

注意

提供的值可能与主机名不同。

  • 为 squid 定义缓存 cache_ufs
cache_ufs format path size nbFolderNiv1 nbFolderNiv2

可以在不同的文件系统上定义多个缓存以优化访问时间。

示例

cache_dir ufs /var/spool/squid/ 100 16 256
选项描述
ufsUnix 文件系统
100以兆字节为单位的大小
1616 个顶级文件夹
256256 个二级文件夹

当服务首次启动时,它将生成缓存目录

sudo squid -z
sudo systemctl start squid

高级配置

访问控制列表 (ACL)

http_access 指令的语法

http_access allow|deny [!]acl_name

示例

http_access allow LUNCHTIME
http_access deny !LUNCHTIME

!acl_name ACL 与 acl_name ACL 相反。

acl 指令的语法

acl name type argument

ACL 的顺序是累积的。具有相同名称的多个 ACL 代表单个 ACL。

示例

午餐时间授权

acl LUNCHTIME time 12:00-14:00
http_access allow LUNCHTIME

禁止视频

acl VIDEOS rep_mime_type video/mpeg
acl VIDEOS rep_mime_type video/avi
http_access deny VIDEOS

管理 IP 地址

acl XXX src 192.168.0.0/255.255.255.0
acl XXX dst 10.10.10.1

FQDN 管理

acl XXX srcdomain .rockylinux.org
acl XXX dstdomain .linux.org

端口管理

acl XXX port 80 21

协议管理

acl XXX proto HTTP FTP

缓存算法

存在具有不同特征的不同缓存算法

  • LRU - 最近最少使用:从 RAM 中删除最旧的对象
  • LRU-THOLD:根据对象的大小将其复制到缓存中
  • MRU:最近最常使用:删除请求次数最少的数据
  • GDSF:贪婪双尺寸频率:根据原始大小和访问时间删除,保留最小值
  • LFUDA:最不常使用,具有动态老化:与 GDSF 相同,但没有大小概念。适用于具有大型文件的缓存

客户端身份验证

Squid 依赖于外部程序来管理身份验证。它可以基于简单的平面文件,如 htpasswd,或基于 LDAP、SMB、PAM 或其他服务。

身份验证也可能在法律上是必要的。请记住让您的用户签署使用章程!

工具

squidclient 命令

使用 squidclient 命令测试对 squid 服务器的请求。

squidclient 命令语法

squidclient [-s] [-h target] [-p port] url

示例

squidclient -s -h localhost -p 8080 http://localhost/
选项描述
-s静默模式(在控制台中不显示任何内容)
-h定义目标代理
-p监听端口(默认值为 3128)
-r强制服务器重新加载对象

分析日志

您可以使用以下命令监控 Squid 的日志记录

tail -f /var/log/squid/access.log

日志行的分解

选项描述
日期日志时间戳
响应时间请求的响应时间
@client客户端 IP 地址
状态码HTTP 响应码
大小传输大小
方法HTTP 方法(Put / Get / Post 等)
URL请求 URL
对等码代理间响应码
文件类型请求目标的 MIME 类型

安全性

防火墙应为监听端口打开

sudo firewall-cmd --add-port=3128/tcp --permanent
sudo firewall-cmd --reload

研讨会

在本研讨会中,您将在服务器上安装 Squid 并使用它来下载更新。

任务 1:安装和配置 Squid

安装 Squid

sudo dnf install squid
sudo systemctl enable squid
sudo firewall-cmd --add-port=3128/tcp --permanent
sudo firewall-cmd --reload

取消 /etc/squid/squid.conf 文件中此行的注释以在磁盘上创建缓存目录

cache_dir ufs /var/spool/squid 100 16 512

根据需要调整缓存大小。

创建缓存目录并启动服务。

sudo squid -z
sudo systemctl start squid

任务 2:使用 curl 访问您的代理

在您的代理服务器上打开一个新的终端以跟踪代理的访问。

sudo tail -f /var/log/squid/access.log

在第二个终端上,使用 curl 通过代理访问网页

$ curl -I --proxy "http://192.168.1.10:3128" https://docs.rocky-linux.cn  
HTTP/1.1 200 Connection established

HTTP/2 200 
content-type: text/html
...

如您所见,存在两个 HTTP 连接。第一个连接与代理,第二个连接从代理到远程服务器。

您可以在第二个终端上看到跟踪

1723793294.548     77 192.168.1.10 TCP_TUNNEL/200 3725 CONNECT docs.rockylinux.org:443 - HIER_DIRECT/151.101.122.132 -

此处没有缓存内容,因为您向远程服务器请求了 https 连接。

任务 3:配置 DNS 以使用您的代理服务器

编辑 /etc/dnf/dnf.conf 文件以使用代理 squid

[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
proxy=http://192.168.1.10:3128

清除您的 dnf 缓存并尝试更新

sudo dnf clean all
sudo dnf update

在您的终端上验证 dnf 连接是否使用您的代理来下载其更新

1723793986.725     20 192.168.1.10 TCP_MISS/200 5238 GET http://rocky.reloumirrors.net/9.4/extras/x86_64/os/repodata/7d78a729-8e9a-4066-96d4-ab8ed8f06ee8-FILELISTS.xml.gz - HIER_DIRECT/193.106.119.144 application/x-gzip
...
1723794176.255      1 192.168.1.10 TCP_HIT/200 655447 GET http://miroir.univ-lorraine.fr/rocky/9.4/AppStream/x86_64/os/repodata/1af312c9-7139-43ed-8761-90ba3cd55461-UPDATEINFO.xml.gz - HIER_NONE/- application/x-gzip

在此示例中,您可以看到一个连接具有 TCP_MISS(缓存中不存在),另一个连接具有 TCP_HIT(使用缓存来响应客户端)。

结论

您现在掌握了在本地网络上安装 Squid 所需的知识。这将使您能够将传出到互联网的连接集中起来并保护您的本地网络。

检查您的知识

✔ 默认情况下,squid 服务器监听哪个端口?

  • 8080
  • 1234
  • 443
  • 3128

✔ 什么是 Squid?

  • 反向代理缓存
  • 代理缓存

作者:Antoine Le Morvan

贡献者:Ganna Zhyrnova