支持 IPv6 的路由器通告守护进程 (radvd)¶
Launchpad蓝图
https://blueprints.launchpad.net/neutron/+spec/neutron-ipv6-radvd-ra
为 Neutron 添加 radvd 支持,并将其用作 IPv6 路由器通告和 SLAAC 的首选参考实现。[RADVD] 是一个开源软件,它使用 NDP 实现 IPv6 路由器地址和 IPv6 路由前缀的通告。
问题描述¶
路由器通告 (RAs) 是 IPv6 邻居发现标准 [RFC_4861] 的基本组成部分。如果没有 radvd,Neutron 将需要依赖 dnsmasq 来实现 RA 功能,而 dnsmasq 存在许多缺点
对于 DHCP,dnsmasq 进程在它自己的 (dhcp) 命名空间中运行。对于 RAs,我们需要在路由器命名空间中运行额外的 dnsmasq 进程。由于我们不想更改当前的 DHCP 功能,我们必须禁用在路由器命名空间中运行的 dnsmasq 进程的前缀委托。这将导致大量的开销和扩展问题。
dnsmasq 不支持单播 RAs。单播 RAs 是一项有用的功能。例如,当默认分配是唯一本地地址 (ULA) 时,它们可用于为特定的端点提供互联网访问。
某些发行版中包含的旧版本 dnsmasq 具有不足的 IPv6 支持。
本提案旨在涵盖宣布 RAs,并提供 ipv6_ra_mode 属性请求的通告信息。
提议的变更¶
如果启用了 IPv6,则在每个路由器的命名空间中启动一个 radvd 进程。启用 Neutron L3 代理以支持 radvd 配置和更新。
L3 代理将被更新以支持基于与路由器关联的子网的属性的 radvd 配置。由于 radvd 由配置文件配置,L3 代理将为每个路由器命名空间维护一个单独的配置文件。当配置更改时,需要重新启动 radvd 进程。
当删除子网时,需要更新关联的 radvd 配置,以便不再通告该前缀。L3 代理将修改配置文件并重新启动 radvd 进程。
某些 radvd 设置会影响 DHCP 的配置。DHCP 代理将被更新以处理子网属性并配置 dnsmasq,使其与 radvd 的配置方式兼容。
在首次实现中,将为一些 radvd 设置(如 RA 间隔和生存时间)选择合理默认值。可以提交后续错误或功能请求以添加 Neutron 配置选项以进行 radvd 设置。
备选方案¶
我们可以使用 dnsmasq 来支持 RA 和 SLAAC。缺点在 问题描述 部分中说明。
数据模型影响¶
无。
REST API 影响¶
API 没有更改,但用户/管理员应该知道如何使用两个 IPv6 地址属性 [TWO_MODE] 来配置 IPv6 地址的子网。
ipv6 ra 模式 |
ipv6 地址模式 |
radvd A,M,O |
描述 |
|---|---|---|---|
N/S |
N/S |
关闭 |
VM 基于网络上的非 OpenStack 服务获取 IPv6 地址,或者仅创建一个链路本地地址(不由 OpenStack 产生)。 |
N/S |
slaac |
关闭 |
VM 使用 SLAAC 从外部路由器获取 IPv6 地址 |
N/S |
dhcpv6- 有状态 |
关闭 |
VM 使用 DHCPv6 有状态从 dnsmasq 获取 IPv6 地址和可选信息 |
N/S |
dhcpv6- 无状态 |
关闭 |
VM 使用 SLAAC 从外部路由器获取 IPv6 地址,并使用 DHCPv6 无状态从 dnsmasq 获取可选信息 |
slaac |
N/S |
1,0,0 |
VM 使用 radvd 使用 SLAAC 获取 IPv6 地址 |
dhcpv6- 有状态 |
N/S |
0,1,1 |
VM 使用 DHCPv6 有状态从外部 DHCPv6 服务器获取 IPv6 地址和可选信息 |
dhcpv6- 无状态 |
N/S |
1,0,1 |
VM 使用 radvd 使用 SLAAC 获取 IPv6 地址,并使用 DHCPv6 无状态从外部 DHCPv6 服务器获取可选信息 |
slaac |
slaac |
1,0,0 |
VM 使用 OpenStack radvd 使用 SLAAC 获取 IPv6 地址 |
dhcpv6- 有状态 |
dhcpv6- 有状态 |
0,1,1 |
VM 使用 dnsmasq 使用 DHCPv6 有状态获取 IPv6 地址,并使用 dnsmasq 使用 DHCPv6 有状态获取可选信息 |
dhcpv6- 无状态 |
dhcpv6- 无状态 |
1,0,1 |
VM 使用 radvd 使用 SLAAC 获取 IPv6 地址,并使用 dnsmasq 使用 DHCPv6 无状态获取可选信息 |
slaac |
dhcpv6- 有状态 |
无效组合 |
|
slaac |
dhcpv6- 无状态 |
无效组合 |
|
dhcpv6- 有状态 |
slaac |
无效组合 |
|
dhcpv6- 有状态 |
dhcpv6- 无状态 |
无效组合 |
|
dhcpv6- 无状态 |
slaac |
无效组合 |
|
dhcpv6- 无状态 |
dhcpv6- 有状态 |
无效组合 |
N/S = 未指定
安全影响¶
radvd 本身没有安全影响,但需要注意的是,IPv6 接口的安全组默认设置允许来自 Neutron 路由器和/或子网默认网关的 RAs。
通知影响¶
无。
其他最终用户影响¶
CLI 更改?
性能影响¶
此更改引入了每个路由器命名空间的一个 radvd 实例,该实例由 neutron 创建。当接口添加到或从命名空间中添加或删除时,radvd 实例可能会加载新的配置数据。预计不会出现明显的系统性能下降。
其他部署者影响¶
安装 radvd
配置选项
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
<gessau> Henry Gessau
- 其他贡献者
<anthony-veiga> Anthony Veiga
<baoli> Robert Li
<leblancd> Dane Leblanc
<scollins> Sean Collins
工作项¶
L3 代理
dhcp 代理
依赖项¶
IPv6 两个属性 [BP_2ATTR]。
网关地址更改时更新 SG [PV_SG_RA]。
合并 L3 代理? [BP_CONSL3]
radvd 包 [RADVD]
注意:对于每个启用了 SLAAC 的子网,Neutron L3 代理需要检测或预测每个主机生成的特定 IPv6 地址。请注意,对于 OpenStack 中 IPv6 的初始发布,使用 [BP_PV_SLAAC] 中的更改集添加了预测或派生每个 SLAAC 生成地址的能力。该算法假定用于形成地址的接口 ID 使用 EUI-64 生成。
测试¶
完整的单元测试覆盖率。
研究添加功能测试的可行性。(目前不被认为是必需的。)
添加 tempest 测试,例如
针对每种模式的网络/子网创建的 API 测试(参见 [API_TESTS])
unspec/unspec,SLAAC/SLAAC,有状态/有状态,无状态/无状态
SLAAC/SLAAC、有状态/有状态、无状态/无状态的场景 ping 测试
文档影响¶
如何配置 IPv6 地址。Neutron 和特别是子网的概述。