Metadata rate limit¶
Launchpad Bug: https://bugs.launchpad.net/neutron/+bug/1989199
目前元数据代理没有限制它们尝试处理的请求数量。行为不当的实例重复查询元数据端点可能会给元数据代理上方的服务(Nova 和 Neutron)带来高负载。
问题描述¶
平台管理员受益于能够限制元数据处理的请求速率,以保护其他 OpenStack 组件免受 DoS 攻击。
速率限制应该可以通过配置文件进行配置
请求应该按源 IP 进行速率限制
速率限制的默认设置不应影响实例的正常配置(例如,通过 cloud-init)
提议的变更¶
元数据代理(在 OVN 和 OVS/linuxbridge 的情况下)通过它配置的 haproxy 进程接收实例请求。
我们可以利用 haproxy 的 stick-tables 来实现速率限制,类似于此 haproxy 配置示例 [1]。具体来说,来自 IP 且请求速率高于配置阈值的请求将从 haproxy 接收到 429 错误,而不会命中元数据代理。
在配置方面,我们将引入一些新的指令来启用速率限制并配置阈值和时间窗口大小。
为了适应实例生命周期内通常发生的一些事件(例如:cloud-init、网络元数据的周期性刷新),我们可以使速率限制具有突发性,例如:将请求速率限制为 60 秒内 30 次,5 秒内 10 次。这可以通过创建两个 stick-tables 来实现,分别保存长基准窗口和短突发窗口的请求速率,并且当 IP 的请求速率超过基准或突发阈值时,拒绝来自该 IP 的请求。
影响¶
配置影响¶
添加新的配置指令以启用和控制速率限制
rate_limit_enabled (bool): 是否启用请求速率限制。
base_window_duration (seconds): 基准窗口的持续时间
burst_window_duration (seconds): 突发窗口的持续时间
base_query_rate_limit (short): 基准窗口期间的查询速率限制。
burst_query_rate_limit (short): 突发窗口期间的查询速率限制。
Metadata 的 haproxy 影响¶
添加两个后端,用于保存存储每个 IP 的
http_req_rate的 stick-tables,用于基准窗口和突发窗口。在侦听器中,如果
src_http_req_rate大于配置的基准或突发限制的阈值,则使用 429 拒绝请求。在侦听器中,跟踪基准和突发 stick-tables 中的请求。
实现¶
负责人¶
Guillaume Espanel <guillaume.espanel@gmail.com>
测试¶
单元测试,以确保 haproxy 的配置根据配置参数构建。