FWaaS 路由器插入模型

https://blueprints.launchpad.net/neutron/+spec/fwaas-router-insertion

该蓝图提出修改 FWaaS 插入模型,将防火墙与指定的路由器集合(可以是一个路由器)关联起来,而不是当前与租户中的所有路由器关联的模型。

问题描述

FWaaS 模型定义了 3 种资源:防火墙规则、防火墙策略和防火墙。防火墙规则具有指定过滤规则的属性。防火墙策略是规则集合的容器。防火墙本身与防火墙策略相关联,从而间接与一组规则相关联。目前无法定义防火墙的插入点,也没有将插入从服务本身抽象化的意图,以便支持各种类型的插入点(L3、Bump in the wire 等)。

FWaaS 参考实现将防火墙插入到租户中所有路由器的所有 ‘qr-’ 接口上。计划允许插入点由服务插入提案 [1][2] 驱动。鉴于服务插入提案由于各种原因尚未被采用,这项工作的目标是限制范围到 FWaaS 以及在指定的路由器集合上进行插入。

在当前模型和实现中,我们只能支持租户中的单个防火墙,因为防火墙存在于所有路由器上。这无法提供选择性地为租户拓扑中的子网或一组子网络防火墙流量的能力。这要求将租户拓扑的所有规则都收集到与防火墙关联的策略中。这既效率低下又容易出错。

防火墙数据库中没有跟踪路由器,因此根据与防火墙关联的潜在多个路由器中的一个路由器的状态转换来反映防火墙状态并不总是直接的。我们可以处理添加新路由器的情况,但处理路由器删除的情况则更为复杂。

提议的变更

提议将防火墙与 API 中指定的路由器集合关联起来。插件可以执行资源验证并采取适当的操作。插入点将作为路由器(们)在防火墙数据库中跟踪。

怀着一丝担忧,可以将此附加属性作为扩展提出,也可以将其作为防火墙扩展的属性添加。考虑到该领域的重构,这项工作将与社区方向保持一致。

基于与 FWaaS 子团队成员以及与客户和部署者互动的相关人员的讨论,更倾向于具有相同基本意图的变体,即防火墙与一组路由器关联。而不是仅仅关联一组路由器并隐式地在所有接口上关联,还提出了一种选择性地应用于路由器上指定接口集合的选项,作为实现阶段 2。这可以支持可能需要防火墙与端口列表关联的后端。默认行为是在路由器(们)的所有接口上应用。

有了这个主题的变体,除了路由器之外的接口列表也将作为防火墙扩展的属性或作为扩展提出。

通过此更改,我们可以在租户中支持多个防火墙,并基于路由器插入点进行更好的区分,而不是将整个拓扑的所有规则都应用于所有位置。将强制执行端口是单个防火墙的成员的约束,以确保一致的行为。因此,默认情况下在路由器的所有接口上应用 - 该约束意味着路由器只能容纳单个防火墙。使用端口列表,应用于路由器接口的子集,我们也可以支持路由器上的多个防火墙。

数据模型影响

提议将防火墙与在创建或更新工作流程中提供的路由器列表关联起来。将应用适当的外键约束。

属性名称

类型

必需

CRUD

描述

fwid

uuid

R

防火墙 ID

router_ids

list

CRU

关联的路由器

端口 ID 列表属性将在实现阶段 2 中添加到上述模型中。

数据库迁移:当前实现将防火墙安装到租户中的所有路由器上。路由器未在防火墙数据库中跟踪。升级时,作为迁移的一部分,提议将租户中的每个路由器都添加为与防火墙关联的路由器,如新的数据模型所示。不支持降级。

REST API 影响

这将添加到防火墙资源中。如前所述,将采用与扩展重构一致的方法。第一阶段添加对路由器的支持。

RESOURCE_ATTRIBUTE_MAP = {
  'firewalls': {
      'router_ids': {'allow_post': True, 'allow_put': True,
                    'validate': {'type:uuid_list': None},
                    'is_visible': True},
  }
}

目标第二阶段的端口列表。

RESOURCE_ATTRIBUTE_MAP = {
  'firewalls': {
      'router_ports': {'allow_post': True, 'allow_put': True,
                         'validate': {'type:uuid_list': None},
                         'convert_to': attr.convert_none_to_empty_list,
                         'default': None, 'is_visible': True},
  }
}

安全影响

无。

通知影响

FWaaS 代理不需要像当前模型那样消耗所有 router_add 事件。不计划对任何消息传递进行更改。

其他最终用户影响

在当前模型中,FWaaS 没有指定任何插入点。提议模型中的 API 将容纳一组路由器作为附加属性。与当前模型一样,防火墙状态将从 PENDING_CREATE(或 DVR 模式下的 CREATED)开始,并在与 FWaaS 代理和 iptables 后端成功消息传递后变为 ACTIVE。以下是 CLI 表示的一些可能建议。

neutron firewall-create FW-POLICY –router <r1> –router <r2>

neutron firewall-create FW-POLICY –routers “<r1> <r2> … <rm>”

这隐式地将防火墙安装到每个指定路由器的所有内部接口上。

如果未在 firewall-create 上指定此新属性,则将创建防火墙逻辑资源,并处于 PENDING_CREATE(或 DVR 模式下的 CREATED)状态。这使得防火墙资源创建与路由器创建分离。这可以支持一种场景,即防火墙可以预先配置,稍后可以绑定到可以在租户网络上稍后创建的特定路由器。

这类似于当前模型中租户中没有路由器的情况。有了这个提议,防火墙状态将在包含插入点详细信息的 firewall-update 上更改为 ACTIVE。以下是 CLI 表示的一个可能建议。

neutron firewall-update FIREWALL –router <r1> –router <r2>

在第二阶段,使用附加的端口列表属性,创建将如下所示

neutron firewall-create

FW-POLICY –router <r1> –router <r2> –port-id <p1> –port-id <p2> …

neutron firewall-create

FW-POLICY –routers “<r1> <r2> … <rm>” –port-ids “<p1> <p2> … <pn>”

端口列表在更新工作流程中也是可选的。如果未提供,则防火墙将应用于路由器的所有内部接口。当提供端口列表时,它将应用于映射到相应路由器的那些内部接口。这与创建工作流程相同。

更新工作流程还将支持更新 ACTIVE 防火墙上的路由器和/或端口列表。所有更新都通过正确验证端口、路由器以及路由器与端口的所有权来完成。可以如下表示:

neutron firewall-update FIREWALL

–router <r1> –router <r2> –port-id <p1> –port-id <p2> …

性能影响

无。

IPv6 影响

没有影响。

其他部署者影响

通过支持迁移,升级将通过迁移到新的数据模型来处理。

开发人员影响

任何依赖于防火墙安装在租户中的所有路由器上并直接基于参考实现的插件都需要进行更改。此模型已在 FWaaS IRC 中提出,并已与 FWaaS 开发人员联系。没有注意到重大影响。本规范还旨在解决任何疑虑。

社区影响

过去曾讨论过此更改,并尝试通过服务插入蓝图来解决此问题。FWaaS 子团队内部讨论了解决此问题的必要性。这在最近的峰会上由 Mark 提出,并与其他核心成员讨论。FWaaS 子团队在峰会期间讨论了一些关于方法细节的问题,并在 FWaaS IRC 上继续讨论。

备选方案

  • 再次查看早期服务插入提案之一。[1][2]

实现

第一阶段将针对在指定的路由器上应用。添加指定端口列表的选项将在之后进行分阶段处理。

负责人

skandasw

工作项

阶段 1 * 重构插件以适应新的路由器属性。 * 数据库更改以关联防火墙的路由器。 * 升级时的迁移更改。 * 代理交互更改到包含路由器的消息传递字典。 * 重构 FW 代理,以处理指定的路由器并删除处理新路由器的功能。

阶段 2(低优先级) * 如上所述,重构额外的端口列表属性。 * 路由器上端口的验证逻辑以及路由器上的多个防火墙。 * 代理更改到接口属性的消息传递。 * 重构 iptables 驱动程序以支持过滤规则中的特定接口。

依赖项

没有直接依赖关系,但随着服务的独立,L3 代理重构可能会导致一些问题。但可以看出,其中一些可以互补。

测试

Tempest 测试

现有的 tempest 测试将被修改以添加额外的属性。

功能测试

基本功能没有改变,因此对功能测试的更改将只是涉及添加指定新的插入点属性。

API 测试

更改以添加新的属性。

文档影响

用户文档

用户文档将更新以包含新的属性以及工作流程中的次要更改,其中现在需要指定插入点。

开发人员文档

将记录 API 更改。

参考资料

[1]https://blueprints.launchpad.net/neutron/+spec/neutron-services-insertion-chaining-steering [2]https://blueprints.launchpad.net/neutron/+spec/service-base-class-and-insertion