计算机网络:什么是正向代理和反向代理?
结论:正向代理站在客户端一侧,代表客户端访问外网,服务端只看到代理;反向代理站在服务端一侧,代表后端集群接收请求,客户端只看到代理。 判断方向只看一句:替客户端出门的是正向,替服务端挡客的是反向。
1. 对比
| 维度 | 正向代理 | 反向代理 |
|---|---|---|
| 代理谁 | 客户端 | 服务端 |
| 部署位置 | 客户端侧(本机、公司出口) | 服务端侧(机房入口、云负载均衡) |
| 隐藏谁 | 隐藏客户端 | 隐藏后端服务器 |
| 谁配置 | 用户自己配 | 服务提供方配,用户无感 |
| 典型用途 | 科学上网、内网统一出口、审计 | 负载均衡、TLS 终止、缓存、灰度 |
| 常见软件 | Squid、Clash、企业出口网关 | nginx、HAProxy、Envoy、云 SLB |
| 能否看到 HTTPS 内容 | 默认不能,只能 CONNECT 隧道 | 能,因为通常在此终止 TLS |
2. 两条链路
正向代理:
客户端 --请求--> 正向代理 --转发(源 IP 变成代理的)--> 目标服务器
↑ 目标服务器只知道代理的地址
反向代理:
客户端 --请求--> 反向代理(对外唯一入口) --按规则分发--> 后端 1 / 后端 2 / 后端 3
↑ 客户端只知道代理的地址
一个记忆方法:正向代理是"我找人替我去拿",反向代理是"我找前台替我接待"。
3. 配置示例
nginx 做反向代理,重点是转发链信息别丢:
# map 与 upstream 放在 http 块,location 放在 server 块
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream backend_pool {
server 10.0.0.11:8080 max_fails=3 fail_timeout=10s;
server 10.0.0.12:8080 max_fails=3 fail_timeout=10s;
keepalive 32;
}
location /api/ {
proxy_pass http://backend_pool;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade; # WebSocket 握手
proxy_set_header Connection $connection_upgrade;
proxy_connect_timeout 3s;
proxy_read_timeout 30s;
}
正向代理则是客户端侧的一行配置:
# 让 curl 走本地 7890 端口的 HTTP 代理
curl -x http://127.0.0.1:7890 -I https://example.com
# 对 HTTPS,代理收到的是 CONNECT 隧道,看不到明文
curl -x http://127.0.0.1:7890 -v https://example.com 2>&1 | grep -i connect
后端要拿真实客户端 IP,还需要让 nginx 信任上游传来的 X-Forwarded-For:
set_real_ip_from 10.0.0.0/8; # 只信任自己的代理网段,别写成 0.0.0.0/0
real_ip_header X-Forwarded-For;
real_ip_recursive on;
4. 常见追问
Q:X-Forwarded-For 会被伪造吗?
会。它是普通请求头,客户端可以自己塞。
正确做法是只在可信边界(自己的 LB)上用 $proxy_add_x_forwarded_for 追加,后端取"从右往左第一个不可信地址",
而不是无条件取第一个。
Q:为什么 WebSocket 经过反向代理会断?
WebSocket 靠 Upgrade: websocket 与 Connection: Upgrade 完成协议切换,代理默认按普通 HTTP 处理会直接返回 200。
需要显式转发这两个头(如上),并适当调大 proxy_read_timeout。
Q:透明代理是什么? 客户端完全不用配置,流量被网关用 iptables 的 REDIRECT / TPROXY 劫持到代理进程。 常见于公司上网审计与容器网络,属于正向代理的部署变体。
Q:反向代理和负载均衡、API 网关是什么关系? 反向代理是机制,负载均衡是它的一种用法;API 网关则是在反向代理之上再加鉴权、限流、协议转换。 nginx 三者都能做,只是配置复杂度不同。
Q:正向代理能看 HTTPS 内容吗? 不能,除非做中间人(在客户端装根证书)。普通正向代理只能看到 CONNECT 的目标域名和端口。 这也是企业审计常配"受信任根证书"的原因。
Q:CDN 算哪种代理? 反向代理。它替源站接客,只是把"后端服务器"换成了分布在各处的边缘节点。
小结
正向代理与反向代理的技术手段几乎一样,区别只在"站在哪一侧、替谁隐藏"。 落地时记住三件事:转发链头别丢(Host / XFF / Proto)、HTTPS 终止点决定谁能看明文、可信边界决定你敢信哪个头。 理解这一点,再看网关、负载均衡、CDN,就都是同一套模型的不同摆放。