第17章 Squid 与正向/缓存代理:企业出网、缓存与审计
学习目标
- 掌握 Squid 的三种部署形态:标准正向、透明拦截、反向加速
- 理解企业为什么用正向代理:统一出网、缓存省带宽、上网审计与管控
- 用 ACL 做访问控制、用认证集成身份、用
access.log做合规审计 - 理解 Squid 的 HTTPS 处理:CONNECT 隧道 vs SSL Bump(MITM)
前置知识
- 第01章 正向代理、第04章 HTTP 代理协议(CONNECT、407)
- 第11章 透明代理(intercept 模式)、第05章 MITM(SSL Bump)
原理
定位:正向代理的经典主力
前面 13-16 章都是反向代理(站在服务端)。Squid 是正向代理(站在客户端,第01章)的代表,也是历史最悠久的缓存代理。它的主战场是企业出网网关:全公司的上网流量都经过它。
三种部署形态
① 标准正向代理:客户端显式配 http_proxy=squid:3128
员工浏览器 ──配置代理──▶ Squid ──▶ 互联网
② 透明拦截代理:客户端无配置,网关用 iptables 把出站流量劫持给 Squid
员工浏览器 ──(无感)──▶ [iptables REDIRECT] ──▶ Squid intercept ──▶ 互联网
③ 反向加速器:放在网站前做缓存加速(少用,反代有更好选择)
形态 ① 和 ② 对应 第01章 的"正向 vs 透明"——同一个 Squid,配置不同身份就不同。
企业为什么需要它:四大价值
- 统一出网:所有流量一个出口,便于管理和 NAT
- 缓存省带宽:相同资源(系统更新、常访问页面)缓存一份,命中直接返回——这是"缓存代理"的本义
- 上网审计:
access.log记录"谁、何时、访问了什么",满足合规与审计 - 访问管控:用 ACL 控制"谁能访问什么"(按用户/部门/时段/域名/分类拦截)
ACL:访问控制的核心
Squid 的访问控制由 ACL + http_access 规则组成,自上而下匹配,第一条命中即生效:
acl localnet src 10.0.0.0/8 # 定义"内网客户端"
acl work_hours time MTWHF 09:00-18:00 # 定义"工作时段"
acl blocked_sites dstdomain .facebook.com .youtube.com
acl Safe_ports port 80 443 # 允许 CONNECT 的端口(见下)
http_access deny blocked_sites # 拦截特定网站
http_access allow localnet work_hours # 工作时段允许内网出网
http_access deny all # 兜底拒绝
CONNECT 与 Safe_ports:呼应第04章
第04章 讲过 CONNECT 隧道要限制端口防滥用。Squid 用 Safe_ports/SSL_ports ACL 实现:
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports # 只允许 CONNECT 到 443,否则拒绝
这就是"CONNECT 到非常规端口被 403"的来源——防止 Squid 沦为任意 TCP 跳板(开放代理风险,第33章)。
认证:集成企业身份
Squid 支持 Basic/Digest/NTLM/Kerberos,可对接 AD/LDAP,实现"按员工身份管控+审计":
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
acl authenticated proxy_auth REQUIRED
http_access allow authenticated # 必须登录才能出网(返回 407,第04章)
HTTPS:CONNECT 隧道 vs SSL Bump
- 默认(CONNECT 隧道):Squid 对 HTTPS 只开隧道、不解密(第04章),只能记录"访问了哪个域名:443",看不到 URL/内容
- SSL Bump(MITM):要审计 HTTPS 内容(URL、DLP),Squid 可做 第05章 的 MITM——动态签证书解密。前提同样是客户端信任 Squid 的 CA,且受 HSTS/证书锁定限制
缓存层级:父子代理
多级 Squid 可组成缓存层级,用 cache_peer + ICP/HTCP 协议在代理间协作查缓存:
cache_peer parent-proxy.corp parent 3128 3130 # 上级代理(3130 是 ICP 端口)
️ 实现 / 命令
实验一:最小正向代理 + ACL + 缓存
# /etc/squid/squid.conf
http_port 3128
acl localnet src 10.0.0.0/8
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports # CONNECT 仅限 443
http_access allow localnet
http_access deny all
# 缓存:1GB 磁盘缓存
cache_dir ufs /var/spool/squid 1024 16 256
sudo squid -z && sudo systemctl restart squid
# 走它访问,看缓存命中头(第二次应为 HIT)
curl -x http://127.0.0.1:3128 -sI http://example.com/ | grep -i x-cache
# X-Cache: MISS from squid (第一次)
curl -x http://127.0.0.1:3128 -sI http://example.com/ | grep -i x-cache
# X-Cache: HIT from squid (第二次命中缓存,省了回源)
实验二:透明拦截模式(呼应第11章)
# intercept 模式:配合 iptables REDIRECT,客户端无需配代理
http_port 3128 intercept
# 网关上把出站 80 劫持给 Squid(详见第11章)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
# 此后内网客户端"无感"地经过 Squid,access.log 照样记录
实验三:审计日志
# access.log 记录每次出网:时间、客户端IP、方法、URL、状态、字节、命中
tail -f /var/log/squid/access.log
# 1718000000.123 234 10.0.0.7 TCP_MISS/200 1532 GET http://example.com/ - HIER_DIRECT/93.184.216.34 text/html
# 客户端 缓存/状态码 方法 URL 回源目标
这条日志就是企业上网审计的原始素材。
排错
| 现象 | 根因 | 解决 |
|---|---|---|
| 客户端 403 Forbidden | http_access 规则拒绝 | 检查 ACL 顺序(自上而下,首条命中) |
| CONNECT 到非 443 被拒 | Safe_ports/SSL_ports 限制 | 按需放开端口(注意开放代理风险) |
| 缓存总是 MISS | 响应头 Cache-Control: no-cache/动态内容 | 缓存策略本就不缓存动态;查 refresh_pattern |
| 透明模式不生效 | intercept 没配 / iptables 没劫持 | 核对 http_port intercept + REDIRECT 规则 |
| SSL Bump 证书错误 | 客户端没信任 Squid CA | 装 CA(第05章),受 HSTS 限制 |
| 认证不弹窗 | 没配 auth_param/ACL | 检查 407 是否返回(第04章) |
本章小结
- Squid 是正向/缓存代理的经典主力,三形态:标准正向、透明拦截、反向加速。
- 企业价值四件套:统一出网、缓存省带宽、上网审计、访问管控,靠 ACL + 认证 + access.log 实现。
- CONNECT 受
Safe_ports/SSL_ports限制(防开放代理);HTTPS 默认隧道不解密,要看内容需 SSL Bump(MITM)。 - 是企业出网网关的代表;现代云原生出网治理见 第28章 Egress。
下一章 第18章 mitmproxy,把 MITM 从"企业审计"切换到"开发调试"视角——一个能看、能改、能脚本化 HTTPS 流量的调试神器。