- Squid 的核心概念与工作原理
- 安装 Squid
- 基础配置文件详解 (
squid.conf) - 配置示例:基础正向代理
- 配置示例:透明代理
- 高级功能简介
- 常用管理与维护命令
- 故障排查
Squid 的核心概念与工作原理
在配置之前,理解 Squid 的工作原理非常重要。

-
正向代理 (Forward Proxy):
- 场景:客户端(如你的浏览器)明确配置了代理服务器地址,所有上网请求都先发送给 Squid,再由 Squid 转发到目标网站。
- 用途:企业内网用户统一上网出口、访问控制、缓存加速、翻墙(不鼓励)等。
- 客户端感知:客户端知道代理的存在。
-
反向代理 (Reverse Proxy):
- 场景:对外暴露的是 Squid 的地址,客户端不知道后端真实服务器的存在,Squid 接收来自互联网的请求,然后转发给内网中的一台或多台 Web 服务器。
- 用途:负载均衡、SSL/TLS 卸载、Web 加速、安全防护。
- 客户端感知:客户端不知道代理的存在,以为 Squid 就是目标服务器。
-
透明代理 (Transparent Proxy):
- 场景:介于正向和反向之间,客户端不知道代理的存在,也不需要在浏览器中配置,网络设备(如路由器、防火墙)通过策略路由(如
iptables)将客户端的 Web 流量“劫持”到 Squid 代理上。 - 用途:企业内网强制代理,实现无感知的上网控制和缓存。
- 客户端感知:客户端不知道代理的存在。
- 场景:介于正向和反向之间,客户端不知道代理的存在,也不需要在浏览器中配置,网络设备(如路由器、防火墙)通过策略路由(如
-
缓存:这是 Squid 的核心功能,当第一个用户请求一个网页时,Squid 会从互联网获取该网页的内容,并将其存储在本地磁盘中,当第二个用户请求同一个网页时,Squid 直接从本地缓存中提供,无需再次访问互联网,从而极大地提高了速度并减少了带宽消耗。
(图片来源网络,侵删)
安装 Squid
Squid 在几乎所有主流的 Linux 发行版软件源中都有提供。
在 Debian/Ubuntu 上安装
# 更新软件包列表 sudo apt update # 安装 squid sudo apt install squid -y # 安装完成后,Squid 服务会自动启动
在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安装
# 更新软件包列表 sudo yum update -y # 安装 squid sudo yum install squid -y # 启动并设置开机自启 sudo systemctl start squid sudo systemctl enable squid
基础配置文件详解 (squid.conf)
Squid 的所有配置都位于 /etc/squid/ 目录下,主配置文件是 squid.conf,这个文件非常庞大,包含大量注释和默认配置,我们通常需要修改其中的关键部分。
# 打开配置文件 (Debian/Ubuntu) sudo nano /etc/squid/squid.conf # 打开配置文件 (CentOS/RHEL) sudo nano /etc/squid/squid.conf
以下是几个最核心的配置项:
| 配置项 | 说明 | 示例 |
|---|---|---|
http_port |
定义 Squid 监听的端口和模式。 | http_port 3128:标准监听模式,客户端需配置此端口。 http_port 3128 transparent:透明代理模式,需要配合 iptables。 |
visible_hostname |
定义 Squid 的主机名,用于在错误页面或 Cache-Control 头中显示。 |
visible_proxy.mycompany.com |
cache_dir |
定义缓存目录、大小和层级。 | cache_dir ufs /var/spool/squid 100 16 256:在 /var/spool/squid 创建一个 100MB 的 UFS 类型缓存。 |
access_log |
定义访问日志的路径和格式。 | access_log /var/log/squid/access.log squid |
cache_log |
定义缓存日志的路径。 | cache_log /var/log/squid/cache.log |
acl (Access Control List) |
定义访问控制列表,用于创建规则,如 IP 地址、域名、时间等。 | acl localnet src 192.168.1.0/24:定义一个名为 localnet 的规则,匹配 192.168.1.0/24 网段。 acl SSL_ports port 443:定义名为 SSL_ports 的规则,匹配 443 端口。 |
http_access |
基于 acl 规则允许或拒绝访问。注意:规则的顺序很重要,Squid 会从上到下匹配第一条规则。 |
http_access allow localnet:允许 localnet 网段访问。 http_access deny all:拒绝所有其他访问。这条规则通常放在最后,作为默认拒绝策略。 |
配置示例:基础正向代理
这是一个最常见的场景,让内网用户通过 Squid 上网。

目标:允许 168.1.0/24 网段的所有用户通过 Squid(监听在 3128 端口)上网,并启用缓存。
步骤:
-
备份原配置文件
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
-
编辑
squid.conf在文件末尾添加或修改以下内容:# ---------------------------------------------------- # 基础正向代理配置示例 # ---------------------------------------------------- # 1. 设置监听端口 http_port 3128 # 2. 设置主机名 visible_hostname linux-proxy-server # 3. 定义缓存 (如果需要) # 如果没有特殊需求,可以注释掉或删除 cache_dir 行,Squid 将不使用缓存 # cache_dir ufs /var/spool/squid 100 16 256 # 4. 定义访问控制列表 # 允许内网 192.168.1.0/24 网段 acl localnet src 192.168.1.0/24 # 5. 设置访问权限 # 先允许 localnet 访问 http_access allow localnet # 默认拒绝所有其他访问 http_access deny all # 6. 允许来自本机的查询 http_access allow localhost # 7. 禁止代理某些网站 (可选) # acl bad_sites dstdomain .badsite.com .anotherbadsite.net # http_access deny bad_sites # ----------------------------------------------------
-
检查配置文件语法 在重启服务前,务必检查配置是否正确。
# Debian/Ubuntu sudo squid -k parse # CentOS/RHEL # squid -k check (新版本) 或 squid -k parse (旧版本) # 如果输出没有任何信息,表示语法正确
-
重启 Squid 服务
# 优雅重启,会处理完现有连接再应用新配置 sudo systemctl reload squid # 或者完全重启 sudo systemctl restart squid
-
客户端配置 在用户的浏览器或操作系统的网络设置中,将代理服务器地址设置为 Squid 服务器的 IP 地址,端口设置为
3128。
配置示例:透明代理
透明代理让客户端无需任何配置即可使用代理,体验更好。
前提条件:Squid 服务器需要作为内网网关,iptables 或 firewalld 已启用。
目标:强制所有来自 168.1.0/24 网段的 HTTP/HTTPS 流量通过 Squid(3128端口)进行代理。
步骤:
-
配置 Squid 修改
http_port指令,添加transparent选项。# 在 squid.conf 中 http_port 3128 transparent
-
配置 IPTables (以 iptables 为例) 在 Squid 服务器上执行以下命令,将流量重定向到 Squid。
# 清空现有规则 (可选,谨慎操作) iptables -F iptables -t nat -F # 允许 Squid 代理服务器的回环流量 iptables -A INPUT -i lo -j ACCEPT # 允许 Squid 监听 3128 端口的入站连接 iptables -A INPUT -p tcp --dport 3128 -j ACCEPT # 关键步骤:将来自内网的 HTTP (80) 流量重定向到 Squid 的 3128 端口 iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128 # 关键步骤:将来自内网的 HTTPS (443) 流量重定向到 Squid 的 3128 端口 # 注意:HTTPS 流量会被 Squid 进行 SSL 拦截,需要配置 ssl_crtd 和 ssl_bump iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3128 # 保存 iptables 规则 # Debian/Ubuntu sudo iptables-save > /etc/iptables/rules.v4 # CentOS/RHEL sudo service iptables save
-
重启 Squid 服务
sudo systemctl reload squid
-
客户端设置 客户端只需将默认网关设置为 Squid 服务器的 IP 地址即可,无需配置任何代理。
高级功能简介
- SSL Bumping / 拦截:要代理 HTTPS 流量,Squid 需要解密和重新加密流量,这被称为 SSL Bumping,配置起来比较复杂,需要 Squid 能生成有效的中间证书,并让客户端信任它。
- 认证:可以与 LDAP, NCSA, Samba 等集成,要求用户输入用户名和密码才能使用代理。
- 日志分析:可以使用
Sarg(Squid Analysis Report Generator) 等工具生成详细的上网报告,分析访问的网站、流量排名等。 - 内容过滤:通过
acl和http_access可以禁止访问特定网站或关键词。
常用管理与维护命令
# 查看服务状态 sudo systemctl status squid # 启动/停止/重启服务 sudo systemctl start squid sudo systemctl stop squid sudo systemctl restart squid # 优雅地重新加载配置 (推荐) sudo systemctl reload squid # 查看实时访问日志 sudo tail -f /var/log/squid/access.log # 查看缓存日志 sudo tail -f /var/log/squid/cache.log # 手行清理缓存 (谨慎使用) # squid -z
故障排查
-
客户端无法连接
- 检查 Squid 服务状态:
sudo systemctl status squid,确保服务正在运行。 - 检查防火墙:确保 Squid 的监听端口(如
3128)没有被防火墙阻止,可以使用sudo ufw status(Ubuntu) 或sudo firewall-cmd --list-ports(CentOS) 检查。 - 检查语法错误:
sudo squid -k parse。 - 检查
access_log:查看是否有来自客户端 IP 的连接记录,以及被http_access拒绝的记录。
- 检查 Squid 服务状态:
-
配置文件修改后不生效
- 确保使用了
systemctl reload squid而不是systemctl restart。 - 检查
http_access规则的顺序,错误的顺序可能导致规则被跳过。
- 确保使用了
-
透明代理不工作
- 这通常是
iptables规则的问题,检查PREROUTING链的规则是否正确应用,-i(入站网卡) 和-s(源网段) 是否匹配你的网络环境。 - 确保客户端的网关和 DNS 都正确指向了 Squid 服务器。
- 这通常是
希望这份详细的指南能帮助你成功地在 Linux 上部署和管理 Squid 代理服务器!
