"正向代理还是反向代理"常被当作两种技术之间的选择来讨论。其实并非如此。两者本质上是同一样东西:一个代替他人发出请求并将响应传回的中继。它们运行在相同的软件上,同一个 nginx、同一个 HAProxy 或同一个 Envoy 既可以是正向代理,也可以是反向代理。区别不在于机器,而在于中继代表连接的哪一端,因此隐藏的是谁的身份。
正向代理代表客户端。它位于发出请求的一方,面向开放的互联网,隐藏的是请求者的身份。反向代理代表服务器。它位于源站前面,面向公众,隐藏的是应答者的身份。同一个中继,位于相反的两端。
掌握这一个区别,常见对比表中的每一行都自然推导出来:谁来配置它、对方看到的是谁的 IP、它位于何处、它适合什么场景。本文其余部分分别讲解这两种角色,然后介绍同一台机器同时扮演两种角色的情形。
正向代理 vs 反向代理:简短版本
| 正向代理 | 反向代理 | |
|---|---|---|
| 代表 | 发出请求的客户端 | 应答请求的源站 |
| 隐藏 | 请求者的身份 | 应答者的身份 |
| 最适合 | 匿名访问、地区解锁、抓取 | 负载均衡、缓存、TLS、源站保护 |
这三行就是全部区别。其他所有差异(谁部署它、它位于何处)都从中继代表哪一端这个问题中推导出来。
唯一的变量:代理代表哪一方
代理是一层间接。它转发请求,使对方看到的是代理而不是其背后的一方。每个中继有两端,客户端这端和服务器那端,它向外界代表哪一端就决定了它的角色。
正向代理由客户端一侧部署。你的流量通过它出去,因此互联网看到的是代理的地址而不是你的地址。它隐藏客户端。反向代理由服务器一侧部署。公共流量首先到达它,因此访客看到的是一个公开地址而不是你真实的后端。它隐藏服务器。
软件本身不区分它在做哪一件事。同一个 nginx,当你将其指向自己的后端并发布其地址时,它就从代理出站流量变成了反向代理。方向是一个部署决策,而不是产品类别。
正向代理:客户端的替身
正向代理代表其背后的人工作。你在自己的设备或网络上配置它,将客户端指向它,此后你的请求都通过代理发出。目的地完全不知道请求原本是谁发的,它只能看到代理。大多数人说"代理"时指的就是这种代理,也正是代理服务或抓取服务提供给你的东西。
正向代理如何路由请求
- 你的客户端将请求发送给正向代理,而不是直接发送到目的地。
- 代理将你的 IP 替换为它自己的 IP,然后将请求转发给目标。
- 目标从代理地址收到请求并予以响应。
- 代理将响应传回给你。
它适合什么场景
- 匿名性。目标看到的是代理的 IP,而不是你的,这正是通过代理路由的全部意义。
- 地区访问。通过另一个国家的 IP 出口,访问仅向当地访客开放的内容。
- 出口控制。组织可以过滤、记录或阻止自己的用户在出站途中所访问的内容。
- 大规模网络抓取。将请求分散到轮换池中,这样没有单个 IP 被猛打或被标记。
最后这个用例是本文大多数读者所在的领域,也是代理背后的 IP 开始变得重要的地方。正向代理可以通过数据中心地址或住宅地址出口,这个选择决定了受保护目标是否信任请求。我们在数据中心代理 vs 住宅代理中介绍了这种权衡,以及代理所使用的协议(HTTP 或 SOCKS)在什么是 SOCKS5 代理中有介绍。当代理作为可编程端点而非主机和端口暴露时,它就成了API 代理。
反向代理:服务器的前门
反向代理代表其背后的服务器工作。网站所有者部署它,将其地址发布为公开端点,并保持真实后端的私密性。访客连接到反向代理,以为它就是服务器;反向代理决定哪个后端实际处理每个请求,并像是自己产生了结果一样返回答案。反向代理在大规模场景下几乎无处不在:大多数高流量网站都位于反向代理后面,无论是使用 nginx、HAProxy 或 Envoy 自托管,还是通过 Cloudflare 或 Fastly 等 CDN 提供。
反向代理如何路由请求
- 访客向反向代理的公开地址发送请求。
- 代理选择一个健康的后端,通常通过在多个后端之间进行负载均衡。
- 所选后端处理请求,访客看不到它。
- 代理返回响应,因此访客始终只与前门交互。
它适合什么场景
- 负载均衡。将传入流量分散到多个后端,并绕过任何失败的后端,使网站在负载下保持运行。
- 缓存。无需访问后端即可提供热门内容的存储副本,降低延迟和源站负载。
- TLS 终止。在边缘统一处理 SSL/TLS,而不是在每个后端上处理。
- 源站保护。隐藏真实服务器,并在流量到达之前统一执行速率限制、WAF 和访问规则。
负载均衡器、缓存、TLS 终止器、API 网关、WAF、CDN 边缘:这些不是与反向代理竞争的独立事物。它们是反向代理一旦拥有服务器前门后所承担的职责。角色是位置,功能是你在那里启用的东西。
正向代理 vs 反向代理一览
| 维度 | 正向代理 | 反向代理 |
|---|---|---|
| 代表 | 发出请求的客户端 | 应答请求的源站 |
| 部署方 | 客户端一侧(你或你的组织) | 服务器一侧(网站所有者) |
| 隐藏 | 请求者的身份 | 应答者的身份 |
| 对方看到 | 目标看到代理,而不是你 | 访客看到代理,而不是后端 |
| 位于 | 客户端网络边缘,面向外部 | 源站前面,面向内部 |
| 典型职责 | 匿名性、地区访问、出口过滤、抓取 | 负载均衡、缓存、TLS、源站保护 |
| 受益方 | 发出请求的用户 | 应答请求的服务 |
同一台机器同时扮演两种角色的情形
正向和反向标签描述的是一个连接上的角色,而不是硬件上永久的类型印记。同一软件,有时甚至是同一个运行中的进程,可以对一个连接是正向代理,对另一个连接是反向代理。
CDN 边缘是最清晰的例子。对你的访客来说,它是反向代理,代表你的源站并提供缓存内容。对你的源站来说,当它获取新副本时,同一个边缘看起来像是通过一个正向跳转到来的客户端。过滤员工出站流量的企业网关是正向代理;你的微服务前面的 API 网关是反向代理;服务网格 sidecar 两者兼是,反转对其服务的入站调用,同时转发该服务的出站调用。机器没有任何变化,连接的方向变了。
这也是抓取技术栈的适用场景。当你收集公开数据时,你需要一个代表你面向目标的正向代理,它能吸收那些导致请求被封禁的部分:轮换出口 IP、重试,以及处理反机器人措施。自己维护这些意味着管理 IP 池和路由逻辑;托管的正向代理将其压缩为一个端点。
专为数据采集构建的正向代理。将你的客户端指向一个端点,它就在 1.4 亿以上的 IP 池中轮换,在封禁时重试,并为你处理反机器人措施,使目标看到的是可信请求而不是你的爬虫。
如何判断你需要哪种代理
只需问一个问题:你保护的是提问的一方,还是应答的一方?
如果你在提供网站或 API,你需要在源站前面放一个反向代理,无论是你自己运行的 nginx 或 Caddy,还是为你管理的 CDN。它给你提供负载均衡、缓存、TLS,以及在流量到达你的代码之前统一执行安全策略的地方。
# Reverse proxy: one public address, # real backends kept private behind it. server { listen 443 ssl; server_name example.com; location / { proxy_pass http://10.0.0.5:8080; } }
如果你在访问网络,出于匿名目的、获取地区特定数据或大规模抓取,你需要一个让客户端通过它出去的正向代理。目标看到的是代理,一个好的代理会为你管理出口 IP。
# Forward proxy: your client exits through it, # so the target sees the proxy IP, not yours. curl -x "http://_USER_TOKEN_:@smartproxy.crawlbase.com:8012" \ -k "https://example.com/"
如果你同时运行两者,这是正常且正确的:你的应用位于反向代理后面,而它通过正向代理获取第三方数据。两者不是竞争对手,它们是不同连接的两端。具体到抓取端,请参阅回连代理 vs Crawling API 中池化端点的比较,如果你仍在筛选出口代理,我们在最佳代理提供商中维护了一份最新汇总。
核心要点
- 同一个中继,位于相反两端。正向代理代表客户端,反向代理代表源站。
- 正向隐藏请求者,反向隐藏应答者。所有其他差异都由此推导而来。
- 方向是部署决策,而不是产品类型。同一软件可以是任何一种,或同时是两种。
- 正向代理用于访问(匿名性、地区访问、抓取),反向代理用于提供服务(负载均衡、缓存、TLS、源站保护)。
- 同时运行两者是常态。你的应用位于反向代理后面,通过正向代理与外界交互。
常见问题
反向代理比正向代理更安全吗?
它们保护不同的一方,因此没有抽象意义上哪个"更安全"之说。反向代理加固服务器:它隐藏源站,终止 TLS,并为 WAF 和速率限制提供统一的执行点。正向代理加固客户端:它隐藏请求者,并可以过滤用户的访问内容。根据你需要防御的一方来选择。
反向代理和 VPN 一样吗?
不一样。反向代理工作在应用层,将特定请求转发到后端服务器。VPN 工作在更低的层次,建立一个将设备所有流量传入私有网络的加密隧道。反向代理面向服务器,VPN 将客户端连接到网络。
CDN 是反向代理吗?
是的。CDN 是部署在源站前面的全球分布式反向代理。每个边缘缓存并提供你的内容,终止 TLS,并保护真实服务器,这正是大规模运营的反向代理角色。
同一台服务器可以同时是正向代理和反向代理吗?
可以,因为角色是按连接分配的。CDN 边缘对你的访客起反向代理作用,对你的源站来看像是通过正向跳转到来的客户端;服务网格 sidecar 反转入站调用,同时转发出站调用。同一个进程根据连接方向扮演两种角色。
网络抓取需要正向代理还是反向代理?
正向代理。抓取是一个访问问题:你是客户端,你希望目标看到代理的 IP 而不是你的。反向代理面向你自己的服务器,对访问别人的网站毫无帮助。
负载均衡器是反向代理吗?
负载均衡是反向代理所承担的职责之一。专用的负载均衡器可以在传输层的更低位置运行,但应用层的负载均衡器在功能上就是专注于将流量分散到多个后端的反向代理。
大规模爬取任何站点,无需与基础设施对抗。
Crawlbase 负责处理代理、指纹和 CAPTCHA,让你的团队专注于交付数据流水线,而非维护爬取管道。1,000 次请求免费,无需信用卡。
