住宅代理能绕过IP封锁:哪些检测手段仍然有效
住宅代理借道被入侵的家用设备绕过基于IP的防御,本文介绍哪些检测信号仍能识别它们。

主流服务商出售的住宅代理出口节点中,大约四分之一运行在设备主人毫不知情的设备上。这一估计来自多年来对这些网络的学术测量,也解释了为什么某安全公司最近在分配给总统行政办公室的IP段里发现了住宅代理出口。研究人员注意到这些流量时,其中一半落在东部时间下午5点到午夜之间,网上自然是一片调侃。但抛开笑话,这里有一个对所有人都很现实的教训:住宅代理是绕过基于IP防御最有效的手段。如果你的威胁模型仍然把“住宅IP”当作可信信号,那你已经落后一代了。
我在一家中型SaaS公司负责检测工作长达四年,这种转变在我们的仪表盘上实时可见。撞库攻击团伙从数据中心代理转向住宅出口的那段时间,我们的IP黑名单从能拦截80%的攻击流量,骤降到几乎拦不住任何东西。攻击还是那些攻击,工具也没变,只是最后一跳换了。这篇文章就是要讲清楚这是为什么,以及当IP信誉失效之后,什么手段真正管用。
住宅代理的实际工作原理
住宅代理本质上就是运行在消费级设备上的一个出口节点——可能是手机、智能电视、机顶盒,或者家用路由器。代理网络的客户为从这些设备流出的流量付费,而代理服务商的工作,就是在每个地区都备有数百万个这样的节点。节点来源主要有三类,按“体面程度”从高到低排列。
- 选择加入的SDK。免费应用——VPN、天气小组件、手机游戏、“分享带宽赚钱”之类的应用——会捆绑代理SDK。同意条款埋在没人会读的服务协议里,但从技术上说确实存在。大型服务商谈论伦理时,指的正是这种模式。
- 被入侵的固件和恶意软件。僵尸网络多年来一直靠转卖代理流量赚钱。一台廉价的安卓流媒体盒子,如果出厂时就刷了可疑固件,那么它一联网就成了代理节点。而机主以为自己买的只是个媒体播放器。
- 直接出租僵尸网络。低端市场根本不装样子。如果某个服务商提供五千万个轮换IP,却没有任何关于来源的说明,那你自己算一算就知道了。
关键在于从防御方视角看这件事。流量来自Comcast、BT或德国电信的住宅ASN,IP定位到一个说得过去的城市,反向DNS返回类似 pool-96-225-14-7.nycmny.fios.verizon.net 的结果。我们在2010年代建立的每一条启发式规则,都会判定这是一个在家里的真人。但它不是。它是每GB 3美元的中继,而那位在家的真人根本不知道它的存在。
这最后一点值得强调,因为即便你从不购买或对抗代理,这部分故事也应该让你担心。中继带宽的SDK本质上是一段受他人远程控制的软件,就运行在你的网络边界之内。今天它只卖带宽,但没有任何架构上的限制,能阻止运营方——或者攻破运营方的人——让这些节点去做更糟的事。一个位于敏感网络内部设备上的代理SDK,不只是带宽问题,而是一个带着计费系统的立足点。
为什么基于IP的防御已经失效
IP信誉机制在滥用来源看起来像滥用的年代是有道理的:防弹托管、被劫持的数据中心网段、被遗忘VPS上的开放代理。你可以把坏邻居一一列出来。住宅代理终结了这个时代,它把恶意流量混进了好邻居之中,一次一个被入侵的客厅。
经济账让情况更糟。数据中心IP空间有限,而且监控严密——烧掉一个 /24 段,一天之内就会上各种黑名单。而住宅出口节点几乎无穷无尽,还能自我恢复。一次撞库任务就可以在数万个不同的家庭IP之间轮换,每个IP只发两三个请求,从不触发单IP速率限制。你的WAF看到的是一万个不同的“用户”。封禁任何单个IP毫无作用;封禁整个ASN,又会把你真正的客户也挡在外面。
这也是为什么“流量来自白宫”这种说法需要加上限定,而讨论这个故事时的怀疑者提出这一点是对的。拥有某个IP段,并不意味着它的每次公告都对应同一个物理地点。大型组织会从多个站点宣告地址段,运行访客网络、实验室和运营商NAT叠加网络。组织地址段中的一个出口IP,只能告诉你这段地址注册给了谁,却不能告诉你数据包是从哪张办公桌发出的。当你在自己的网络上做这类分析时——你应该这么做——请把归因当作一个需要用内部流日志去验证的假设,而不是结论。
仍然有效的检测信号
IP信誉已经失效,但流量并非无迹可寻。代理出口有自己的指纹。单靠任何一个信号都不足以下结论——每一个都可能有正当解释——但把它们叠加起来,效果相当惊人。这是现代检测工程的标准思路:不再寻找确凿的证据,而是从一系列弱信号中构建评分。同样的思路也出现在对混淆脚本的行为指纹识别中——只要能刻画出它的行为方式,你就不必读懂代码。
ASN与连接形态分析
先看ASN,但别止步于“是不是住宅网络”。真正有用的问题是:这个ASN是否与客户端声称的身份相符。一个声称是桌面版Chrome用户的请求,如果来自移动运营商的消费级5G地址段,就值得怀疑。来自消费级ISP ASN的流量以接近数据中心的并发量访问你的API,同样可疑。单个代理节点确实是真实的家庭,而真实的家庭有真实的限制:消费级上传带宽、NAT表、运营商级NAT的地址共享。一个在一小时内服务四十个不同代理客户的出口IP,会产生任何家庭都不可能产生的连接模式。
TLS与TCP指纹
这是抓住粗心运营者的地方。大多数代理客户会通过服务商的客户端软件,或者标准HTTP库来跑流量——比如Python的 requests、Go的 net/http、Node。每一种都有独特的TLS ClientHello:密码套件顺序、扩展列表、支持的群组。JA3和JA4哈希可以让你对比TLS握手所表明的客户端身份与其User-Agent声称的身份。一个自称“Windows上的Chrome 126”、却发出Go语言TLS指纹的请求,就是穿着伪装的机器人。一些成熟的代理网络会从客户自己的机器上做完整的TLS透传,这样就保住了伪装,但多数并不这么做,而即便是做得好的,也会在TCP层面露馅。一个声称是Windows客户端、TTL和窗口大小却指向Linux的请求,又为总分增加了一分。
延迟与时序模式
每个住宅代理都会额外经过一段消费级硬件和消费级上行链路,这一跳是有代价的。如果你的服务还能通过WebRTC、CDN边缘测量,甚至会话内请求的时间分布,看到客户端的真实延迟,你就能把网络RTT与声称的地理位置进行比对。一个“位于丹佛的用户”,到你弗吉尼亚数据中心的RTT只有4毫秒,那他显然不在丹佛。会话内的时序同样重要:真人浏览会有阅读停顿、鼠标移动和不规则的节奏。而通过代理、由自动化脚本跑出来的流量则有节拍器般的特征——请求间隔一致、没有空闲波动、表单瞬间提交。即便攻击者加入了抖动,那种抖动也来自一个真人永远不会产生的分布。
行为启发式规则
最强的信号不在于客户端是什么,而在于它做了什么。真实用户会东摸西看,机器人则按计划执行。一个会话如果登录后,通过一个UI路径上根本没有的URL直接跳到设置页面,修改邮箱,并在九十秒内提交一笔提现请求,那么不管它的IP怎么说,它都不是一个人。要追踪序列熵:会话是否按照你的前端真正的方式遍历应用,还是以只有读过你API文档的人才会选择的顺序访问端点?跨会话聚合在这里是杀手级功能。一个住宅IP发出三个请求看起来无害;三百个住宅IP各发三个请求,且TLS指纹、屏幕分辨率和端点序列完全相同,那就是同一次行动披着三百层伪装。

在自有网络中猎杀代理SDK
大家关注的多是入站问题,但引发这一切的故事,其实是一个出站问题:一台本该更懂事的网络设备,正在替别人中继流量。这是你真正能够采取行动的场景,因为你掌控着边界。假设总会有用户迟早插上一台被入侵的流媒体盒子,或者在工作手机上装一个“免费VPN”。你的任务,就是让这类事件变得响亮起来。
检测逻辑很直接,因为代理SDK有一种典型的姿态。一个节点的存在目的是接收指令并中继流量,这意味着:
- 持久的控制通道连接。与陌生域名或IP保持长时间的TLS会话,通常伴随着很小的周期性数据载荷。为你的出站目的地建立基线;如果一台客户端设备与你的任何软件供应商都不在其运营国家的主机保持着六小时连接,那就值得看一眼。
- 客户端设备的高扇出连接。一台工作站每小时向数百个不同的外部IP发起出站连接,它的行为更像基础设施,而不是人。笔记本用来浏览,中继设备用来中继。
- 指向客户子网的入站发起流量。许多代理框架会打入站隧道,或使用类STUN的NAT穿透。如果你的访客或IoT VLAN上的设备正在接收来自互联网的连接,那你的网络分段一定出了严重问题——找出来。
- 上传模式不对称。如果一部手机或电视盒子的上传量接近下载量,那它要么在提供内容,要么在中继流量。对消费级设备而言,这两种都不正常。
- 时段基线。发现政府网络出口的研究人员,正是依靠这一点:流量集中在晚间,暗示设备位于个人网络而非访客网络。你自己的做法可以更简单——当设备的流量模式改变了性质,而不只是数量变化时,就发出告警。
这些都不需要深度包检测,如果你在意运营一个人们能够信赖的网络,这一点就很重要。流元数据——NetFlow、Zeek的conn日志、VPC流日志——已经承载了上面所有的信号。如果你还没有保留并建立出站流数据的基线,那么在购买任何产品之前,先把这个缺口补上。这里的盲点与云认证日志中的盲点如出一辙:数据其实都在,但在发生事件之前,没人去看。
# Quick-and-dirty hunt: client devices acting like relays
# Feed this Zeek-style conn logs; flag RFC1918 sources with
# high distinct-destination fan-out and heavy upload ratios.
awk -F'\t' '
$3 ~ /^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01]))/ {
src=$3; dst=$5
up[src]+=$10; down[src]+=$12
seen[src SUBSEP dst]=1
}
END {
for (k in seen) { split(k,a,SUBSEP); fanout[a[1]]++ }
for (s in fanout)
if (fanout[s] > 200 && up[s] > down[s] * 0.5)
printf "%s dsts=%d up=%d down=%d\n", s, fanout[s], up[s], down[s]
}' conn.log | sort -t= -k2 -nr | head -20
这只是第一版,不是成品——请根据你自己的基线调整扇出阈值,并且在把媒体服务器和备份代理加入白名单之前,预计它们会产生误报。关键在于,这种猎杀成本很低。一个下午的日志分析,就能找到一台六位数的专用设备能找到的东西。
分段才是根本解法
这是我用惨痛经验换来的强烈观点:你永远赢不了与被入侵消费级设备之间的检测军备竞赛。供给规模太大,而出货不安全固件的厂商毫无后果。你能做的,是让被入侵的设备变得无关痛痒。一台感染了的流媒体盒子,如果位于做过妥善分段的IoT VLAN中,它可以把自己的带宽卖给代理网络——这很烦人,如果你的IP段很敏感,甚至可能很尴尬——但它无法访问你的文件共享、内部API,或任何能把尴尬升级为泄露事故的东西。
事故复盘中的模式总是一样的。这个组织要么是扁平网络,要么有一个能访问内部DNS和管理接口的“访客”网络,要么有一项只靠点击同意协议来执行的自带设备政策。然后,一台廉价安卓盒子或者一部带捆绑SDK的手机接入网络,这个组织的出口IP就开始出现在代理服务商的清单里。事后的补救,本应在事前就做好:访客网络的客户端隔离,IoT设备放在只允许出站、并拒绝RFC1918目的地的VLAN里,个人设备远离生产信任区。纵深防御并不光鲜,但正如我们在讨论分层防御与单一强控制时所说,真正在某个控制失效时救你的是层次——而总有一个会失效。
组织内部还值得展开一场政策讨论。“免费”应用正是这些SDK的入口。如果员工可以在接触你网络的设备上随意安装软件,那你实际上是把边界外包给了移动广告技术公司。有些组织用MDM和应用白名单来应对;对大多数组织来说,网络分段能以更低的政治成本达到同样的遏制效果。
这件事真正告诉我们什么
剥去那些政治揣测,这个故事清楚地展示了两个事实。第一,住宅代理检测已经发展成一个产品品类——研究人员现在可以大规模枚举出口节点,并将其映射到IP段,这确实是很有价值的遥测数据。第二,也是更令人不安的一点:每个网络,离“被别人当成基础设施”可能只差一次不谨慎的设备购买。世界上防护最严密的网络,依然有人在其中,而人总会插上各种东西。
如果你只记住一件事,那就是:检查你自己组织的出口IP是否出现在住宅代理清单中。有几家服务会告诉你,你的威胁情报源可能也已经包含了这类数据。发现你的地址段被列入,并不能证明已经失陷——运营商级NAT和共享地址空间会让画面变得模糊——但它是一个成本低、信号强的猎杀起点。然后去看看你的出站扇出、长连接,以及你的VLAN设计。
攻击者几年前就已经进入了好邻居。率先察觉的防御者,是那些不再检查地址、而开始观察行为的人。


