CGNAT 详解:为什么一个 IP 地址不等于一个用户
运营商级 NAT 会让成千上万名用户共用同一个公网地址。它会如何影响基于 IP 的封禁、限流与数据分析?企业又该如何应对?
很多反滥用规则至今仍建立在一个早已失效的前提上:一个 IP 地址就代表一个用户。运营商级 NAT(CGNAT)正是这个前提不再成立的主要原因。
什么是 CGNAT
IPv4 地址早已不够用了。相比为每个用户购买稀缺的公网地址,移动运营商以及许多固定宽带 ISP 更常见的做法,是把大量客户放在一组共享公网地址后面,并在流量出网时进行端口转换。也就是说,一个公网地址背后,可能同时对应着数百甚至数千个家庭宽带或手机终端。
从你的服务器视角看,这些流量全都像是来自同一个客户端。
它会破坏什么
封禁。 如果你在发现一次暴力破解后直接封掉该 IP,结果可能是把某个移动网络里一整片区域的正常用户都挡在门外。而攻击者只要重新连接,几秒钟内就可能从地址池里拿到另一个 IP,然后继续攻击。
限流。 每个 IP 每分钟 10 次请求,对单个用户来说可能很宽松;但如果有 2,000 名用户共用同一个出口,这个阈值就会低得离谱。高峰时段,你会无意中限制大量正常用户,而且通常不会察觉——因为他们只会默默离开。
归因。 在运营商网络里,“两个账号来自同一个 IP”并不能有力证明它们是多账号行为。放在家庭光纤宽带上,这个信号还有一定意义;放在 CGNAT 场景下,几乎说明不了什么。
分析。 如果用 IP 地址来统计独立访客,移动网络上的人数会被压缩;而在频繁轮换地址的网络中,又可能被高估。这两类偏差在数据看板里往往都不明显。
如何判断你面对的是 CGNAT
以下信号值得重点关注:
- 连接类型被识别为 mobile,或 ASN 隶属于移动运营商。
- 单个地址下出现异常丰富的请求特征:大量不同的 user agent、账号和地区。
- 转发头中出现共享地址转换空间(100.64.0.0/10)。
通过 IP intelligence 查询,你可以直接获得前两类信息;这通常已经足以让系统在请求发生时动态调整策略。
应该怎么做
- 按网络类型调整限流强度。 住宅网络可以采用较严格的按 IP 限流;移动网络和企业网络段则应放宽按 IP 限制,同时用更严格的账号级、设备级限制来补偿。
- 把身份识别下沉一层。 只要条件允许,就基于账号 ID、会话或设备信号进行限流。IP 应作为辅助键,而不是主键。
- 优先使用验证挑战,而不是直接封禁。 验证挑战会给共享网络带来一点摩擦;直接封禁则是在让所有共享用户共同受罚。
- 缩短封禁有效期。 如果必须封禁共享地址,应以分钟为单位,而不是按天计算。攻击者往往早就换到别的出口了,而你的封禁还在继续误伤正常用户。
- 监控连带影响规模。 如果一次封禁会影响不止少数活跃账号,这本身就是一个信号:该地址很可能是共享地址,而封禁并不是合适的工具。
底层原则
IP 地址描述的是网络路径,而不是某个具体的人。它是重要的风险信号,却不是可靠的身份标识。能够区分这两点的系统,通常能在更少误伤的前提下拦截更多滥用行为。即便 IPv6 的普及在一定程度上恢复了“每个用户一个地址”的可能性,只要移动流量持续增长,这个问题就不会真正消失。
