Firewall as a Service API 2.0 地址组支持

Launchpad蓝图

此 bp 引入了对 Firewall as a Service(FWaaS) API 2.0 的增强,以支持地址组。 此功能已在 fwaas-api-2.0 中提出,但尚未实现。

问题描述

在实际使用防火墙组时,每个 IP 或子网都需要一个对应的防火墙规则。 当存在大量实例时,会生成大量的防火墙规则,难以维护和管理。

提议的变更

向防火墙组添加地址组功能。 通过将多个地址对象聚合到地址组中,并使用地址组代替原始 cidr 生成防火墙规则,可以有效地减少防火墙规则的数量。

REST API 影响

Firewall 地址组

属性

类型

必需

CRUD

描述

id

uuid-str

N/A

R

地址组对象的唯一标识符。

name

字符串

CRU

地址组的人性化名称(限制为 255 个字符)。 不必唯一。

description

字符串

CRU

地址组的人性化描述(限制为 255 个字符)。

project_id

uuid-str

CR

地址组的所有者。 只有管理员用户才能指定与其自身不同的项目标识符。

addresses

列表

CRU

地址和 IP 版本键值对的数组。 它支持 CIDR 和 IP 范围对象。 CIDR 和 IP 范围对象的属性:“address”: <CIDR 或 IP 范围> “ip_version”: 4 或 6(整数值) addresses 的示例:[{“address”: “132.168.4.12/24”, “ip_version”: 4}]


Firewall 规则

请注意,与 FWaaS 1.0 一样,在 FWaaS 2.0 中,防火墙规则始终使用有状态的连接跟踪。

属性

类型

必需

CRUD

描述

id

uuid-str

N/A

R

防火墙规则对象的唯一标识符。

project_id

uuid-str

CR

防火墙规则的所有者。 只有管理员用户才能指定与其自身不同的项目标识符。

name

字符串

CRU

防火墙规则的人性化名称(限制为 255 个字符)。 不必唯一。

description

字符串

CRU

防火墙规则的人性化描述(限制为 255 个字符)。

共享

Bool

CRU

当设置为 True 时,此防火墙规则对其他项目可见,并且可用于不由其项目拥有的防火墙策略。

protocol

字符串

CRU

IP 协议。

source_port

port-range

CRU

源端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。

destination_port

port-range

CRU

目标端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。

ip_version

Integer

CRU

IP 协议版本。

source_ip_address

字符串

CRU

源 IP 地址或 CIDR。

destination_ip_address

字符串

CRU

目标 IP 地址或 CIDR。

source_address _group_ids

列表

CRU

这是源地址组的列表。 当指定它们时,如果数据包中的源 IP 地址与其中一个地址组中的一个 IP 地址匹配时,将进行匹配。

destination_address _group_ids

列表

CRU

这是目标地址组的列表。 当指定它们时,如果数据包中的目标 IP 地址与其中一个地址组中的一个 IP 地址匹配时,将进行匹配。

操作

字符串

CRU

对匹配规则执行的操作 (ALLOW, DENY, REJECT)。 默认值:DENY。

enabled

Bool

CRU

当设置为 False 时,将在防火墙策略中禁用此规则。 促进在不必将规则与防火墙策略分离的情况下选择性地关闭规则。 默认值:True。


注意:source_ip_address、source_address_group_ids 和 source_firewall_group_id 中最多只能指定一个。 当数据包中的源 IP 地址与以下任何一个匹配时,规则将匹配:source_ip_address、地址组中的一个 IP 地址或防火墙组中的一个端口的 IP 地址。 如果要使其匹配任何数据包,请将源或目标设置为 0.0.0.0/0 或 ::/0。 同样适用于 destination_ip_address、destination_address_group_ids 和 destination _firewall_group_id,相对于数据包中的目标 IP 地址。

列出地址组

列出地址组。

请求类型

GET

端点

/v2.0/fwaas/address_groups

响应代码

成功

200

Error

Unauthorized(401)


示例列出地址组:JSON 请求

GET /v2.0/fwaas/address_groups.json
User-Agent: python-neutronclient
Accept: application/json

示例列出地址组:JSON 响应

{
    "address_groups": [
        {
            "description": "",
            "id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
            "name": "ADDR_GP_1",
            "project_id": "45977fa2dbd7482098dd68d0d8970117",
            "addresses": [
               {"address": "132.168.4.12/24", "ip_version": 4},
               {"address": "132.168.5.12-132.168.5.24", "ip_version": 4},
               {"address": "2001::db8::f00/64", "ip_version": 6}
            ]
        }
    ]
}
显示地址组详细信息

显示地址组详细信息。

请求类型

GET

端点

/v2.0/fwaas/address_groups/<address_group_id>

响应代码

成功

200

Error

Unauthorized(401), Not Found (404)


示例显示地址组:JSON 请求

GET /v2.0/fwaas/address_groups/8722e0e0-9cc9-4490-9660-8c9a5732fbb0.json
User-Agent: python-neutronclient
Accept: application/json

示例显示地址组:JSON 响应

{
   "address_group": {
        "description": "",
        "id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
        "name": "ADDR_GP_1",
        "project_id": "45977fa2dbd7482098dd68d0d8970117",
        "addresses": [
           {"address": "132.168.4.12/24", "ip_version": 4},
           {"address": "132.168.5.12-132.168.5.24", "ip_version": 4},
           {"address": "2001::db8::f00/64", "ip_version": 6}
        ]
    }
}
创建地址组

创建地址组。

请求类型

POST

端点

/v2.0/fwaas/address_groups/

响应代码

成功

201

Error

Unauthorized(401), Bad Request(400)


示例创建地址组:JSON 请求

POST /v2.0/fwaas/address_groups.json
User-Agent: python-neutronclient
Accept: application/json
{
    "address_group": {
        "name": "ADDR_GP_1",
        "addresses": [
           {"address": "132.168.4.12/24", "ip_version": 4},
           {"address": "132.168.5.12-132.168.5.24", "ip_version": 4},
           {"address": "2001::db8::f00/64", "ip_version": 6}
        ]
    }
}

示例创建地址组:JSON 响应

HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
{
   "address_group": {
        "description": "",
        "id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
        "name": "ADDR_GP_1",
        "project_id": "45977fa2dbd7482098dd68d0d8970117",
        "addresses": [
           {"address": "132.168.4.12/24", "ip_version": 4},
           {"address": "132.168.5.12-132.168.5.24", "ip_version": 4},
           {"address": "2001::db8::f00/64", "ip_version": 6}
        ]
    }
}
更新地址组

更新地址组。

请求类型

PUT

端点

/v2.0/fwaas/address_groups/<address_group_id>

响应代码

成功

200

Error

Unauthorized(401), Bad Request(400) Not Found(404)


示例更新地址组:JSON 请求

PUT /v2.0/fwaas/address_groups/8722e0e0-9cc9-4490-9660-8c9a5732fbb0.json
User-Agent: python-neutronclient
Accept: application/json
{
    "address_group": {
        "addresses": [
           {"address": "132.168.4.12/24", "ip_version": 4},
           {"address": "132.168.5.12-132.168.5.24", "ip_version": 4},
           {"address": "2001::db8::f00/64", "ip_version": 6}
        ]
    }
}

示例更新地址组:JSON 响应

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
   "address_group": {
        "description": "",
        "id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
        "name": "ADDR_GP_1",
        "project_id": "45977fa2dbd7482098dd68d0d8970117",
        "addresses": [
           {"address": "132.168.4.12/24", "ip_version": 4},
           {"address": "132.168.5.12-132.168.5.24", "ip_version": 4},
           {"address": "2001::db8::f00/64", "ip_version": 6}
        ]
    }
}
删除地址组

删除地址组。

此操作不返回响应体。

请求类型

DELETE

端点

/v2.0/fwaas/address_groups/<address_group_id>

响应代码

成功

204

Error

Unauthorized(401), Not Found(404) Conflict(409) 当在地址组使用时执行操作时,将返回 Conflict 错误响应。


示例删除地址组:JSON 请求

DELETE /v2.0/fwaas/address_groups/8722e0e0-9cc9-4490-9660-8c9a5732fbb0.json
User-Agent: python-neutronclient
Accept: application/json

示例删除地址组:JSON 响应

HTTP/1.1 204 No Content
Content-Length: 0
列出防火墙规则

列出防火墙规则。

请求类型

GET

端点

/v2.0/fwaas/firewall_rules

响应代码

成功

200

Error

Unauthorized(401)


示例列出防火墙规则:JSON 请求

GET /v2.0/fwaas/firewall_rules.json
User-Agent: python-neutronclient
Accept: application/json

示例列出防火墙规则:JSON 响应

{
    "firewall_rules": [
        {
            "action": "ALLOW",
            "description": "",
            "enabled": true,
            "firewall_policy_id": "56632e51-d2aa-4b79-9fd4-45f51088c4ed",
            "id": "9faaf49f-dd89-4e39-a8c6-101839aa49bc",
            "name": "ALLOW_HTTP",
            "position": 1,
            "shared": false,
            "protocol": "tcp",
            "source_port": null,
            "destination_port": "80",
            "ip_version": 4,
            "source_ip_address": null,
            "destination_ip_address": null
            "source_address_group_ids": [],
            "destination_address_group_ids": ["8315762a-f0ae-4f6b-981a-a16a6c3103c2"],
            "project_id": "45977fa2dbd7482098dd68d0d8970117"
        }
    ]
}
显示防火墙规则详细信息

显示防火墙规则详细信息。

请求类型

GET

端点

/v2.0/fwaas/firewall_rules/<firewall_rule_id>

响应代码

成功

200

Error

Unauthorized(401), Not Found (404)


示例显示防火墙规则:JSON 请求

GET /v2.0/fwaas/firewall_rules/9faaf49f-dd89-4e39-a8c6-101839aa49bc.json
User-Agent: python-neutronclient
Accept: application/json

示例显示防火墙规则:JSON 响应

{
    "firewall_rule": {
        "action": "ALLOW",
        "description": "",
        "enabled": true,
        "firewall_policy_id": "56632e51-d2aa-4b79-9fd4-45f51088c4ed",
        "id": "9faaf49f-dd89-4e39-a8c6-101839aa49bc",
        "name": "ALLOW_HTTP",
        "position": 1,
        "shared": false,
        "protocol": "tcp",
        "source_port": null,
        "destination_port": "80",
        "ip_version": 4,
        "source_ip_address": null,
        "destination_ip_address": null,
        "source_address_group_ids": [],
        "destination_address_group_ids": ["8315762a-f0ae-4f6b-981a-a16a6c3103c2"],
        "project_id": "45977fa2dbd7482098dd68d0d8970117"
    }
}
创建防火墙规则

创建防火墙规则。

请求类型

POST

端点

/v2.0/fwaas/firewall_rules/

响应代码

成功

201

Error

Unauthorized(401), Bad Request(400)


示例创建防火墙规则:JSON 请求

POST /v2.0/fwaas/firewall_rules.json
User-Agent: python-neutronclient
Accept: application/json
{
    "firewall_rule": {
        "action": "ALLOW",
        "enabled": true,
        "name": "ALLOW_HTTP",
        "protocol": "tcp",
        "source_port": null,
        "destination_port": "80",
        "source_ip_address": null,
        "destination_ip_address": null,
        "source_address_group_ids": [],
        "destination_address_group_ids": ["8315762a-f0ae-4f6b-981a-a16a6c3103c2"]
    }
}

示例创建防火墙规则:JSON 响应

HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
{
    "firewall_rule": {
        "action": "ALLOW",
        "description": "",
        "enabled": true,
        "firewall_policy_id": null,
        "id": "9faaf49f-dd89-4e39-a8c6-101839aa49bc",
        "name": "ALLOW_HTTP",
        "position": 1,
        "shared": false,
        "protocol": "tcp",
        "source_port": null,
        "destination_port": "80",
        "ip_version": 4,
        "source_ip_address": null,
        "destination_ip_address": null,
        "source_address_group_ids": [],
        "destination_address_group_ids": ["8315762a-f0ae-4f6b-981a-a16a6c3103c2"],
        "project_id": "45977fa2dbd7482098dd68d0d8970117"
    }
}
更新防火墙规则

更新防火墙规则。

请求类型

PUT

端点

/v2.0/fwaas/firewall_rules/<firewall_rule_id>

响应代码

成功

200

Error

Unauthorized(401), Bad Request(400) Not Found(404)


示例更新防火墙规则:JSON 请求

PUT /v2.0/fwaas/firewall_rules/9faaf49f-dd89-4e39-a8c6-101839aa49bc.json
User-Agent: python-neutronclient
Accept: application/json
{
    "firewall_rule": {
        "shared": "true"
    }
}

示例更新防火墙规则:JSON 响应

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
    "firewall_rule": {
        "action": "ALLOW",
        "description": "",
        "enabled": true,
        "firewall_policy_id": null,
        "id": "9faaf49f-dd89-4e39-a8c6-101839aa49bc",
        "name": "ALLOW_HTTP",
        "position": 1,
        "shared": true,
        "protocol": "tcp",
        "source_port": null,
        "destination_port": "80",
        "ip_version": 4,
        "source_ip_address": null,
        "destination_ip_address": null,
        "source_address_group_ids": [],
        "destination_address_group_ids": ["8315762a-f0ae-4f6b-981a-a16a6c3103c2"],
        "project_id": "45977fa2dbd7482098dd68d0d8970117"
    }
}

删除防火墙规则

删除防火墙规则。

此操作不返回响应体。

请求类型

DELETE

端点

/v2.0/fwaas/firewall_rules/<firewall_rule_id>

响应代码

成功

204

Error

Unauthorized(401), Not Found(404) Conflict(409) 当在防火墙规则使用时执行操作时,将返回 Conflict 错误响应。


示例删除防火墙规则:JSON 请求

DELETE /v2.0/fwaas/firewall_rules/9faaf49f-dd89-4e39-a8c6-101839aa49bc.json
User-Agent: python-neutronclient
Accept: application/json

示例删除防火墙规则:JSON 响应

HTTP/1.1 204 No Content
Content-Length: 0

数据模型影响

以下是上述 REST API 的后端数据库表。


Firewall 地址组

属性

类型

必需

CRUD

描述

id

uuid-str

N/A

R

地址组对象的唯一标识符。

name

字符串

CRU

地址组的人性化名称(限制为 255 个字符)。 不必唯一。

description

字符串

CRU

地址组的人性化描述(限制为 255 个字符)。

project_id

uuid-str

CR

地址组的所有者。 只有管理员用户才能指定与其自身不同的项目标识符。


Firewall 地址组地址关联

属性

类型

必需

CRUD

描述

id

uuid-str

N/A

R

地址组对象的唯一标识符。

firewall_address _group_id

uuid-str

CRU

防火墙地址组的 UUID。

address

字符串

CRU

必须与防火墙地址组关联的地址。

ip_version

Integer

CRU

地址的 IP 协议版本。


防火墙规则

属性

类型

必需

CRUD

描述

id

uuid-str

N/A

R

防火墙规则对象的唯一标识符。

project_id

uuid-str

CR

防火墙规则的所有者。 只有管理员用户才能指定与其自身不同的项目标识符。

name

字符串

CRU

防火墙规则的人性化名称(限制为 255 个字符)。 不必唯一。

description

字符串

CRU

防火墙规则的人性化描述(限制为 255 个字符)。

共享

Bool

CRU

当设置为 True 时,此防火墙规则对其他项目可见,并且可用于不由其项目拥有的防火墙策略。

protocol

字符串

CRU

IP 协议。

source_port

port-range

CRU

源端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。

destination_port

port-range

CRU

目标端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。

ip_version

Integer

CRU

IP 协议版本。

source_ip_address

字符串

CRU

源 IP 地址或 CIDR。

destination_ip_address

字符串

CRU

目标 IP 地址或 CIDR。

source_address _group_ids

列表

CRU

当指定 source_address_group 时,如果数据包中的源 IP 地址与地址组中的一个 IP 地址匹配时,将进行匹配。

destination_address _group_ids

列表

CRU

当指定 destination_address_group 时,如果数据包中的目标 IP 地址与地址组中的一个 IP 地址匹配时,将进行匹配。

操作

字符串

CRU

对匹配规则执行的操作 (ALLOW, DENY, REJECT)。 默认值:DENY。

enabled

Bool

CRU

当设置为 False 时,将在防火墙策略中禁用此规则。 促进在不必将规则与防火墙策略分离的情况下选择性地关闭规则。 默认值:True。


防火墙规则源地址组关联

属性

类型

必需

CRUD

描述

id

uuid-str

N/A

R

地址组对象的唯一标识符。

firewall_rule_id

uuid-str

CRU

防火墙规则的 UUID。

address_group_id

字符串

CRU

源地址组的 UUID。


防火墙规则目标地址组关联

属性

类型

必需

CRUD

描述

id

uuid-str

N/A

R

地址组对象的唯一标识符。

firewall_rule_id

uuid-str

CRU

防火墙规则的 UUID。

address_group_id

字符串

CRU

目标地址组的 UUID。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

IPv6 影响

无。

其他部署者影响

无。

开发人员影响

无。

社区影响

无。

备选方案

无。

实现

负责人

  • Wang Tao

工作项

  • REST API

  • DB Schema

  • FWaaS 插件更新

  • CLI 更新

  • L3 agent iptables 驱动程序

  • L2 agent ovs 驱动程序

  • FWaaS 仪表板

依赖项

测试

Tempest 测试

  • DB mixin 和模式测试

  • FWaaS 插件与模拟驱动程序端到端测试

  • Tempest 测试

  • CLI 测试

功能测试

  • 需要编写新的测试

API 测试

  • REST API 和属性验证测试

文档影响

用户文档

  • Neutron CLI 和 FWaaS API 文档需要修改。

开发人员文档

  • neutron-fwaas 仓库将有一个 devref,并将编写文档。

参考资料

[1] https://specs.openstack.org/openstack/neutron-specs/specs/newton/fwaas-api-2.0.html

[2] https://developer.openstack.org/api-ref/network/v2/#fwaas-v2-0-current-fwaas-firewall-groups-firewall-policies-firewall-rules