计量标签规则的源和目标过滤

本规范为 Neutron 计量标签规则添加源和目标过滤选项。

问题描述

Neutron 计量标签规则有一个名为“remote-ip-prefix”的参数,该参数允许运营商根据远程 IP 地址过滤流量。然而,自[1]以来,其含义被更改为完全相反,这造成了一些混淆。它不是匹配远程前缀(朝向外部接口),而是匹配本地前缀(朝向 OpenStack 租户网络)。

理想情况下,为了满足[1]中提出的用例(通过反转“remote-ip-prefix”的使用来实现),运营商应该能够基于 local-ip-prefix 和 remote-ip-prefix 创建规则。

提议的变更

正如在批准了本规范的 RFE [2] 的 Neutron 驱动程序计量中讨论的那样,我们将弃用 Neutron 计量 API 的 remote-ip-prefix 参数。

因此,我们将在此规范中在 Neutron 计量规则 API 中引入两个新参数。这两个新参数将分别称为“source_ip_prefix”和“destination_ip_prefix”(类似于 IPtables)。“remote_ip_prefix”的行为将保持不变,但我们将修复其文档并在未来的版本中将其标记为删除 [1]

“source_ip_prefix”和“destination_ip_prefix”可以一起使用,或者只定义其中一个。但是,计量规则必须始终定义至少一个(source_ip_prefix 或 destination_ip_prefix)。另一方面,这两个新参数不允许与“remote_ip_prefix”一起使用。

API JSON

“v2.0/metering/metering-label-rules”端点的当前 JSON

{
  "remote_ip_prefix": "192.168.0.14/32",
  "direction": "egress",
  "metering_label_id": "9ffd6512-9d2a-4dd2-9657-6a605126264d",
  "id": "f1694467-d866-4d8e-a8dc-18da516caedc",
  "excluded": false
}

添加新属性

{
  "source_ip_prefix": "192.168.0.14/32",
  "destination_ip_prefix": "0.0.0.0/0",
  "direction": "egress",
  "metering_label_id": "9ffd6512-9d2a-4dd2-9657-6a605126264d",
  "id": "f1694467-d866-4d8e-a8dc-18da516caedc",
  "excluded": false
}

数据库表更改

当前,表“meteringlabelrules”定义如下

+-------------------+--------------------------+------+-----+---------+-------+
| Field             | Type                     | Null | Key | Default | Extra |
+-------------------+--------------------------+------+-----+---------+-------+
| id                | varchar(36)              | NO   | PRI | NULL    |       |
| direction         | enum('ingress','egress') | YES  |     | NULL    |       |
| remote_ip_prefix  | varchar(64)              | YES  |     | NULL    |       |
| metering_label_id | varchar(36)              | NO   | MUL | NULL    |       |
| excluded          | tinyint(1)               | YES  |     | 0       |       |
+-------------------+--------------------------+------+-----+---------+-------+

我们将向其中添加两个新字段。因此,它将如下所示

+-----------------------+--------------------------+------+-----+---------+-------+
| Field                 | Type                     | Null | Key | Default | Extra |
+-----------------------+--------------------------+------+-----+---------+-------+
| id                    | varchar(36)              | NO   | PRI | NULL    |       |
| direction             | enum('ingress','egress') | YES  |     | NULL    |       |
| remote_ip_prefix      | varchar(64)              | YES  |     | NULL    |       |
| source_ip_prefix      | varchar(64)              | YES  |     | NULL    |       |
| destination_ip_prefix | varchar(64)              | YES  |     | NULL    |       |
| metering_label_id     | varchar(36)              | NO   | MUL | NULL    |       |
| excluded              | tinyint(1)               | YES  |     | 0       |       |
+-----------------------+--------------------------+------+-----+---------+-------+

Neutron 计量代理程序变更

计量代理程序中的 IPtables 驱动程序需要正确处理新的参数“source_ip_prefix”和“destination_ip_prefix”。在构建 IPtable 规则时,如果定义了“destination_ip_prefix”参数,将使用选项“-d”(IPtables 选项)。另一方面,如果定义了“source_ip_prefix”参数,将使用选项“-s”(IPtables 选项)。

验证

为了简化验证,我们建议删除新字段的重叠 IP_prefixes 验证(对于远程 IP 前缀,将保持不变)。删除背后的原因是,如果运营商想以某种方式创建重叠的规则,我们不应该阻止他们(可能存在需要它的业务逻辑)。

我们将实施以下验证:* 源 IP 前缀必须是有效的 IPv4 CIDR * 目标 IP 前缀必须是有效的 IPv4 CIDR * 每个计量标签规则都需要至少提供源、目标或远程 IP 前缀。远程 IP 前缀已被标记为已弃用。因此,一旦将其删除,用户将不得不输入至少源或目标 IP 前缀。也可以同时使用两者(源和目标 IP 前缀)来构建规则。* 源和目标 IP 前缀不能与远程 IP 前缀一起使用。

API 影响

将引入两个新参数,但它们不是必需的。因此,使用它们的人不会立即受到影响。但是,当删除“remote_ip_prefix”时,人们可能会遇到问题。因此,一旦提供使用新方法构建规则的方法,人们将被鼓励使用它,而不是“remote_ip_prefix”计量规则库。

负责人

主要负责人

其他贡献者

工作项

以下是计划发布的工作项。

  1. 弃用远程 IP 前缀 (Neutron-lib)

  • 弃用远程 IP 前缀

  • 修复文档

  1. 添加源和目标属性 (Neutron-lib) – 通过 [3] 执行

  • 在 api/definitions/metering.py 中添加新属性

  • 修复示例和文档的 JSON

  1. 弃用远程 IP 前缀 (Neutron)

  • 弃用远程 IP 前缀

  • 修复文档

  • 当人们使用它时记录警告

  1. 更改 Neutron 和 Neutron 计量代理程序中的执行流程以使用新字段。(Neutron)

  • 在 objects.metering.MeteringLabelRule 和 neutron/db/models/metering.MeteringLabelRule 中添加新的 DB 字段

  • neutron/db/migration/alembic_migrations/versions/victoria 中的 DB 脚本

  • 实际实现以使用新属性,以及单元测试

  • 使用新字段更新 API 的文档

  1. 弃用远程 IP 前缀 (OpenStack SDK)

  • 弃用远程 IP 前缀

  • 修复文档

  • 当人们使用它时记录警告

  1. 弃用远程 IP 前缀 (OpenStack python 客户端)

  • 弃用远程 IP 前缀

  • 修复文档

  • 当人们使用它时记录警告

  1. 添加新字段 (OpenStack SDK)

  • 添加新字段

  • 修复文档

  1. 添加新字段 (OpenStack python 客户端)

  • 添加新字段

  • 修复文档

在完成所有这些项目后,在未来的版本中,我们需要执行以下删除项目。

  1. 删除远程 IP 前缀 (Neutron-lib)

  • 修复示例和文档的 JSON

  1. 删除远程 IP 前缀 (Neutron)

  • 修复文档

  1. 删除远程 IP 前缀 (OpenStack SDK)

  • 修复文档

  1. 删除远程 IP 前缀 (OpenStack python 客户端)

  • 修复文档

依赖项

参考资料