计算机网络:什么是正向代理和反向代理?

#计算机网络#操作系统#面试八股

计算机网络:什么是正向代理和反向代理?

结论:正向代理站在客户端一侧,代表客户端访问外网,服务端只看到代理;反向代理站在服务端一侧,代表后端集群接收请求,客户端只看到代理。 判断方向只看一句:替客户端出门的是正向,替服务端挡客的是反向。

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,就都是同一套模型的不同摆放。

笔记加载中…