允许指定路由器外部 IP 地址

https://blueprints.launchpad.net/neutron/+spec/specify-router-ext-ip

目前没有办法指定路由器在其外部端口上使用的 IP 地址。此蓝图允许设置外部 IP,并且默认情况下该操作仅限于管理员权限。

该规范最初已获得 Juno 的批准,但是由于时间限制以及与周期末期正在进行的所有 DVR 工作冲突,代码在截止日期前被简化为只读版本。

完成这项工作所需的剩余代码已经完成并经过了多次审查。[1] 它影响大约 100 行 L3 代码,因此占用的空间很小,并且不应需要审查者付出太多的额外精力来合并。

问题描述

当前的路由器 API 不允许对路由器对象上的外部接口分配的 IP 地址进行任何控制。这使得在租户路由器必须分配一个具有特殊处理的、在提供商网络上具有已知地址的场景下变得困难。

或者,即使地址最初是随机分配的,也没有办法删除路由器、将其移动到另一个项目,并保留先前分配的地址。

提议的变更

允许在传递给 router_update 的 external_gateway_info 中指定路由器的外部 IP。默认情况下,这将由 policy.json 限制为仅管理员操作。

格式将采用标准 fixed_ips 格式,该格式用于指定普通端口的 IP 地址,因此它提供了指定 subnet_id 而不是直接指定 IP 的灵活性。

请求的地址可以是在与外部网络关联的任何子网内的任何地址,但不能是网关地址。它们不受分配池范围的影响。

如果地址已被使用,API 将返回冲突错误 (HTTP 409)。

备选方案

N/A

数据模型影响

N/A

REST API 影响

‘external_fixed_ips’ 是 ‘external_gateway_info’ 下的一个字段,包含路由器接口的外部 IP 地址。由于先前允许读取地址的部分实现,该字段已存在于当前的 API 中。唯一的区别是该字段现在可以由管理员(或 policy.json 中定义的具有权限的其他用户)更新。

属性名称

类型

访问

默认值

验证/转换

描述

external_fixed_ips

端口的 fixed_ip 格式

只读,所有者读写,管理员

生成

与普通端口的 fixed_ips 字段验证相同。

外部 IP 地址

目前只能指定一个固定的 IP,但如果路由器支持多个外部 IP,则将来可能会进行调整。

安全影响

如果默认 policy.json 未经修改,则不适用。如果对其进行修改以允许所有用户设置 IP,则普通用户将被允许忽略外部子网上定义的分配范围。

通知影响

N/A

IPv6 影响

IP 验证将使用与任何端口 IP 地址相同的验证,因此此更改应与 IPv6 兼容。

其他最终用户影响

N/A

性能影响

N/A

其他部署者影响

N/A

开发人员影响

N/A

社区影响

社区将欣喜若狂,因为如此惊人的功能甚至有可能实现,更不用说在软件中实现了。

实现

负责人

kevinbenton

工作项

  • 对 L3 数据库代码、API 和策略进行更改。

  • 更新 neutronclient

依赖项

N/A

测试

Tempest 测试

N/A

功能测试

N/A

API 测试

单元测试应该足够,因为 IP 地址分配之外不会有任何新的行为,而 IP 地址分配在 neutron 代码中得到了很好的控制。

文档影响

用户文档

指示租户可以看到其路由器的外部 IP,并且管理员可以指定路由器 IP。

开发人员文档

需要更新开发人员 API 文档,以指示现在可以设置外部路由器 IP。

参考资料

  1. https://review.openstack.org/#/c/83664/

相关 bug

https://bugs.launchpad.net/neutron/+bug/1255142

https://bugs.launchpad.net/neutron/+bug/1188427