存在哪些出站 HTTP 限制解决方案?

kvi*_*sta 5 bandwidth http traffic-shaping throttling

我正在寻找一种以尊重站点策略的方式灵活管理出站 HTTP/HTTPS 流量的方法,并且可以部署在我们数据中心网络的“边缘”。

例如,我们使用了几个具有限制率的 Web API,例如“每秒不超过 4 个请求”或“每天最多 50K 个请求”等。我们公司有很多人使用这样的各种服务,所以我不能集中管理软件中的所有请求。人们以不同的时间表和不同的强度运行这些东西。我们对此很好(它满足内部需求),但我们意识到 - 总的来说 - 我们可能会遇到产生如此多并发流量的情况,我们会被网站阻止。(虽然是无意的)

我所期待/希望的是,我们可以利用网络硬件世界中已经存在的带宽管理/流量整形解决方案,然后我们可以在数据中心网络的边缘部署这样的东西。

理想情况下,我可以编写 L4 或 L7 路由规则,以确保我们的数据中心生成不超过 - 例如 - 4 req/sec 出站。理想情况下,其余的请求将由硬件排队一段合理的时间,而队列容量过剩则被简单地拒绝。我意识到没有免费的午餐,节流不会解决基本的内在需求(请求)与供应(站点策略)问题。但是,节流将允许我们在某个窗口(例如一天)内“平滑”请求,以便我们可以以适当限制的方式利用外部服务,同时最大限度地利用。

有谁知道这样的网络级带宽管理解决方案?如果是这样,它是否还支持不仅基于 HTTP 请求中的 URL 之类的规则,而且还支持一些额外的 HTTP 标头?

Gan*_*ell 4

netfilter的功能几乎是无限的。在这一点上,我将使用 iptables 中的 limit 模块。请注意:没有办法在不丢弃数据包的情况下限制 TCP/IP 中的速率。您可以将数据包排队,但最终当队列已满时,数据包会被丢弃。所以我们要删除 SYN 包。到目前为止我还没有尝试过这个,可能是因为重试超时很长,没有人这样做,即浏览器可能会被锁定。

限制

该模块使用令牌桶过滤器以有限的速率进行匹配。使用此扩展的规则将匹配,直到达到此限制(除非使用“!”标志)。例如,它可以与 LOG 目标结合使用以提供有限的日志记录。

--limit rates 最大平均匹配率:指定为数字,可选“/秒”、“/分钟”、“/小时”或“/天”后缀;默认为 3/小时。

--limit-burst number 要匹配的数据包的最大初始数量:每次未达到上面指定的限制时,此数字将重新加一,直到此数字;默认值为 5。

  1. 我们设置了一个新的链来限制连接。对于 4/秒,它将返回到调用者链,其余的将被丢弃。
  2. 到端口 80 的新连接将发送到该新链。
iptables -N CONNRATELIMIT
iptables -A CONNRATELIMIT -m limit --limit 4/sec -j RETURN
iptables -A CONNRATELIMIT -j DROP

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j CONNRATELIMIT
Run Code Online (Sandbox Code Playgroud)

我使用二级链只是为了展示这个概念。您也可以在路由器上执行此操作,然后您必须为每个要限制的服务器或实体创建一条链。并使用 FORWARD 而不是 INPUT。

排队

在此解决方案中,不存在“长时间”排队。您可以使用limitlimit-burst参数。也可以将 SYN 数据包发送到排队规则:设置要复杂得多,而且我看不出它如何使丢弃 SYN 数据包的情况变得更好。

网址匹配

URL 匹配也是可能的,在这种情况下,您会丢弃该数据包并通过等待重新传输来延迟连接,我已经使用最近的模块完成了此类操作,但我使用它来防止暴力攻击和端口扫描。所以我不关心我限制的连接。正确处理连接将会变得困难!