Proxy judge 是一种服务器端脚本或服务,用于检查客户端通过代理发送的 HTTP 头,从而暴露客户端的原始 IP 地址以及识别代理的细节,以判断其匿名级别。
什么是 Proxy Judge?
Proxy judge 作为一种中间诊断工具运行。当客户端通过代理服务器连接到 proxy judge 时,judge 会分析代理提交的 HTTP 请求头。该分析可识别出那些可能泄露客户端真实 IP 地址、或表明所用代理服务器存在及类型的特定请求头。其主要功能是验证代理是否成功隐藏了客户端身份,以及隐藏到何种程度。
Proxy Judge 的工作原理
Proxy judge 的流程如下:
- 客户端请求: 客户端配置系统或应用,将其网络流量通过指定的代理服务器转发。
- 代理转发: 代理服务器接收客户端请求,并将其转发到目标 Web 服务器,本例中即 proxy judge。
- 请求头检查: proxy judge 服务器收到请求后,读取服务器变量和 HTTP 头。这些请求头包含关于连接路径的元数据。
- 匿名性评估: judge 随后解析这些请求头,查找通常会暴露客户端信息或标识代理的特定字段。根据这些头的存在、缺失或被修改的情况,judge 对代理的匿名级别进行分类。
- 生成报告: judge 向客户端返回报告,列出检测到的 IP 地址和请求头信息,并给出对该代理匿名性的评估。
proxy judge 关注的关键请求头包括 REMOTE_ADDR、HTTP_X_FORWARDED_FOR、HTTP_VIA、HTTP_PROXY_CONNECTION、HTTP_FORWARDED,以及其他可能泄露客户端原始 IP 或代理存在的头。
代理匿名级别
proxy judge 根据代理传递的信息,将代理划分为不同的匿名级别。
精英代理(高匿名)
精英代理提供最高级别的匿名性。它不传递任何暴露客户端原始 IP 地址的请求头,也不表明自己是代理。对目标服务器(proxy judge)而言,连接看起来直接来自代理服务器的 IP 地址,客户端与直连无法区分。
- 特征:
REMOTE_ADDR:显示代理的 IP。HTTP_X_FORWARDED_FOR:不存在。HTTP_VIA:不存在。HTTP_PROXY_CONNECTION:不存在或已被修改。
- 检测: 若无高级指纹识别手段,很难与直连区分。
匿名代理
匿名代理隐藏客户端的原始 IP 地址,但会暴露自身作为代理服务器的存在。也就是说,目标服务器知道正在使用代理,但原始客户端的身份仍被隐藏。
- 特征:
REMOTE_ADDR:显示代理的 IP。HTTP_X_FORWARDED_FOR:不存在。HTTP_VIA:存在(例如1.1 proxy.example.com)。HTTP_PROXY_CONNECTION:可能存在。
- 检测: 出现
HTTP_VIA或类似请求头即表明使用了代理。
透明代理(非匿名)
透明代理,也称非匿名代理或转发代理,不会尝试隐藏客户端的原始 IP 地址。它通常通过 X-Forwarded-For 之类的请求头把客户端 IP 转发给目标服务器。目标服务器既知道代理的存在,也知道原始客户端的 IP。
- 特征:
REMOTE_ADDR:显示代理的 IP。HTTP_X_FORWARDED_FOR:存在,包含客户端的原始 IP。HTTP_VIA:通常存在。HTTP_PROXY_CONNECTION:可能存在。
- 检测:
HTTP_X_FORWARDED_FOR中带有客户端 IP 即为确凿证据。
混淆代理(Distorting Proxy)
混淆代理是一种变体,它在 X-Forwarded-For 头中传递虚假或随机的 IP 地址,以误导目标服务器。虽然它隐藏了真实的客户端 IP,但仍表明自己是代理,且提供的 X-Forwarded-For 并非真实客户端 IP。它有时被归类为匿名代理的一种,但其明确的伪造行为使其有别于后者。
- 特征:
REMOTE_ADDR:显示代理的 IP。HTTP_X_FORWARDED_FOR:存在,但包含虚假/随机 IP。HTTP_VIA:通常存在。
- 检测:
HTTP_X_FORWARDED_FOR中的 IP 与上一跳的REMOTE_ADDR不匹配(在多层代理串联时),或者是明显无效的 IP。
用于匿名性检测的关键 HTTP 头
proxy judge 的分析依赖于检查以下特定的 HTTP 头和服务器变量:
REMOTE_ADDR:该服务器变量直接给出连接到 proxy judge 服务器的客户端 IP 地址。若使用了代理,这通常是代理的 IP。HTTP_X_FORWARDED_FOR:代理用来标识原始客户端 IP 地址的事实标准请求头。当多个代理串联时,它可包含以逗号分隔的 IP 列表。HTTP_VIA:由代理服务器添加,用于表明请求经过了它。通常包含代理的协议和主机名/IP。HTTP_PROXY_CONNECTION:部分代理使用的非标准请求头,表示代理特有的连接细节。HTTP_FORWARDED:标准化请求头(RFC 7239),是X-Forwarded-For和Via的更完善替代方案,可传递客户端、代理和主机信息。HTTP_CLIENT_IP:较少见的非标准请求头,可能包含客户端 IP。
Proxy Judge 的实际用法
要有效使用 proxy judge,请将客户端配置为通过待测代理转发流量,然后向 proxy judge 服务发起请求。
示例:结合 curl 使用代理
使用 curl 测试 proxy.example.com 上端口为 8080 的代理:
curl -x http://proxy.example.com:8080 http://proxyjudge.com
请将 http://proxyjudge.com 替换为实际 proxy judge 服务的 URL。输出即为 judge 的报告。
示例:一个简单的 Proxy Judge 脚本(PHP)
一段基础 PHP 脚本即可充当 proxy judge:
<?php
header('Content-Type: text/plain');
echo "--- Proxy Judge Report ---\n";
echo "Your IP (REMOTE_ADDR): " . $_SERVER['REMOTE_ADDR'] . "\n";
echo "--------------------------\n";
$headers_to_check = [
'HTTP_X_FORWARDED_FOR',
'HTTP_VIA',
'HTTP_PROXY_CONNECTION',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP'
];
foreach ($headers_to_check as $header) {
if (isset($_SERVER[$header])) {
echo $header . ": " . $_SERVER[$header] . "\n";
} else {
echo $header . ": Not Present\n";
}
}
echo "--------------------------\n";
// 匿名级别的基础推测
$anonymity_level = "Elite Proxy"; // 默认假设
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$anonymity_level = "Transparent Proxy";
// 检查 X-Forwarded-For 是否明显为伪造值
$xf_ip = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]);
if ($xf_ip !== $_SERVER['REMOTE_ADDR'] && !filter_var($xf_ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
// 这只是简化的检查;真正判定 "distorting" 需要更严格的校验
// 对于简单的 judge:只要存在 XFF,严格意义上就不属于 Elite/匿名。
}
} elseif (isset($_SERVER['HTTP_VIA']) || isset($_SERVER['HTTP_PROXY_CONNECTION'])) {
$anonymity_level = "Anonymous Proxy";
}
echo "Estimated Anonymity Level: " . $anonymity_level . "\n";
?>
该脚本会输出检测到的 IP 和相关请求头,给出基础评估。
解读 Proxy Judge 的结果
特定请求头的存在与否,直接对应代理的匿名级别。
| 请求头 | 精英代理 | 匿名代理 | 透明代理 | 混淆代理 |
|---|---|---|---|---|
REMOTE_ADDR |
代理 IP | 代理 IP | 代理 IP | 代理 IP |
HTTP_X_FORWARDED_FOR |
不存在 | 不存在 | 客户端原始 IP | 虚假/随机 IP |
HTTP_VIA |
不存在 | 存在 | 通常存在 | 通常存在 |
HTTP_PROXY_CONNECTION |
不存在 | 可能存在 | 可能存在 | 可能存在 |
HTTP_FORWARDED |
不存在 | 可能存在 | 可能包含客户端 IP | 可能包含虚假 IP |
| 匿名性评分 | 最高 | 中等 | 最低 | 低(可被检测) |
Proxy Judge 的局限
proxy judge 虽然有用,但也存在局限:
- 仅关注 HTTP 头: 它们主要分析标准 HTTP 头,可能无法检测其他层面或其他协议上的泄露(例如 WebRTC IP 泄露、DNS 泄露)。
- 浏览器指纹: proxy judge 不评估浏览器指纹方面的因素(如 user agent、屏幕分辨率、已安装字体、Canvas API 数据),而这些同样能唯一识别用户。
- 检测技术演进: 高级检测方法已超出简单的请求头检查,会借助 JavaScript、Flash 或其他浏览器端技术来突破代理匿名性。
- 代理链的复杂性: 在复杂的代理链中,如果中间代理以不一致的方式修改或剥离请求头,准确判定原始客户端 IP 会很困难。
- SSL/TLS 拦截: 对于 HTTPS 流量,若代理不做 SSL/TLS 拦截,judge 只能看到外层的 TLS 连接,看不到内部的 HTTP 头;没有特定的代理配置时很难检测。
代理匿名性的最佳实践
要保持有效的代理匿名性:
- 定期验证: 定期使用多个 proxy judge 服务测试您的代理,因为不同的 judge 可能检测出不同的方面。
- 了解代理类型: 根据您的匿名性需求选择合适的代理类型(例如更广泛流量用 SOCKS5,网页用 HTTP/HTTPS)。
- 与其他检测结合: 用 WebRTC 泄露测试、DNS 泄露测试和浏览器指纹工具补充 proxy judge 的结果,以确保全面的匿名性。
- 安全配置: 确保应用程序和操作系统正确配置,将所有相关流量都通过代理转发,避免直连或泄露。
- 使用 HTTPS: 优先使用 HTTPS 连接。虽然 proxy judge 无法看到加密隧道内部,但 HTTPS 会将您的数据从代理到目标端全程加密,提供额外一层安全保障。
