跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

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 等客户端分流工具是更合适的选择。

作者

老丹

关注我
其他文章
上一个

PBR:OpenWrt 路由器上的策略路由完全指南

下一个

Clash 完全指南:规则驱动的现代代理工具

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Ubuntu 防火墙迁移指南:从 UFW 到 firewalld 的完整实践 2026年9月12日
  • Nano 编辑器完全操作指南:从入门到熟练 2026年9月12日
  • SSCG:让自签名证书不再“危险”的生成工具 2026年9月12日
  • Ubuntu Samba 服务安装与配置完全指南 2026年9月12日
  • 从零开始:用 Docker 部署 Jellyfin 并启用英特尔核显硬件加速 2026年9月11日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (17)
  • Linux服务配置 (50)
  • Linux系统 (16)
  • OpenWrt路由 (3)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 未分类 (1)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 音视频技术 (5)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号