正向代理与反向代理

正向代理替客户端出门办事,反向代理替服务端出面接客。核心区别在于代理代表谁、隐藏谁。

#type / concept #status / evergreen #tech / network

[!info] related notes

正向代理与反向代理

一句话定义

正向代理:替客户端访问服务器,隐藏客户端。 反向代理:替服务器接待客户端,隐藏服务器。

代理的本质

A 要直接和 B 通信,中间插入 P:

A ↔ P ↔ B

关键问题只有一个:P 代表的是哪一边?

  • 正向代理:P 代表客户端,站在客户端阵营
  • 反向代理:P 代表服务端,站在服务端阵营

最简单的判断法

判断角度正向代理反向代理
客户端知道代理存在吗知道,主动配置通常不知道,以为在直接访问服务
代理替谁发请求替客户端替服务端接请求
部署位置靠近客户端靠近服务端

可见性分析(最透彻的理解方式)

正向代理

客户端 → [正向代理] → 目标服务器
  • 客户端:知道代理存在,知道自己要访问哪个目标
  • 目标服务器:看到的是代理,未必知道原始客户端是谁
  • 核心隐藏客户端,暴露目标服务器

反向代理

客户端 → [反向代理] → 后端服务器
  • 客户端:以为自己在访问真正的服务,不知道后面是哪台机器
  • 后端服务器:看到请求是代理转发的
  • 核心隐藏服务端,暴露服务入口

正向代理

工作原理

客户端访问 example.com,通过代理 proxy.com:8080

  1. 客户端连接正向代理
  2. 客户端告诉代理:“请帮我访问 example.com”
  3. 代理去连接 example.com
  4. example.com 把响应返回给代理
  5. 代理再把响应转给客户端

HTTP 视角

普通请求:

GET /index.html HTTP/1.1
Host: example.com

通过正向代理时,客户端发完整目标 URL:

GET http://example.com/index.html HTTP/1.1
Host: example.com

HTTPS 下的 CONNECT 隧道

HTTPS 是加密的,代理看不到内容。常见做法是 CONNECT

CONNECT example.com:443 HTTP/1.1
Host: example.com:443

代理帮客户端和目标建立 TCP 隧道,之后代理只转发字节流,看不到 HTTPS 明文(除非做中间人解密)。

解决的问题

问题说明
借路出网网络环境不能直接访问外部,通过代理统一出网
隐藏身份目标服务器看到的是代理地址
访问控制企业内网限制员工访问哪些网站
审计记录所有出网流量经过代理,便于日志合规
缓存加速代理缓存外部资源,减少重复访问

典型场景

  • 企业出网代理
  • 开发调试代理(抓包)
  • 匿名访问
  • 局域网共享上网

反向代理

工作原理

浏览器访问 www.xxx.com,DNS 解析到反向代理 IP:

  1. 客户端连接 www.xxx.com(实际是反向代理)
  2. 反向代理根据规则判断转发给哪个后端
  3. 后端返回结果给代理
  4. 代理返回给客户端

核心能力

1. 负载均衡

一个域名后面多台机器,代理按策略分发:

  • 轮询 / 加权轮询 / 最少连接 / 一致性哈希

2. 隐藏后端拓扑

客户端只知道入口域名,不知道后面有多少台机器、IP 是什么。后端可随时扩容缩容,客户端无感知。

3. TLS/SSL 终止

客户端和代理建立 HTTPS,代理再决定:

  • 往后端继续 HTTPS
  • 或内网用 HTTP 明文转发

证书统一管理,减轻后端加解密负担。

4. 路由转发

按维度分发请求:

维度示例
域名a.com → 集群 A,b.com → 集群 B
路径/api → 应用服务,/static → 静态资源
请求头不同 header 进不同后端
Cookie会话保持
版本蓝绿发布、灰度发布

5. 缓存加速

热点资源缓存在代理层(静态资源、页面、API),减轻后端压力。

6. 安全防护

服务端第一道门:WAF、限流、黑白名单、防 CC、请求过滤。

7. 统一鉴权与网关

登录鉴权、Token 校验、单点登录、API 网关、流量统计。

典型部署

  • 单机网站前面挂 Nginx(接 HTTPS、转发后端、处理静态文件)
  • 多台应用服务器前面挂负载均衡器(一个入口,多机集群)
  • 云上的接入层(云 LB、网关、Ingress,本质都是反向代理体系)

核心对比

维度正向代理反向代理
代理对象客户端服务端
部署位置靠近客户端靠近服务端
谁知道代理客户端知道客户端通常不知道
隐藏谁隐藏客户端隐藏服务端
典型目的出网、匿名、审计、访问控制负载均衡、网关、安全、缓存
常见产品Squid、企业代理、抓包代理Nginx、HAProxy、Envoy、云 LB

连接终止点:代理的底层本质

代理不是”透明传包”,而是连接被拆成两段

客户端 ↔ 代理 ↔ 目标端

这意味着:

  1. TCP 连接被终止并重建 — 代理是新的连接端点
  2. 协议语义可被重新处理 — HTTP 头可以加、删、改
  3. 失败域被分隔 — 两段不同问题
  4. 性能控制点出现 — 代理层可排队、限流、缓存、复用连接

L4 代理 vs L7 代理

层级理解协议能做的事
L4(传输层)不理解 HTTP,只转发 TCP/UDP按端口/IP 转发,连接级负载均衡,性能高
L7(应用层)理解 URL、Host、Header、Cookie按内容路由、缓存、鉴权、限流、重写,治理能力强

真实 IP 为什么会丢

经过反向代理后,后端看到的 TCP 对端是代理而非客户端。代理需通过头部传递原始信息:

X-Forwarded-For: client_ip, proxy1, proxy2
X-Forwarded-Proto: https
X-Forwarded-Host: example.com

代理会改变网络”表象”,必须借助额外元数据恢复原始语义。

常见误区

误区纠正
正向/反向只是部署位置不同真正区别是代表谁
中转服务器就是反向代理关键看代客户端还是代服务端
负载均衡等于反向代理负载均衡是一种能力,反向代理常常具备,但不完全同义
代理只是转发数据代理会终止/重建连接、改写头部、做鉴权缓存路由,是控制点

生活类比

  • 正向代理 = 代购:你知道代购存在,代购替你买,商家看到的是代购
  • 反向代理 = 酒店前台:你只知道酒店入口,前台把需求分发给后面不同部门

什么时候用

问题用正向代理用反向代理
目的统一管理出网、隐藏客户端来源、审计统一入口、负载均衡、隐藏后端、TLS/鉴权/限流
侧重点客户端侧出网控制服务端侧接入治理
创建于 2026/4/1 更新于 2026/5/27