一、Squid 基础认知
1.1 核心概念与功能定位
Squid 是一款开源的高性能代理服务器与 Web 缓存服务器,基于 Unix 架构设计,支持 HTTP、HTTPS、FTP 等多种协议,核心功能可概括为:
| 功能模块 | 核心作用 |
| 代理转发 | 作为客户端与目标服务器的中间节点,转发网络请求,实现多设备共享网络出口 |
| 缓存加速 | 存储常用网页、图片等静态资源,减少重复请求,降低带宽消耗并提升访问速度 |
| 访问控制 | 基于 IP、域名、时间、用户身份等维度限制网络访问,实现上网行为管理 |
| 流量监控 | 记录详细访问日志,支持分析用户上网行为、热门资源访问量等关键指标 |
| 安全防护 | 隐藏客户端真实 IP,过滤恶意请求,作为网络边界防护的补充层 |
1.2 适用场景与架构图解
1.2.1 典型应用场景
- 企业内网管理:限制员工访问娱乐网站,仅开放工作相关域名,记录上网日志用于审计
- 校园 / 机构网络:通过缓存节省出口带宽,统一管控学生 / 员工网络使用权限
- 小型办公网络:多设备通过单台 Squid 服务器共享公网 IP 上网,简化网络配置
- 安全测试场景:作为中间人代理,捕获并分析客户端与服务器之间的请求响应数据
1.2.2 核心架构图解

1.3 部署环境要求
| 环境类型 | 操作系统推荐 | CPU | 内存 | 磁盘空间 | 网络要求 |
| 测试环境 | Ubuntu 20.04/CentOS 8 | 1 核 | 1GB | 10GB(缓存目录) | 内网互通即可 |
| 生产环境 | Ubuntu 22.04/CentOS 9 | 2 核及以上 | 4GB+ | 50GB+(SSD 优先) | 公网 IP(正向代理)/ 内网互通(反向代理) |
| Windows 环境 | Windows Server 2019 | 2 核 | 2GB | 20GB | 仅推荐测试使用 |
二、Squid 安装与初始化(多系统)
2.1 Linux 系统安装(推荐生产环境)
2.1.1 Ubuntu/Debian 系统
安装流程图解:

执行命令:
# 1. 更新软件源(确保获取最新版本)
sudo apt update -y
# 2. 安装 Squid(自动配置系统服务)
sudo apt install -y squid
# 3. 启动并设置开机自启
sudo systemctl start squid
sudo systemctl enable squid
# 4. 验证服务状态(出现 active (running) 即为成功)
sudo systemctl status squid
# 5. 查看默认配置文件路径
ls -l /etc/squid/squid.conf
2.1.2 CentOS/RHEL 系统
执行命令:
# 1. 安装 Squid(CentOS 官方源已包含)
sudo dnf install -y squid # CentOS 8+ 使用 dnf;CentOS 7 使用 yum
# 2. 启动服务并设置自启
sudo systemctl start squid
sudo systemctl enable squid
# 3. 开放默认端口(3128),避免防火墙拦截
sudo firewall-cmd --add-port=3128/tcp --permanent
sudo firewall-cmd --reload
# 4. 验证端口是否开放
sudo firewall-cmd --list-ports | grep 3128
2.2 Windows 系统安装(仅测试用)
操作步骤:
- 下载安装包:访问 Squid 官方网站,下载 Windows 版本(推荐最新稳定版,如 Squid 5.9)
- 解压部署:将压缩包解压到 C:\squid 目录,确保路径无中文和空格
- 初始化缓存目录:
-
- 以管理员身份打开命令提示符(CMD),进入 C:\squid\bin
-
- 执行命令 squid -z,自动创建缓存目录结构(默认在 C:\squid\var\spool\squid)
4. 启动服务:
-
- 执行 squid 启动服务(前台运行,关闭 CMD 则服务停止)
-
- 若需后台运行,可配置为 Windows 系统服务(需额外工具如 NSSM)
2.3 初始化验证(确保基础功能可用)
1. 查看 Squid 监听端口:
# Linux 系统查看 3128 端口监听状态
sudo netstat -tuln | grep 3128
2. 客户端基础测试:
- 在同一网络的客户端 PC 上,打开浏览器 → 代理设置 → 手动配置代理:
-
- 地址:Squid 服务器 IP(如 192.168.1.100)
-
- 端口:3128
- 访问 Example Domain,若能正常打开,说明基础代理功能生效
三、Squid 核心配置详解
3.1 配置文件结构与关键参数
Squid 主配置文件为 /etc/squid/squid.conf(Linux),由 ACL(访问控制列表) 和 规则应用 两部分组成,核心参数说明如下:
| 配置项 | 功能说明 | 默认值 / 推荐值 |
| http_port 3128 | 监听端口,正向代理默认 3128,反向代理可改为 80/443 | 3128(正向)、80(反向) |
| cache_dir ufs /var/spool/squid 100 16 256 | 缓存目录配置:存储类型(ufs)、路径、总大小(100MB)、一级目录数(16)、二级目录数(256) | 生产环境建议设为 500-2000(单位 MB) |
| access_log /var/log/squid/access.log | 访问日志路径,记录所有代理请求详情(客户端 IP、访问时间、目标地址等) | 默认路径即可,需定期轮转日志 |
| acl localnet src 192.168.1.0/24 | 定义 ACL 名称(localnet)、类型(src 表示源 IP)、值(192.168.1.0/24 网段) | 根据实际内网网段调整 |
| http_access allow localnet | 允许 localnet 对应的 IP 段通过代理访问 | 规则顺序:先拒绝后允许,最后 deny all |
3.2 访问控制配置(企业核心需求)
3.2.1 基于 IP 地址的访问控制
场景:仅允许内网 192.168.1.0/24 网段使用代理,拒绝其他所有 IP。
# 1. 定义允许的 IP 段(localnet)和禁止的 IP(如特定违规设备)
acl localnet src 192.168.1.0/24 # 内网网段
acl blocked_ip src 192.168.1.200/32 # 单个禁止 IP
# 2. 应用访问规则(顺序至关重要:先拒绝,再允许,最后兜底拒绝)
http_access deny blocked_ip
http_access allow localnet
http_access deny all # 拒绝所有未匹配规则的请求
3.2.2 基于域名的访问控制
场景:允许访问工作相关域名(如 .company.com、.google.com),禁止访问娱乐网站(如 .youtube.com、.facebook.com)。
# 1. 定义允许和禁止的域名 ACL
acl work_domains dstdomain .company.com .google.com .github.com # 工作域名(前缀.表示包含子域名)
acl entertainment_domains dstdomain .youtube.com .facebook.com .netflix.com # 娱乐域名
# 2. 定义本地 IP 段(仅允许内网使用)
acl localnet src 192.168.1.0/24
# 3. 应用规则:先禁止娱乐域名,再允许工作域名
http_access deny localnet entertainment_domains
http_access allow localnet work_domains
http_access deny all
3.2.3 基于时间的访问控制
场景:仅允许工作日(周一至周五)9:00-18:00 使用代理,禁止非工作时间访问。
# 1. 定义时间 ACL(MTWHF 表示周一至周五,09:00-18:00 为时间范围)
acl work_hours time MTWHF 09:00-18:00
# 2. 定义本地 IP 段
acl localnet src 192.168.1.0/24
# 3. 应用规则:仅允许工作时间访问
http_access allow localnet work_hours
http_access deny all
3.3 用户认证配置(增强安全性)
场景:仅允许输入正确用户名密码的用户使用代理,防止未授权设备接入。
3.3.1 配置步骤图解

3.3.2 执行命令与配置
1. 安装认证工具:
# Ubuntu/Debian
sudo apt install -y apache2-utils
# CentOS/RHEL
sudo dnf install -y httpd-tools
2. 创建用户认证文件:
# 创建第一个用户(如 user1),-c 表示创建新文件
sudo htpasswd -c /etc/squid/passwd user1
# 输入密码(需记住,客户端认证时使用)
# 添加更多用户(如 user2),去掉 -c 避免覆盖文件
sudo htpasswd /etc/squid/passwd user2
# 查看认证文件(确保权限为 600,仅 root 可读写)
sudo ls -l /etc/squid/passwd
sudo chmod 600 /etc/squid/passwd
3. 修改 Squid 配置:
# 1. 配置认证方式(basic 认证,指定密码文件路径)
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm "Squid Proxy Authentication" # 认证提示信息
auth_param basic credentialsttl 2 hours # 认证有效期(2小时内无需重复输入)
# 2. 定义认证 ACL(authenticated 表示已通过认证的用户)
acl authenticated proxy_auth REQUIRED
# 3. 应用规则:允许认证用户访问
http_access allow authenticated
http_access deny all
4. 重启服务并测试:
sudo systemctl restart squid
-
- 客户端配置代理后访问网页,会弹出认证窗口,输入用户名(如 user1)和密码,验证通过即可正常使用。
3.4 缓存策略优化(提升访问速度)
场景:针对静态资源(图片、CSS、JS)设置较长缓存时间,动态资源(CGI、API)不缓存,优化带宽使用。
# 1. 配置缓存内存与磁盘空间(生产环境建议加大)
cache_mem 512 MB # 内存缓存大小(优先缓存热点资源)
cache_dir ufs /var/spool/squid 2000 16 256 # 磁盘缓存 2000MB
# 2. 设置缓存对象大小限制(超过不缓存)
maximum_object_size 50 MB # 最大缓存对象(如大图片、压缩包)
maximum_object_size_in_memory 8 MB # 内存中最大对象(避免占用过多内存)
# 3. 配置不同资源的缓存时间(refresh_pattern)
# 格式:refresh_pattern <正则表达式> <最小缓存时间> <百分比> <最大缓存时间>
refresh_pattern ^ftp: 1440 20% 10080 # FTP 资源:最小1天,最大7天
refresh_pattern ^gopher: 1440 0% 1440 # Gopher 资源:仅缓存1天
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 # 动态资源(含?或cgi-bin):不缓存
refresh_pattern \.(jpg|jpeg|png|gif|ico)$ 10080 90% 43200 # 图片:最小7天,最大30天
refresh_pattern \.(css|js|html|htm)$ 1440 90% 4320 # 网页资源:最小1天,最大3天
refresh_pattern . 0 20% 4320 # 其他资源:最小0天,最大3天
四、Squid 实战应用场景(企业级)
4.1 企业上网行为管理系统
4.1.1 需求描述
- 仅允许内网 192.168.2.0/24 网段使用代理
- 工作时间(周一至周五 9:00-18:00)禁止访问娱乐网站
- 禁止下载大于 10MB 的文件(避免带宽浪费)
- 详细记录所有访问日志,用于审计
4.1.2 完整配置
# 1. 基础配置(端口、缓存、日志)
http_port 3128
cache_mem 256 MB
cache_dir ufs /var/spool/squid 1000 16 256
access_log /var/log/squid/access.log squid # 使用 squid 格式记录详细日志
# 2. 定义核心 ACL
acl localnet src 192.168.2.0/24 # 企业内网网段
acl work_hours time MTWHF 09:00-18:00 # 工作时间
acl entertainment_domains dstdomain .youtube.com .facebook.com .netflix.com .tiktok.com # 禁止域名
acl large_files url_regex -i \.(iso|zip|rar|exe|mp4)$ # 禁止下载的文件类型
acl file_size req_header Content-Length ^[0-9]{8,}$ # 大于 100MB 的文件([0-9]{8} 表示 8 位数字,即 100MB+)
# 3. 应用访问控制规则(顺序:先禁止高危行为,再允许合法访问)
http_access deny localnet entertainment_domains work_hours # 工作时间禁止娱乐网站
http_access deny localnet large_files # 禁止下载特定类型大文件
http_access deny localnet file_size # 禁止下载超大小文件
http_access allow localnet # 允许内网其他合法访问
http_access deny all # 兜底拒绝所有未匹配请求
4.1.3 日志审计与分析
1. 查看实时访问日志:
sudo tail -f /var/log/squid/access.log
2. 统计访问量最高的前 10 个网站:
# 提取日志中的目标域名,统计访问次数并排序
awk '{print $7}' /var/log/squid/access.log | cut -d '/' -f 3 | sort | uniq -c | sort -nr | head -n 10
3. 查询特定 IP 的访问记录(如排查 192.168.2.101 的上网行为):
grep '192.168.2.101' /var/log/squid/access.log | awk '{print $1, $3, $7}' # 显示时间、客户端IP、访问域名
4.2 反向代理与 Web 缓存加速(高并发场景)
4.2.1 需求描述
- 作为后端 Web 服务器(如 Nginx、Apache)的前端代理,隐藏真实服务器 IP
- 缓存静态资源(图片、CSS、JS),减轻后端服务器压力,提升用户访问速度
- 支持多后端服务器负载均衡,提高服务可用性
4.2.2 架构图解

4.2.3 完整配置
# 1. 配置反向代理端口(使用80端口,模拟Web服务器默认端口)
http_port 80 accel vhost vport # accel:启用反向代理模式;vhost/vport:支持虚拟主机和端口
# 2. 配置后端Web服务器集群(parent:父节点;80:后端服务器端口;0:无ICP查询;originserver:标记为源服务器)
cache_peer 192.168.3.101 parent 80 0 no-query originserver name=web1 round-robin # round-robin:轮询负载均衡
cache_peer 192.168.3.102 parent 80 0 no-query originserver name=web2 round-robin
# 3. 绑定域名与后端服务器(example.com指向web1和web2)
cache_peer_domain web1 example.com www.example.com
cache_peer_domain web2 example.com www.example.com
# 4. 配置缓存策略(重点缓存静态资源)
cache_dir ufs /var/spool/squid 5000 16 256 # 5GB缓存空间(根据业务调整)
cache_mem 2GB # 2GB内存缓存
maximum_object_size 100 MB # 最大缓存对象100MB(支持大图片/视频片段)
# 5. 静态资源缓存优化(延长缓存时间)
refresh_pattern \.(jpg|jpeg|png|gif|ico|svg)$ 43200 90% 604800 # 图片:12小时-7天
refresh_pattern \.(css|js|json)$ 14400 90% 43200 # 样式/脚本:4小时-12小时
refresh_pattern \.(html|htm)$ 3600 80% 14400 # 网页:1小时-4小时
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 # 动态资源不缓存
# 6. 日志配置(记录反向代理详情)
logformat squid_reverse %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %ssl::%sslc %Sh/%<a %mt
access_log /var/log/squid/reverse_access.log squid_reverse
4.2.4 验证与测试
1. 本地测试:在 Squid 服务器上访问后端服务器,确认反向代理生效
curl http://localhost # 应返回后端Web服务器的首页内容
2. 互联网测试:将域名example.com解析到 Squid 服务器公网 IP,用户访问该域名时,请求会自动转发到后端服务器,且静态资源会被缓存。
4.3 透明代理(无需客户端配置)
4.3.1 需求描述
- 客户端无需手动设置代理,Squid 自动拦截内网 HTTP/HTTPS 请求
- 适用于企业内网统一管控,避免员工绕过代理设置
- 搭配 iptables 实现流量转发,简化客户端配置
4.3.2 配置步骤
1. 启用系统 IP 转发(关键前提):
# 临时启用(重启失效)
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久启用(编辑sysctl配置文件)
sudo vi /etc/sysctl.conf
# 添加或修改:net.ipv4.ip_forward = 1
# 生效配置:sudo sysctl -p
2. 配置 Squid 透明代理:
# 1. 配置透明代理端口(transparent:启用透明模式)
http_port 3128 transparent
https_port 3129 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/cert.pem # HTTPS透明代理(需证书)
# 2. 生成HTTPS证书(用于SSL中间人拦截)
sudo openssl req -new -x509 -days 365 -nodes -text -out /etc/squid/cert.pem -keyout /etc/squid/cert.pem -subj "/CN=squid-proxy"
sudo chmod 600 /etc/squid/cert.pem
# 3. 配置访问控制(允许内网192.168.4.0/24网段)
acl localnet src 192.168.4.0/24
http_access allow localnet
http_access deny all
# 4. 日志配置
access_log /var/log/squid/transparent_access.log
3. 配置 iptables 规则(拦截流量转发到 Squid):
# 拦截内网HTTP流量(80端口)转发到Squid 3128端口
sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.4.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
# 拦截内网HTTPS流量(443端口)转发到Squid 3129端口
sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.4.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3129
# 保存iptables规则(CentOS)
sudo service iptables save
# 或(Ubuntu)
sudo iptables-save > /etc/iptables/rules.v4
4.3.3 验证
1. 客户端无需配置代理,直接访问Example Domain
2. 查看 Squid 透明代理日志,确认有客户端访问记录:
tail -f /var/log/squid/transparent_access.log
五、Squid 维护与监控
5.1 日常维护命令
| 操作需求 | 执行命令 |
| 重启 Squid 服务(配置修改后生效) | sudo systemctl restart squid |
| 重新加载配置(不中断服务) | sudo systemctl reload squid |
| 查看服务状态 | sudo systemctl status squid |
| 清除所有缓存 | sudo squid -k purge # 或删除缓存目录文件:sudo rm -rf /var/spool/squid/* |
| 轮转日志(避免日志过大) | sudo squid -k rotate # 配合 logrotate 定期执行 |
| 检查配置文件语法 | sudo squid -k parse # 配置修改后先检查语法,避免重启失败 |
5.2 日志轮转配置(自动管理日志文件)
1. 创建 logrotate 配置文件:
sudo vi /etc/logrotate.d/squid
2. 添加配置内容:
/var/log/squid/*.log {
daily # 每日轮转
rotate 7 # 保留7天日志
compress # 压缩旧日志(gzip)
delaycompress # 延迟压缩(保留最新1天未压缩日志)
missingok # 日志文件不存在时不报错
notifempty # 空日志不轮转
create 640 squid squid # 新建日志文件权限与属主
postrotate # 轮转后重启Squid(确保日志写入新文件)
/usr/bin/systemctl reload squid > /dev/null 2>/dev/null || true
endscript
}
3. 手动测试日志轮转:
sudo logrotate -f /etc/logrotate.d/squid
5.3 性能监控与指标分析
5.3.1 使用squidclient工具监控
squidclient是 Squid 自带的监控工具,可实时查看缓存命中率、连接数等关键指标:
# 1. 查看缓存统计信息(命中率、内存/磁盘缓存使用情况)
sudo squidclient -p 3128 mgr:info
# 2. 查看缓存命中率(核心指标,越高越好,通常目标>80%)
sudo squidclient -p 3128 mgr:cache | grep -i 'hit ratio'
# 3. 查看客户端连接统计
sudo squidclient -p 3128 mgr:clients
# 4. 查看后端服务器健康状态(反向代理场景)
sudo squidclient -p 80 mgr:peers # 80为反向代理端口
5.3.2 可视化监控(Prometheus + Grafana)
1. 安装squid_exporter(收集 Squid 指标):
# 下载squid_exporter(根据系统架构选择版本)
wget https://github.com/boynux/squid-exporter/releases/download/v1.10.0/squid-exporter_1.10.0_linux_amd64.tar.gz
tar -zxvf squid-exporter_1.10.0_linux_amd64.tar.gz
sudo mv squid-exporter /usr/local/bin/
# 启动exporter(指定Squid管理地址)
sudo squid-exporter -squid-hostname localhost -squid-port 3128 -listen-address :9301
2. 配置 Prometheus 抓取指标:
编辑prometheus.yml,添加:
scrape_configs:
- job_name: 'squid'
static_configs:
- targets: ['squid-server-ip:9301'] # squid-exporter地址
scrape_interval: 15s
3. Grafana 导入仪表盘:
- 打开 Grafana,导入仪表盘 ID:3643(Squid 官方仪表盘)
- 即可可视化查看缓存命中率、请求量、响应时间等指标
六、常见问题与解决方案
6.1 客户端无法连接代理
| 问题现象 | 可能原因 | 解决方案 |
| 浏览器提示 “无法连接到代理服务器” | 1. Squid 服务未启动2. 防火墙拦截 3128 端口3. 客户端代理配置错误 | 1. 启动服务:sudo systemctl start squid2. 开放端口:sudo ufw allow 3128(Ubuntu)3. 确认代理地址 / 端口正确 |
| 访问时提示 “403 Forbidden” | 1. 访问控制规则配置错误2. 客户端 IP 不在允许列表3. 认证失败 | 1. 检查squid.conf的http_access规则顺序2. 确认acl localnet包含客户端 IP 段3. 验证认证用户名密码正确 |
| HTTPS 网站无法访问(提示证书错误) | 1. 透明代理未配置 SSL 证书2. 客户端未信任 Squid 证书 | 1. 生成并配置 SSL 证书(参考 4.3.2 节)2. 将/etc/squid/cert.pem导入客户端 “受信任的根证书颁发机构” |
6.2 缓存命中率低(<50%)
| 可能原因 | 解决方案 |
| 缓存空间不足 | 增大cache_dir和cache_mem配置(如cache_dir ufs /var/spool/squid 5000 16 256) |
| 静态资源缓存时间过短 | 优化refresh_pattern,延长图片、CSS 等静态资源的缓存时间(如设置为 7 天) |
| 动态资源占比过高(如 API 请求) | 确保 `refresh_pattern -i (/cgi-bin/ |
| 客户端请求差异大(无重复访问) | 针对热门资源手动设置缓存优先级,或通过cache_peer配置上级代理共享缓存 |
6.3 反向代理后端服务器无法访问
| 问题现象 | 可能原因 | 解决方案 |
| Squid 日志显示 “TCP_MISS/503” | 1. 后端服务器未启动2. 后端服务器 IP / 端口配置错误3. 防火墙拦截 Squid 访问后端 | 1. 确认后端服务器正常运行:curl http://192.168.3.1012. 检查cache_peer的 IP 和端口3. 开放 Squid 到后端服务器的 80 端口 |
| 负载均衡不生效(仅访问一台后端服务器) | 1. 未配置round-robin参数2. 后端服务器标记错误 | 1. 在cache_peer后添加round-robin(如cache_peer 192.168.3.101 parent 80 0 no-query originserver name=web1 round-robin)2. 确认cache_peer_domain正确绑定域名与服务器 |
七、总结
Squid 作为一款成熟的代理服务器软件,凭借其灵活的配置、高效的缓存机制和强大的访问控制能力,广泛应用于企业上网管理、Web 加速、安全防护等场景。本文从基础安装到核心配置,再到企业级实战(上网行为管理、反向代理、透明代理),覆盖了 Squid 全流程使用要点,同时提供了维护监控与问题排查方案,可满足不同规模企业的需求。
在实际部署中,需根据业务场景选择合适的代理模式:
- 正向代理:适合企业内网管控、多设备共享上网
- 反向代理:适合 Web 服务加速、负载均衡
- 透明代理:适合无客户端配置的强制管控场景
同时,需关注缓存命中率、日志审计、服务高可用等核心指标,通过定期维护和监控,确保 Squid 稳定运行,为网络访问提供高效、安全的支撑。

1426

被折叠的 条评论
为什么被折叠?



