Squid 完全指南:开源代理服务器的全面解析
一、什么是 Squid?
Squid 是一款开源的代理缓存服务器软件,诞生于 1996 年,源自 Harvest Cache Daemon 项目,至今已有近 30 年的持续开发历史。它是全球范围内部署最广泛、最成熟的代理服务器之一,被企业网络、互联网服务提供商和内容分发网络广泛采用。
通俗地说,Squid 就是安装在服务器上的一个网络中转站。当客户端(如电脑、手机)需要访问互联网资源时,可以先将请求发送给 Squid,由 Squid 代为获取数据并返回给客户端。这相当于在网络请求的路径上增加了一个“中间人”,而这个“中间人”能够提供加速、管控和转发等多种增值功能。
二、Squid 的核心功能
Squid 之所以能流行近三十年,主要得益于以下三大核心能力。
2.1 缓存加速
这是 Squid 最著名的功能。当多个客户端请求相同的网络资源(如网页、图片、软件包)时,Squid 会将第一次获取的资源保存到本地存储中。后续的请求直接从本地缓存返回,无需再次访问源服务器。
这一机制带来的好处非常直接:显著降低网络延迟,因为数据从本地缓存读取比从远程服务器获取快得多;节省出口带宽,重复请求不再消耗带宽资源;减轻源服务器负载,源服务器无需为海量重复请求提供服务。
2.2 代理转发
Squid 的核心角色就是“转发者”。它接收客户端的请求,根据配置规则将请求转发给目标服务器,然后将服务器返回的数据回传给客户端。在这个过程中,Squid 可以隐藏客户端的真实 IP 地址,起到隐私保护的作用。
2.3 访问控制
通过灵活的访问控制列表机制,Squid 可以对网络访问进行精细化管控。管理员可以基于以下维度制定规则:客户端的 IP 地址或网段、目标域名或 URL、访问端口、时间段、请求方法等。
三、Squid 的三种工作模式
根据部署方式和应用场景的不同,Squid 可以工作在三种模式下。
3.1 正向代理
正向代理是 Squid 最基础也最常用的工作模式。在此模式下,客户端需要主动在浏览器或系统网络设置中配置代理地址。之后,客户端的所有网络请求都会先发送给 Squid 服务器,由 Squid 代为访问互联网资源。
典型应用场景:企业内网用户统一通过代理访问外网,实现访问控制和流量审计。
3.2 透明代理
透明代理是正向代理的一种特殊形式,其核心特点是客户端无需任何配置。网络设备(如路由器)通过策略路由或防火墙规则,自动将所有网络请求劫持并转发给 Squid。客户端完全感知不到代理的存在,使用体验与直接连接互联网无异。
典型应用场景:企业或学校网络中,在不改变用户任何设置的前提下,实现上网管理和内容缓存加速。
3.3 反向代理
反向代理与前两种模式的方向相反。在反向代理模式下,Squid 站在一个或多个网站服务器的前面,代表这些服务器接收来自互联网的请求。外部用户以为他们直接访问的是源服务器,实际上所有请求都由 Squid 处理。
典型应用场景:为高访问量的网站提供缓存和负载均衡,有效保护后端真实服务器,提升网站的响应速度和可用性。
四、Squid 的部署与配置
4.1 安装 Squid
在主流 Linux 发行版上,Squid 的安装非常简单:
- Ubuntu/Debian 系统:
sudo apt update && sudo apt install squid -y - CentOS/RHEL/Fedora 系统:
sudo dnf install squid -y
4.2 配置文件结构
Squid 的主配置文件位于 /etc/squid/squid.conf。这个文件包含了 Squid 的所有运行参数、访问控制规则和缓存策略。配置文件采用“指令 参数”的格式,以 # 开头的行表示注释。
4.3 基础配置示例
以下是一个仅允许特定 IP 段客户端使用的正向代理配置:
# 监听端口
http_port 3128
# 定义允许的客户端 IP 段
acl localnet src 192.168.1.0/24
# 定义安全端口
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
# 应用访问控制规则(顺序决定优先级)
http_access deny !Safe_ports
http_access allow localnet
http_access allow localhost
http_access deny all
配置要点:http_access 规则遵循自上而下匹配,命中即停止的原则。因此,http_access deny all 必须放在所有允许规则的最后,否则所有请求都会被拒绝。
4.4 启动与验证
配置完成后,执行以下命令启动 Squid:
# 检查配置文件语法
sudo squid -k parse
# 初始化缓存目录(首次启动前执行)
sudo squid -z
# 启动服务并设置开机自启
sudo systemctl start squid
sudo systemctl enable squid
4.5 防火墙配置
如果服务器开启了防火墙,需要放行 Squid 的监听端口(默认为 3128):
- Ubuntu/Debian(UFW):
sudo ufw allow 3128/tcp - CentOS/RHEL(firewalld):
sudo firewall-cmd --permanent --add-port=3128/tcp && sudo firewall-cmd --reload - 云服务器:需在云平台的安全组规则中放行该端口。
五、访问控制详解
5.1 基于域名的过滤
Squid 可以通过 dstdomain ACL 类型实现基于域名的访问控制。这是实现“指定域名走代理”需求的核心机制。
# 定义允许访问的域名白名单(注意 . 前缀表示匹配所有子域名)
acl allowed_domains dstdomain .google.com .youtube.com .github.com
# 定义禁止访问的域名黑名单
acl blocked_domains dstdomain .facebook.com .twitter.com
# 应用规则
http_access allow allowed_domains
http_access deny blocked_domains
http_access deny all
注意:.foo.com 匹配 bar.foo.com 等任意子域名,而 foo.com 仅精确匹配 foo.com 本身。
5.2 基于 IP 地址的控制
acl internal_net src 192.168.0.0/16
acl trusted_host src 10.0.0.1
http_access allow internal_net
http_access allow trusted_host
5.3 基于时间段的控制
# 定义工作时间(周一至周五 9:00-17:00)
acl work_hours time MTWHF 09:00-17:00
http_access allow work_hours
5.4 用户认证
Squid 支持通过用户名和密码进行认证,常用的认证方式包括 NCSA(基于 htpasswd 文件)、LDAP、RADIUS 等。
六、常见问题与注意事项
6.1 Squid 能否实现“非白名单直连”?
不能。 这是 Squid 与客户端分流工具(如 Clash)之间的本质区别。
- Squid 的工作方式:客户端的所有请求都发送给 Squid,Squid 在服务端根据 ACL 规则决定是放行(代理转发) 还是拒绝(返回错误页面)。当请求被拒绝时,客户端只能收到访问被拒绝的错误提示。
- Clash 的工作方式:客户端自行判断哪些请求走代理、哪些直连。只有符合代理规则的流量才会发给代理服务器,其他流量在本地直接发出,完全不经过代理服务器。
因此,如果你的需求是“白名单走代理,非白名单自动直连且不报错”,Squid 的架构无法实现,应使用 Clash 等客户端分流工具。
6.2 HTTPS 流量的处理
Squid 对 HTTPS 流量采用 CONNECT 隧道方式转发。Squid 会建立一个加密通道,将加密数据原封不动地转发给目标服务器,自身无法查看或缓存加密流量。配置时需确保 CONNECT 方法和 443 端口已被 ACL 允许。
6.3 配置文件注意事项
http_access deny all必须放在所有允许规则的最后。- 如果某个 ACL 引用了一个空的外部文件,Squid 将无法启动。
- 修改配置文件后,必须先执行
squid -k parse检查语法,再执行systemctl reload squid或squid -k reconfigure重新加载配置。
七、总结
Squid 是一款功能强大、成熟稳定的开源代理服务器,其核心价值体现在以下三个方面:
- 缓存加速:通过本地缓存大幅提升访问速度,节省带宽资源。
- 精细管控:通过灵活的 ACL 机制实现基于域名、IP、时间、用户等多维度的访问控制。
- 灵活部署:支持正向代理、透明代理和反向代理三种工作模式,适应不同场景需求。
Squid 最适合以下场景:企业网络出口的统一代理与管控、内网软件源(如 apt/yum/npm)的本地缓存加速、以及需要服务端进行访问控制的场景。
对于需要在客户端实现“指定域名走代理、其他域名自动直连”的轻量化个人场景,Clash 等客户端分流工具是更合适的选择。