目录
- 什么是 Squid?
- Squid 的主要用途
- 工作原理
- 安装与配置 Squid
- 常用配置详解
- 高级功能
- 安全与访问控制
- 日志管理
- 常见问题与排查
什么是 Squid?
Squid 是一个广泛使用的、高性能的代理缓存服务器,它主要运行在 Linux 和其他类 Unix 系统上。

Squid 就像一个“网络中间人”,当你(客户端)想访问互联网上的某个资源(www.google.com)时,你的请求不是直接发往 Google,而是先发给 Squid 服务器,Squid 代表你去获取资源,并将获取到的内容缓存一份,当下一个用户再请求同样的资源时,Squid 就可以直接从本地缓存中返回,而无需再次访问互联网,从而大大加快访问速度并节省网络带宽。
Squid 不仅仅是一个 HTTP/HTTPS 代理,它也支持 FTP、Gopher 等多种协议。
Squid 的主要用途
- 内容缓存与加速:这是 Squid 最核心的功能,通过缓存频繁访问的网页、图片、视频等,显著提高用户访问速度,减少重复请求对互联网带宽的占用。
- 访问控制与内容过滤:可以配置 Squid 作为企业的网关,统一管理员工上网行为。
- 黑白名单:禁止或允许访问特定网站(如社交网站、视频网站)。
- 时间控制:在特定时间段(如工作时间)禁止访问某些网站。
- 用户认证:要求用户输入用户名和密码才能上网。
- 安全网关:作为内网与外网之间的一个屏障,可以隐藏内网客户端的真实 IP 地址,提供一定程度的匿名性,Squid 可以与杀毒软件(如 ClamAV)集成,扫描下载的文件。
- 反向代理:这是 Squid 的一项高级应用,它将 Squid 部署在 Web 服务器(如 Nginx, Apache)前面,代替 Web 服务器接收来自互联网的请求,Squid 缓存 Web 服务器的动态或静态内容,从而减轻 Web 服务器的负载,提高网站的整体响应速度和可用性。
- 网络流量日志与分析:Squid 会记录所有经过它的访问请求,这些日志可以用于分析网络流量模式、用户行为、排查网络问题等。
工作原理(正向代理)
以最常见的正向代理为例,其工作流程如下:
- 客户端配置:将浏览器或其他网络应用(如
curl,wget)的代理服务器地址设置为 Squid 服务器的 IP 和端口(默认为3128)。 - 发送请求:客户端访问
http://www.example.com,该请求被发送到 Squid 服务器。 - Squid 处理请求:
- Squid 首先检查自己的缓存中是否已经有
www.example.com的副本。 - 缓存命中
Squid 发现缓存中有该资源且未过期,它会直接将缓存中的内容返回给客户端,这个过程非常快。
(图片来源网络,侵删) - 缓存未命中
- Squid 缓存中没有该资源,或者资源已过期,它会代表客户端向
www.example.com的真实服务器发起请求。 - 后,Squid 会将内容存一份到自己的缓存中,然后将内容返回给客户端。
- Squid 缓存中没有该资源,或者资源已过期,它会代表客户端向
- Squid 首先检查自己的缓存中是否已经有
- 客户端接收:客户端收到 Squid 返回的内容,就像直接从目标网站获取到的一样,对用户完全透明。
安装与配置 Squid
安装
以 Ubuntu/Debian 和 CentOS/RHEL 为例:
Ubuntu/Debian:
sudo apt update sudo apt install squid -y
CentOS/RHEL:
sudo yum install squid -y # 对于 CentOS 8/RHEL 8 及以后版本 sudo dnf install squid -y
安装完成后,Squid 服务通常会自动启动。
基本配置
Squid 的主配置文件是 /etc/squid/squid.conf (Ubuntu) 或 /etc/squid.conf (CentOS),这是一个非常长的文件,但大部分都是注释和默认示例,我们主要关注以下几个核心部分:
-
监听端口:
# Squid 默认监听所有网络接口的 3128 端口 http_port 3128
-
访问控制列表:这是 Squid 的核心,定义了“谁”和“什么”。
# 定义一个名为 "localnet" 的 ACL,代表本地网络 # 允许 192.168.1.0/24 网段 acl localnet src 192.168.1.0/24 # 定义一个名为 "all" 的 ACL,代表所有 acl all src all # 定义一个名为 "block_websites" 的 ACL,用于阻止特定网站 acl block_websites dstdomain .facebook.com .twitter.com .youtube.com
-
HTTP 访问规则:将 ACL 与具体规则绑定。
# 允许 localnet 网段的客户端使用代理 http_access allow localnet # 默认拒绝所有其他客户端的访问 http_access deny all # 如果你想阻止特定网站 http_access deny block_websites
-
缓存配置:
# 设置缓存目录 cache_dir ufs /var/spool/squid 100 16 256 # 解释: /var/spool/squid 是缓存目录,100 MB 是缓存大小(旧版本单位是MB,新版本是GB),16 和 256 是目录层级数。
-
设置缓存日志、访问日志等路径:
cache_log /var/log/squid/access.log cache_store_log /var/log/squid/store.log
启动、重启与查看状态
# 启动 Squid 服务 sudo systemctl start squid # 设置开机自启 sudo systemctl enable squid # 重启 Squid 服务(修改配置后需要执行) sudo systemctl restart squid # 查看 Squid 状态 sudo systemctl status squid # 查看 Squid 是否在监听 3128 端口 sudo netstat -tuln | grep 3128 # 或者使用 ss sudo ss -tuln | grep 3128
常用配置详解
如何允许特定 IP 使用代理?
假设你只允许 IP 地址为 168.1.100 的电脑使用代理。
- 在
squid.conf中定义 ACL:acl allowed_ip src 192.168.1.100
- 修改
http_access规则:http_access allow allowed_ip http_access deny all
- 重启 Squid 服务。
如何配置用户名密码认证?
-
安装
apache2-utils:sudo apt install apache2-utils # Ubuntu/Debian sudo yum install httpd-tools # CentOS/RHEL
-
创建密码文件:
# -c 表示创建新文件,后面是用户名 sudo htpasswd -c /etc/squid/passwd admin # New password: [输入密码] # Re-type new password: [再次输入]
如果要添加更多用户,去掉
-c:sudo htpasswd /etc/squid/passwd another_user
-
修改
squid.conf:- 在
http_port后面添加auth_param配置:auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd auth_param basic children 5 auth_param basic realm Squid Proxy Authentication auth_param basic credentialsttl 2 hours
- 创建一个 ACL 用于认证用户:
acl auth_users proxy_auth REQUIRED
- 应用访问规则:
http_access allow auth_users http_access deny all
- 在
-
重启 Squid 服务。
任何未认证的请求都会被 Squid 拒绝,浏览器会弹出用户名和密码输入框。
