跳至内容

第五部分.3 Squid

Squid

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


目标:您将学会如何

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

🏁 squid, 代理, HTTP

知识⭐ ⭐
复杂度⭐ ⭐

阅读时间: 20 分钟


概述

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

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

无论哪种情况,都会出现网络中断:客户端无法再直接物理寻址远程服务器,而必须通过代理服务器。

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

Proxy-based architecture

注意

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

您不需要为所有客户端工作站配置强制代理。

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

Captive proxy-based architecture

注意

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

在标准代理或强制代理架构的情况下,此类服务的主要用途之一是充当缓存。

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

如您稍后将看到的,代理还有其他用途。

部署代理可以

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

优点包括以下几点

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

注意

实施身份验证可以阻止 LAN 上许多病毒的恶意影响。

警告

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

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

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

示例

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

关于 Squid

Squid 支持 HTTP 和 FTP 协议。

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

  • 硬件解决方案昂贵
  • 自 1996 年起开发
  • 根据 GNU/GPL 许可证发布
容量规划
  • 确保高可用性
  • 使用快速硬盘进行缓存
  • RAM 和 CPU 应正确配置容量

注意

每 GB 磁盘缓存分配 14MB 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

  • Internet 缓存协议 (ICP) icp_port

Internet 缓存协议 (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
选项 描述
ufs Unix 文件系统
100 大小(单位:兆)
16 16 个顶级文件夹
256 256 个二级文件夹

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

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 https:///
选项 描述
-s 静默模式(在控制台中不显示任何内容)
-h 定义目标代理
-p 监听端口(默认 3128)
-r 强制服务器重新加载对象

分析日志

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

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

日志行分解

选项 描述
日期 日志时间戳
响应时间 请求响应时间
@client 客户端 IP 地址
状态代码 HTTP 响应代码
大小 传输大小
方法 HTTP 方法(Put / Get / Post / 等)
URL 请求 URL
Peer Code 代理间响应代码
文件类型 请求目标的 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 连接是否使用您的代理下载更新。请注意,下一行的“存储库 URL”将被实际的镜像 URL 替换

1723793986.725     20 192.168.1.10 TCP_MISS/200 5238 GET "URL of repository"/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 "URL of repository"/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。这将使您能够集中与 Internet 的出站连接并保护您的本地网络。

检验您的知识

✔ squid 服务器默认监听的端口是什么?

  • 8080
  • 1234
  • 443
  • 3128

✔ Squid 是什么?

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

作者:Antoine Le Morvan

贡献者:Ganna Zhyrnova