代理列表和一些服务商会把代理按匿名程度分为三个等级:透明、匿名和高匿。这些标签描述的其实只是一件很具体的事,即代理会在你的请求中添加哪些 HTTP 请求头。透明代理会把你的真实 IP 地址一并转发出去;匿名代理会隐藏你的 IP,但会表明自己是代理;高匿代理(也称为高匿名代理、精英代理)则什么都不添加。
了解这一点很有用,但它回答的问题比大多数买家以为的要小。目标网站检查的远不止请求头,而且 IP 地址的类型比匿名等级更重要。本文将说明每个等级会暴露什么、如何自行检测代理,以及为什么不添加任何请求头的住宅代理才是真正看起来像普通访客的组合。
三个等级,逐个请求头来看
当代理转发明文 HTTP 请求时,它可以添加一些请求头,告诉目标服务器这次请求经过了代理。其中有三个比较关键:
- Via 标明处理该请求的代理。HTTP 标准要求代理添加这个请求头。
- X-Forwarded-For 携带原始客户端的地址。它不属于核心标准,但几乎所有代理和负载均衡器都能识别。
- Forwarded 是同一思路的标准化版本,由 RFC 7239 定义,包含客户端地址、协议和主机等字段。
匿名等级不过是这些请求头的不同组合:
| 等级 | 真实 IP 是否可见 | 是否可看出使用了代理 | 通常添加的请求头 |
|---|---|---|---|
| 透明 | 是 | 是 | Via、包含你 IP 的 X-Forwarded-For |
| 匿名 | 否 | 是 | Via,或包含代理自身 IP 或空值的 X-Forwarded-For |
| 高匿(高匿名) | 否 | 无法从请求头看出 | 无 |
透明代理并不是坏掉的代理。企业网络、学校和缓存服务器会有意使用透明代理,因为它们的目的是过滤或缓存流量,而不是隐藏任何人。“透明”一词在网络领域还有另一个毫不相关的含义:无需客户端配置即可拦截流量的代理。我们的代理服务器术语条目介绍了这层含义。在匿名等级中,它的意思只是”会把你的地址转发出去”。
这些标签只适用于明文 HTTP
如今大部分网络流量都走 HTTPS,情况也随之改变。访问 HTTPS 网站时,客户端会通过 CONNECT 请求让代理建立一条隧道,然后经由这条隧道直接与目标服务器进行 TLS 通信。代理只负责中继加密后的字节,无法读取或添加隧道内部的请求头,所以即使它想添加 Via 或 X-Forwarded-For 也做不到。
实际意味着:
- 对于 HTTPS 目标,就请求头而言,所有正常工作的代理都表现得像高匿代理。
- 对于明文 HTTP 目标,匿名等级是真实存在的,值得检查。
- 在 HTTPS 测试中显示为”高匿”的代理,在 HTTP 下仍可能泄露请求头,所以请用你实际使用的协议进行测试。
目标网站在请求头之外还会检查什么
去掉代理请求头是最容易的部分。在意自动化流量或代理流量的网站,会查看代理无法简单省略的信号。
IP 地址本身。 每个地址都属于某个网络,IP 数据库会记录该网络属于家庭宽带运营商、移动运营商、托管公司还是已知的代理 IP 段。即使不带任何代理请求头,来自云数据中心的请求看起来仍然像是服务器发出的。这就是为什么数据中心代理即便标注为高匿,在有防护的网站上也更常被封锁。
IP 信誉。 发送过垃圾邮件、攻击或大量自动化流量的地址会被列入黑名单。公共列表中的免费”高匿”代理通常被许多陌生人共用,往往早已被标记。
客户端。 TLS 握手、HTTP/2 设置和请求头顺序都能识别发出请求的软件。代理不会改变其中任何一项。我们关于 TLS 与 HTTP/2 指纹识别的指南说明了客户端在第一个页面加载之前就会暴露多少信息。
一致性。 如果浏览器的时区、语言和位置与 IP 地址不匹配,无论请求头怎么写都会显得可疑。
行为。 请求频率、浏览路径以及缺少正常的页面资源加载,这些本身就足以暴露自动化行为。
所以,“高匿”是必要条件,但并不充分。它去掉了一个容易识别的信号,却不能让请求看起来像是某个人在家中发出的。
如何检测代理的匿名等级
任何代理都可以在几分钟内完成测试。通过代理向一个会回显所收到请求头的服务器发送明文 HTTP 请求,看看代理添加了什么。
请使用你自己控制的回显服务器。公共的请求头回显服务通常部署在它们自己的负载均衡器之后,这些负载均衡器会在回显代码看到 X-Forwarded-For 之前将其删除或改写,从而可能让透明代理看起来像高匿代理。在任何一台带公网 IP 的小型服务器上写几行代码就够了:
# echo.py: run on your own server, e.g. python3 echo.py
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
class Echo(BaseHTTPRequestHandler):
def do_GET(self):
body = json.dumps({
"remote_addr": self.client_address[0],
"headers": dict(self.headers),
}).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(body)
HTTPServer(("0.0.0.0", 8080), Echo).serve_forever()
然后通过代理以明文 HTTP 调用它:
import os
import requests
PROXY = os.environ["PROXY_URL"] # e.g. http://user:pass@host:port
ECHO = "http://YOUR_SERVER_IP:8080/" # plain HTTP on purpose
seen = requests.get(ECHO, proxies={"http": PROXY}, timeout=20).json()
PROXY_HEADERS = ["via", "x-forwarded-for", "forwarded", "x-real-ip", "proxy-connection"]
found = {k: v for k, v in seen["headers"].items() if k.lower() in PROXY_HEADERS}
print("Address the server saw:", seen["remote_addr"])
print("Proxy headers added:", found or "none (elite for HTTP)")
如果 X-Forwarded-For 中包含你自己的地址,该代理就是透明代理。如果存在代理请求头但不包含你的地址,它就是匿名代理。如果没有任何额外的请求头,那么对于 HTTP 流量而言它就是高匿代理。接下来,请在 IP 数据库中查询出口地址,看看它属于哪类网络,因为这正是目标网站接下来要检查的内容。
住宅代理的定位
对代理来说,最理想的情况是不添加任何请求头,并且从属于普通家庭网络的地址出口。这正是住宅代理网络所提供的:请求从你选择的国家或城市中的家庭宽带连接发出,途中不添加任何代理请求头。Shifter 的住宅网关在转发请求时不会添加 Via 或 X-Forwarded-For。
同时也有必要明确其局限。任何匿名等级都无法隐藏你的账户、Cookie 或浏览器指纹,而且服务商仍然知道它的客户是谁。我们的文章为什么代理不是匿名工具详细说明了代理能隐藏什么、不能隐藏什么。对于采集公开数据、测试网站在其他市场中的表现,以及将请求分散到大量地址上,正确的配置是干净的出口 IP 加上行为如同普通浏览器的客户端。
常见问题
什么是高匿代理?
高匿代理,也称为高匿名代理或一级(level 1)代理,在转发请求时不会添加任何会暴露你的 IP 地址或表明正在使用代理的请求头。目标服务器只能看到代理的地址。
高匿代理和住宅代理是一回事吗?
不是。“高匿”描述的是代理会添加哪些请求头。“住宅”描述的是出口 IP 的来源:家庭互联网连接,而不是数据中心。数据中心代理可以是高匿的,但仍然很容易通过 IP 地址被识别出来。
匿名等级对 HTTPS 网站重要吗?
重要性低得多。对于 HTTPS,代理中继的是一条加密隧道,无法在其中添加请求头。匿名等级只在明文 HTTP 流量中才有意义,因为此时代理可以读取和修改请求。
网站能看出我在使用高匿代理吗?
无法从请求头看出,但可以通过其他信号判断:IP 地址的类型和信誉、客户端的 TLS 指纹、不匹配的位置设置以及请求行为。
总结
透明、匿名和高匿描述的只是代理会在明文 HTTP 请求头中添加什么,仅此而已。在 HTTPS 下,这种区别不复存在,目标网站转而依靠 IP 地址、IP 信誉、客户端指纹和行为来判断。请选择不添加请求头的代理,用你实际使用的协议进行检测,并把最多的注意力放在出口 IP 的来源上。