第 5.3 部分 Squid
Squid¶
本章将介绍 Squid,HTTP 代理缓存。
目标:您将学习如何
安装 squid
配置它以作为代理和缓存 HTTP 内容。
squid, proxy, HTTP
知识:
复杂度:
阅读时间:20 分钟
概论¶
设置代理服务器涉及在两种类型的体系结构之间进行选择
- 需要对每个客户端及其 Web 浏览器进行特定配置的标准代理体系结构
- 俘获代理体系结构,它涉及拦截客户端发送的帧并将它们重写到代理服务器
无论哪种情况,网络都会出现中断:客户端不能再绕过代理服务器直接物理地址远程服务器。
两个防火墙保护客户端工作站,但从不直接与外部网络通信。
注意
此体系结构需要在客户端工作站上进行浏览器配置。
您无需使用俘获代理配置所有客户端工作站。
配置发生在网关级别,在那里它接收客户端请求并将帧透明地重写以将其发送到代理。
注意
此体系结构需要在路由器上进行特定配置。
在标准代理或俘获代理体系结构的情况下,此类服务的首要兴趣之一是充当缓存。
这样,从 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
选项 | 描述 |
---|---|
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 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