banner
约 300 字
1 分钟

正向代理与反向代理:一张图讲清区别

摘要

从代理本质讲起,系统对比正向代理(代客户端)与反向代理(代服务器)的角色、场景、配置与误区,并给出组合架构与选型判断。

正向代理与反向代理:一张图讲清区别

引言

“代理”(Proxy)是网络工程里最高频、也最容易引发歧义的词之一。很多人把“正向代理”和“反向代理”混为一谈,结果配置时张冠李戴、排障时无从下手。本文用一张图 + 一张表,把两者的本质区别讲透,并给出典型落地场景与选型判断。

一、代理的本质:一个“中间人”

抛开表象,代理的本质只有一个:在通信两端之间插入一个中转节点。客户端不再直连目标服务器,而是把请求发给代理,由代理代为转发、并把响应带回来。

这个“中间人”能做四件事:

  1. 转发:把请求送往正确的目的地。

  2. 缓存:把热点资源存下来,下次直接命中,省带宽、降延迟。

  3. 过滤/管控:按策略放行或阻断(内容审计、访问控制)。

  4. 隐藏:对一端隐藏另一端的真实身份(匿名出网 or 隐藏后端拓扑)。

判别正向还是反向,关键看这个“中间人”代表谁:代表客户端 = 正向;代表服务器 = 反向。

二、正向代理(Forward Proxy):代“客”出征

正向代理站在客户端一侧,代表客户端去访问外部资源。客户端很清楚自己用了代理,并主动把流量交给它。

典型场景

  • 企业出网管控:内网机器不能直接上公网,统一经正向代理出网,便于审计与防数据泄露。

  • 内容过滤与合规:学校、公司按策略屏蔽不当站点。

  • 缓存加速:Squid 这类缓存代理把常用资源存本地,重复访问不再回源。

  • 匿名/隐私:对外隐藏客户端真实 IP(注意:仅在你信任该代理时)。

  • 突破网络限制:访问被本地链路限制的资源(需合规)。

配置示例(Squid 正向代理)

bash
# /etc/squid/squid.conf 最小配置
http_port 3128
acl localnet src 10.0.0.0/8
http_access allow localnet
http_access deny all
cache_dir ufs /var/spool/squid 1000 16 256   # 缓存目录,上限 1GB

客户端侧只需声明代理地址即可:

bash
export http_proxy=http://proxy.corp.local:3128
export https_proxy=http://proxy.corp.local:3128
curl https://example.com

客户端视角

“我想访问外网,但我自己出不去 / 不想暴露自己,请你帮我转发。”

三、反向代理(Reverse Proxy):代“店”迎客

反向代理站在服务器一侧,代表后端服务器对外服务。客户端以为自己在跟那台服务器直接对话,其实对面是代理,它再把请求分发给后端。

典型场景

  • 负载均衡:把流量分摊到多台后端,提升吞吐与可用性(Nginx、HAProxy)。

  • SSL 终止:在代理层统一做 HTTPS 加解密,后端只用 HTTP,降低后端开销。

  • 缓存与压缩:代理层缓存静态资源、开启 gzip,减轻后端压力。

  • 安全隔离:隐藏后端真实 IP 与拓扑,挡在应用前做第一道防护。

  • 统一入口:多服务共用一个域名/端口,按路径或域名路由。

配置示例(Nginx 反向代理)

nginx
upstream app_pool {
    server 10.0.0.11:3000;
    server 10.0.0.12:3000;
}

server {
    listen 80;
    server_name app.example.com;
    location / {
        proxy_pass http://app_pool;
        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;
    }
}

客户端视角

“我以为在跟 example.com 直接说话,其实对面是代理,它再把活分发给后端。”

四、一张图分清

纯文本
[客户端] --请求--> [正向代理] --出网--> [互联网/目标]
                                   (代表客户端)

[客户端] --请求--> [反向代理] --转发--> [后端服务器A/B/C]
                       (代表服务器)

五、核心区别对比

维度

正向代理

反向代理

代理对象

客户端

服务器(后端)

谁部署

客户端 / 网络管理员

服务端运维

客户端是否知情

知情并主动配置

通常不知情

隐藏了谁

隐藏客户端身份

隐藏后端拓扑与 IP

常见用途

出网、匿名、审计、缓存

负载均衡、SSL、缓存、防护

典型软件

Squid、CCProxy、Privoxy

Nginx、HAProxy、Traefik

六、常见混淆与误区

  1. “透明代理”一定是反向代理? 不一定。透明代理是按“客户端是否知情”划分的,正向、反向都可以是透明的。

  2. “我配了 proxy_pass 就是正向代理”? 配在服务器上、代表后端的,是反向代理。

  3. VPN 等同于代理? VPN 在网络层(L3)打通隧道,代理通常在应用层(L7)。层级和语义都不同。

七、真实架构里的组合

生产环境两者常一起出现:

纯文本
用户 → CDN/反向代理(Nginx) → 应用 → 正向代理(出网调用第三方API)
  • 对外用反向代理做统一入口与防护;

  • 应用需要调用外部 API 时,通过正向代理出网并做审计。

理解了各自的角色,排障时才不会把“出网失败”和“入口不通”搞混。

小结

记住一句话:正向代客(客户端),反向代店(服务端)。再看任何代理配置,先问“这个中间人代表谁”,方向就不会错。下一篇我们动手配一个 Nginx 反向代理,把上面的配置讲细。

延伸阅读

  • Nginx 官方文档《Proxy 模块》

  • Squid Cache 官方手册

  • 下一篇:《手把手配置 Nginx 反向代理》

END