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 的后端数据库表。
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
地址组对象的唯一标识符。 |
name |
字符串 |
否 |
CRU |
地址组的人性化名称(限制为 255 个字符)。 不必唯一。 |
description |
字符串 |
否 |
CRU |
地址组的人性化描述(限制为 255 个字符)。 |
project_id |
uuid-str |
是 |
CR |
地址组的所有者。 只有管理员用户才能指定与其自身不同的项目标识符。 |
属性 |
类型 |
必需 |
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