返回博客

按 IP 地址限流:如何为共享 IP 环境设计更稳健的限额

限流IP情报安全共享IP

在共享 IP 场景下,单纯按 IP 地址限流很容易误伤正常用户或放过攻击流量。本文介绍如何结合代理、VPN、NAT 等网络特征,设计更可靠的限流策略。

限流是保护 Web 应用和 API 的基础防线之一,常用于应对滥用、资源耗尽以及拒绝服务攻击。最简单、也最常见的做法,是按 IP 地址统计请求次数并设置阈值。但在今天的网络环境里,这种方法很快会遇到瓶颈:大量访问并不来自“一个用户一个 IP”,而是来自共享 IP。

共享 IP 无处不在:企业 NAT、移动运营商网络、公共 Wi-Fi、VPN、proxy,以及 TOR 出口节点都属于典型场景。如果仅凭源 IP 来判断一个独立用户或实体,结果往往不是误封正常用户(误报),就是让更有经验的攻击者通过轮换共享 IP 绕过限流(漏报)。

本文将介绍如何在共享 IP 环境下设计更有韧性的限流策略,避免只依赖简单的 /32 或 /128 IP 计数。

核心问题:IP 地址 != 用户

过去,单个 IP 地址通常能较好地对应一个用户,或对应静态 NAT 后面的一小组用户。如今,这个假设已经不再可靠:

  • 移动运营商: 通过运营商级 NAT(CGNAT),成千上万甚至数万名用户可能共用同一个公网 IPv4 地址。
  • 企业网络: 大型组织通常会把所有出站流量汇聚到少量公网 IP 池中。
  • 公共 Wi-Fi/热点: 大量用户可能同时通过同一个网关 IP 访问服务。
  • 代理、VPN、TOR: 这些服务本身就会将用户聚合到共享 IP 后面,用于隐私保护或访问绕过。攻击者也会利用它们隐藏身份,并把流量分散到多个 IP 上。
  • 云服务商/数据中心: 运行在云环境或数据中心的工作负载,往往来自规模庞大且容易识别的 IP 段,而这些 IP 段通常由大量租户共享。

当大量正常用户共用一个 IP 时,简单的单 IP 限流很容易被迅速触发,导致所有人一起被拦截。反过来,攻击者也可以使用一组 proxy IP 轮换请求,让每个 IP 看起来都没有超过阈值,但整体流量却远远高于系统原本想限制的水平。

跳出单一 IP:为限流引入更多信号

要设计更稳健的限流机制,必须在直接源 IP 之外,引入更多辅助信号。

1. 以用户为中心的标识

在条件允许且合规的情况下,限流应优先绑定到用户 ID,而不是只绑定 IP。对于已登录后的操作,这通常是更理想的方式。

  • Session ID/Cookie: 按会话统计请求,有助于识别来自同一会话的重复操作。

你的连接