HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 代理技术全栈手册

    • 代理技术全栈手册 - HiHuo
    • 原理篇

      • 第01章 代理是什么:正向 / 反向 / 透明 / 隧道的统一模型
      • 第02章 代理与网络层级:L3 / L4 / L5 / L7 在哪里截断流量
      • 第03章 一个请求穿过代理的一生:连接生命周期全景
    • 协议篇

      • 第04章 HTTP 代理协议:绝对 URI、CONNECT 隧道、转发头与连接池
      • 第05章 HTTPS 与 TLS 代理:终止 / 透传 / MITM / SNI / mTLS
      • 第06章 SOCKS 协议:SOCKS4/4a/5 与 UDP ASSOCIATE 报文级解析
      • 第07章 HTTP/2、gRPC 与 HTTP/3(QUIC) 代理的挑战
      • 第08章 代理自动配置:PAC / WPAD / 系统代理 / NO_PROXY
    • 层级与转发篇

      • 第09章 L4 代理:TCP/UDP 转发与连接级负载均衡
      • 第10章 L7 代理:协议感知与基于内容的路由
      • 第11章 透明代理:iptables REDIRECT/DNAT、TPROXY 与 eBPF 劫持
      • 第12章 数据搬运的艺术:splice / sendfile / 零拷贝 / io_uring
    • 组件横评篇

      • 第13章 Nginx / OpenResty:反向代理、upstream 与 Lua 可编程
      • 第14章 HAProxy:L4/L7、ACL、健康检查与 stick table
      • 第15章 Envoy:xDS 动态配置与 filter chain,为何是云原生数据面
      • 第16章 Traefik / Caddy:自动服务发现与自动 HTTPS
      • 第17章 Squid 与正向/缓存代理:企业出网、缓存与审计
      • 第18章 mitmproxy:抓包、改包、脚本化调试
      • 第19章 内网穿透与隧道:frp / gost / SSH 隧道 / ngrok
      • 第20章 科学上网生态的技术原理(技术中立)
    • 多语言手写篇

      • 第21章 Go:100 行手写 HTTP/CONNECT + SOCKS5 代理
      • 第22章 Rust:基于 tokio 的高性能 TCP 代理
      • 第23章 Python:asyncio 实现,适合调试与脚本
      • 第24章 C:epoll 裸写与零拷贝,及语言选型对比
    • 容器与K8s篇

      • 第25章 Docker 里的代理:HTTP_PROXY、build/pull 与 daemon 配置
      • 第26章 Sidecar 与流量劫持:Istio init-container 的 iptables 原理
      • 第27章 Ingress 与南北流量:Ingress-nginx 与 Gateway API
      • 第28章 Egress 与出网治理:出口网关、registry mirror、审计
      • 第29章 Service Mesh 数据面:Envoy Sidecar 全链路
    • 进阶篇

      • 第30章 可编程代理:Lua / Wasm / eBPF / xDS,代理的"软件定义"
      • 第31章 性能调优:并发模型、连接池、超时与重试、压测
      • 第32章 排错决策树:502 / 504 / 握手失败 / 环路 / 泄漏
      • 第33章 代理安全:开放代理、SSRF、凭证泄漏与攻击面
    • 底层机制篇

      • 第34章 代理的背压与流控:一个代理最难的部分
      • 第35章 socket 与 TCP 状态机:半关闭、超时、连接生命周期
      • 第36章 HTTP/2 帧、流控与 HPACK:h2 代理的内部机制
      • 第37章 负载均衡算法推导与韧性状态机
      • 第38章 Capstone:把玩具代理改造成生产级骨架
    • 综合实战篇

      • 第39章 企业多跳转发链:拓扑、协议矩阵与贯穿性难题
      • 第40章 端到端实战:把 6 类流量全代理通
      • 第41章 更刁钻的流量:gRPC、长轮询、WebRTC、大文件、双向流
      • 第42章 可落地完整参考实现:一套能跑的多协议转发栈
    • 附录

      • 附录 A:代理协议报文速查(HTTP / SOCKS / PAC / PROXY protocol)
      • 附录 B:组件选型决策树
      • 附录 C:抓包与命令速查

第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,配置不同身份就不同。

企业为什么需要它:四大价值

  1. 统一出网:所有流量一个出口,便于管理和 NAT
  2. 缓存省带宽:相同资源(系统更新、常访问页面)缓存一份,命中直接返回——这是"缓存代理"的本义
  3. 上网审计:access.log 记录"谁、何时、访问了什么",满足合规与审计
  4. 访问管控:用 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 Forbiddenhttp_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 流量的调试神器。

Prev
第16章 Traefik / Caddy:自动服务发现与自动 HTTPS
Next
第18章 mitmproxy:抓包、改包、脚本化调试