代理轮换和 VPN 在不同层面改变你的公网地址,而这个差别决定了什么会泄露。VPN 把每个数据包都送进隧道,因此目标看到的源地址就是隧道端点。代理位于网络层之上:只有你经它发出的请求才会从出口出现,机器上的其他一切仍保留真实地址。把这一层分清楚,轮换就从勾选项变成了设计决策。

公网地址究竟从哪里来

目标看到的地址是你流量最后一次离开的地方,在家庭宽带里就是路由器上运营商给的地址,而不是机器自己拥有的什么。重启路由器可能拿回同一个租约,改它的 MAC 地址有时会得到新的,但两者都不能让你选国家。VPN 在 IP 层替换源地址,所以机器发出的每个数据包,包括 DNS 和后台更新,都从隧道端点离开。代理高一层工作:它接受请求,向目标打开自己的连接,只有这个请求会从出口出现。机器上的其他一切仍然使用真实地址。

这一层区分解释了大多数意外。指向代理的浏览器扩展只改变浏览器发出的东西,别的都不变,所以同一台主机上的第二个应用仍会泄露原始地址。全系统 VPN 的失效方式正好相反:它会覆盖你想留在本地的流量,并且只有在客户端这样配置时才会关闭。在两者之间选择,其实是在选择哪部分流量必须移动。

于是轮换就作用在你选的那一层上。用代理时,轮换意味着下一个请求使用不同的出口。用 VPN 时,它意味着拆掉并重建隧道,更慢,而且表现为一次可见的重连。

HTTP 代理能读到什么,读不到什么

对明文 HTTP,代理能看到请求行里的绝对 URI、每个请求头和正文。它可以记录这一切,也可以重写任何部分,所以免费代理往响应里注入脚本,做的正是协议允许的事。认证使用 Proxy-Authorization,而缺失或错误的凭据会产生 407 Proxy Authentication Required 而不是连接错误。

对 HTTPS,客户端发送 CONNECT host:port ,代理打开一条原始隧道,之后它只能看到加密字节。它仍然从 CONNECT 行、通常也从 TLS 握手中的 SNI 字段得知主机名,所以主机名层面的记录会保留,即使负载不会。要读取负载,必须用客户端信任的证书终结 TLS,那是另一种产品,另一种风险。而 HTTP 语义规范 把 CONNECT 定义为隧道请求,这正是理解出口能看见什么、看不见什么的正确心智模型。

curl -v -x http://proxy.example.net:8080 https://example.com 2>&1 | grep -E 'CONNECT|Proxy-'

详细输出会在任何 TLS 流量之前显示 CONNECT 行,而那正是代理得知你目的地的时刻。用 407 应答的代理从未打开隧道,所以换别的 TLS 设置重试没有用。

轮换的粒度决定什么会断

每个请求都轮换,看起来最安全,破坏也最多。Cookie、CSRF 令牌和服务端会话都绑定在某个身份上,而登录与下一次调用之间变化的身份,在目标看来就像会话劫持。许多服务商把粘性会话编码进代理用户名来提供,因此出口在选定的时间窗口内保持不变。

粒度要从任务出发选,而不是照服务商的默认值。抓取独立页面的爬虫可以按请求轮换,而结账流程或已认证的 API 必须在整个流程中保持同一个出口。下面两个调用展示了粘性用户名和普通轮换端点,而 socks5h 这种方案在代理侧解析域名,而不是在本地。

curl -sS -x http://user-session-a1b2:[email protected]:8080 https://ifconfig.me
curl -sS -x socks5h://127.0.0.1:1080 https://ifconfig.me

本地 DNS 是一种安静的泄露。如果客户端在连接前解析域名,那么即使 HTTP 请求从别处出去,解析器仍会知道你访问的每一台主机。而 socks5h 形式和代理侧解析避免了这一点,用它们不花任何代价。

目标除了地址还会分类什么

地址声誉只是若干输入之一。目标会结合 ASN 及其数据中心或住宅标签、客户端的 TLS 指纹、HTTP/2 设置、请求头顺序、请求速率和导航形态。由无头浏览器驱动的住宅出口,可能在真实会话驱动的数据中心出口能通过的地方失败。

出口类型决定了你能诚实地声称什么,而每一种都带着不同的代价。

Exit typeWhat the target seesMain cost
Datacenter proxyHosting ASN, cheap, often pre-blockedLow reputation, easy to detect
Residential networkA consumer ISP address belonging to someone elseConsent and terms-of-service exposure
Mobile carrierA carrier NAT address shared by many subscribersPrice, plus shared blame for abuse
Your own cloud egressAn address you are accountable forRecognisable, but defensible

共享出口并不中立。从那个地址跑的任何东西都会落进同一个声誉桶,而已经被其他租户烧掉的地址,会在你的第一个请求被读取之前就失败。

选一个你能在政策里描述清楚的出口

有用的问题不是怎么藏地址,而是谁对从它出去的流量负责。按任务自有的云出口、有数据处理协议和公开留存期限的合约服务商,以及每个任务一个身份的自主托管 VPN,都可以用一句话说清。免费列表不行,因为它的运营者对你没有任何义务,却有充分的动机记录。

把自己的速率限制压在目标能容忍的水平之下,只收集任务需要的字段,让错误保持很小。为了躲封锁而加快轮换,通常只会抬高造成封锁的请求速率。

把 选定的出口、它的轮换窗口和它的负责人 写进第一次运行前的任务配置。等封锁到来时,那条备注才会告诉你该换出口还是该改行为。

相关文章