正向代理与反向代理
正向代理替客户端出门办事,反向代理替服务端出面接客。核心区别在于代理代表谁、隐藏谁。
#type / concept
#status / evergreen
#tech / network
[!info] related notes
- 所属 MOC: computer-networking-moc
- 相关概念: http, https, nginx-proxy-manager-fundamentals
- 工具实践: nginx, nginx-proxy-manager-moc
正向代理与反向代理
一句话定义
正向代理:替客户端访问服务器,隐藏客户端。 反向代理:替服务器接待客户端,隐藏服务器。
代理的本质
A 要直接和 B 通信,中间插入 P:
A ↔ P ↔ B
关键问题只有一个:P 代表的是哪一边?
- 正向代理:P 代表客户端,站在客户端阵营
- 反向代理:P 代表服务端,站在服务端阵营
最简单的判断法
| 判断角度 | 正向代理 | 反向代理 |
|---|---|---|
| 客户端知道代理存在吗 | 知道,主动配置 | 通常不知道,以为在直接访问服务 |
| 代理替谁发请求 | 替客户端 | 替服务端接请求 |
| 部署位置 | 靠近客户端 | 靠近服务端 |
可见性分析(最透彻的理解方式)
正向代理
客户端 → [正向代理] → 目标服务器
- 客户端:知道代理存在,知道自己要访问哪个目标
- 目标服务器:看到的是代理,未必知道原始客户端是谁
- 核心:隐藏客户端,暴露目标服务器
反向代理
客户端 → [反向代理] → 后端服务器
- 客户端:以为自己在访问真正的服务,不知道后面是哪台机器
- 后端服务器:看到请求是代理转发的
- 核心:隐藏服务端,暴露服务入口
正向代理
工作原理
客户端访问 example.com,通过代理 proxy.com:8080:
- 客户端连接正向代理
- 客户端告诉代理:“请帮我访问 example.com”
- 代理去连接 example.com
- example.com 把响应返回给代理
- 代理再把响应转给客户端
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:
- 客户端连接
www.xxx.com(实际是反向代理) - 反向代理根据规则判断转发给哪个后端
- 后端返回结果给代理
- 代理返回给客户端
核心能力
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 |
连接终止点:代理的底层本质
代理不是”透明传包”,而是连接被拆成两段:
客户端 ↔ 代理 ↔ 目标端
这意味着:
- TCP 连接被终止并重建 — 代理是新的连接端点
- 协议语义可被重新处理 — HTTP 头可以加、删、改
- 失败域被分隔 — 两段不同问题
- 性能控制点出现 — 代理层可排队、限流、缓存、复用连接
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/鉴权/限流 |
| 侧重点 | 客户端侧出网控制 | 服务端侧接入治理 |