NDP Proxy

如果路由器上设置了 NDP 代理,它将被用于向外部路由器发布 IPv6 地址。其目的类似于浮动 IP,但它通过使用路由规则直接转发流量,且没有 NAT 操作。请阅读相关的 规范 以获取更多详细信息。

NDP 代理的配置

要配置 NDP 代理,请执行以下步骤

  • 在控制器节点上

    ndp_proxy 服务添加到 service_plugins 设置中,位于 [DEFAULT] 部分的 /etc/neutron/neutron.conf 文件中。例如

    [DEFAULT]
    service_plugins = router,ndp_proxy
    

    注意

    必须与 ndp_proxy 服务插件一起配置 router 服务插件。

  • 在网络节点或计算节点上(对于 dvr 模式路由器)

    extensions 选项设置为 [agent] 部分的 /etc/neutron/l3_agent.ini 文件中,以包含 ndp_proxy。这必须在运行 L3 代理的每个网络和计算节点上完成。例如

    extensions = ndp_proxy
    

注意

更新配置文件中的选项后,需要重新启动 neutron-server 和每个 neutron-l3-agent,以使新值生效。

配置 NDP 代理后,ndp-proxy 扩展别名将包含在以下命令的输出中

对于 API 扩展

$ openstack extension list --network

对于代理扩展

$ openstack network agent show <l3-agent-id>

注意

我们引入了一个新的命令 ndsend 用于 NDP 代理功能,该命令可以向 upstream 路由器发送关于 IPv6 的邻居通告。使用此命令,我们可以使 upstream 路由器快速感知内部 IPv6 地址的变化(例如,端口迁移到其他节点)。请阅读 手册页 以获取有关此命令的更多详细信息。

目前,您需要在每个 L3 代理节点上手动安装此命令。对于 Ubuntu,该命令由 vzctl pkg 提供,安装命令:sudo apt install vzctl

  • 在 upstream 路由器上(数据中心的物理路由器)

    通常,管理员应该计划一个或多个 IPv6 subnetpools 在启用 NDP 代理时使用,以便所有内部子网可以从单个集成的 subnetpool 分配。为了使 NDP 代理正常工作,管理员需要为这些 subnetpools 设置直接路由。

    例如,我们有一个 IPv6 subnetpool,其 CIDR 是 2001:db8::/96。应该设置如下直接路由

    2001:db8::/96 dev <ext-gw>
    

    其中 ext-gw 是云的外部网络的网关接口。

用户流程

将 IPv6 地址发布到外部网络(例如:公共网络)的基本步骤如下

注意

为了防止潜在的 安全风险,NDP 代理功能要求使用 IPv6 地址范围,以确保外部发布的 IPv6 地址的唯一性。

  1. 创建 IPv6 地址范围

    $ openstack address scope create test-ipv6-as --ip-version 6
    +------------+--------------------------------------+
    | Field      | Value                                |
    +------------+--------------------------------------+
    | id         | 24761ec5-b659-4358-b9ab-495ead15fa7a |
    | ip_version | 6                                    |
    | name       | test-ipv6-as                         |
    | project_id | bcb0c7a5338b4a46959e47971c58f0f1     |
    | shared     | False                                |
    +------------+--------------------------------------+
    
  2. 创建 IPv6 subnet pool

    $ openstack subnet pool create test-subnetpool --address-scope test-ipv6-as \
            --pool-prefix 2001:db8::/96 --default-prefix-length 112
    +-------------------+--------------------------------------+
    | Field             | Value                                |
    +-------------------+--------------------------------------+
    | address_scope_id  | 24761ec5-b659-4358-b9ab-495ead15fa7a |
    | created_at        | 2022-09-05T06:16:31Z                 |
    | default_prefixlen | 112                                  |
    | default_quota     | None                                 |
    | description       |                                      |
    | id                | 4af07f59-45b8-424d-98c5-35d20ba61526 |
    | ip_version        | 6                                    |
    | is_default        | False                                |
    | max_prefixlen     | 128                                  |
    | min_prefixlen     | 64                                   |
    | name              | test-subnetpool                      |
    | prefixes          | 2001:db8::/96                        |
    | project_id        | bcb0c7a5338b4a46959e47971c58f0f1     |
    | revision_number   | 0                                    |
    | shared            | False                                |
    | tags              |                                      |
    | updated_at        | 2022-01-01T06:42:08Z                 |
    +-------------------+--------------------------------------+
    
  3. 创建外部网络

    $ openstack network create --external --provider-network-type flat \
          --provider-physical-network public public
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2022-09-05T06:18:31Z                 |
    | description               |                                      |
    | dns_domain                | None                                 |
    | id                        | 98b0f468-7be0-4530-919d-c4d9417c3abf |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | is_default                | False                                |
    | is_vlan_transparent       | None                                 |
    | mtu                       | 1500                                 |
    | name                      | public                               |
    | port_security_enabled     | True                                 |
    | project_id                | bcb0c7a5338b4a46959e47971c58f0f1     |
    | provider:network_type     | flat                                 |
    | provider:physical_network | public                               |
    | provider:segmentation_id  | None                                 |
    | qos_policy_id             | None                                 |
    | revision_number           | 1                                    |
    | router:external           | External                             |
    | segments                  | None                                 |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      |                                      |
    | updated_at                | 2022-01-01T06:45:08Z                 |
    +---------------------------+--------------------------------------+
    
  4. 创建外部子网

    $ openstack subnet create --network public --subnet-pool test-subnetpool \
            --prefix-length 112 --ip-version 6 --no-dhcp ext-sub
     +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | allocation_pools     | 2001:db8::2-2001:db8::ffff           |
    | cidr                 | 2001:db8::/112                       |
    | created_at           | 2022-09-05T06:21:37Z                 |
    | description          |                                      |
    | dns_nameservers      |                                      |
    | dns_publish_fixed_ip | None                                 |
    | enable_dhcp          | False                                |
    | gateway_ip           | 2001:db8::1                          |
    | host_routes          |                                      |
    | id                   | ec11de28-9b84-4cee-b6a1-0ed56135bcd8 |
    | ip_version           | 6                                    |
    | ipv6_address_mode    | None                                 |
    | ipv6_ra_mode         | None                                 |
    | name                 | ext-sub                              |
    | network_id           | 98b0f468-7be0-4530-919d-c4d9417c3abf |
    | project_id           | bcb0c7a5338b4a46959e47971c58f0f1     |
    | revision_number      | 0                                    |
    | segment_id           | None                                 |
    | service_types        |                                      |
    | subnetpool_id        | 4af07f59-45b8-424d-98c5-35d20ba61526 |
    | tags                 |                                      |
    | updated_at           | 2022-01-01T06:47:08Z                 |
    +----------------------+--------------------------------------+
    
  5. 创建路由器

    $ openstack router create test-router
    +-------------------------+--------------------------------------+
    | Field                   | Value                                |
    +-------------------------+--------------------------------------+
    | admin_state_up          | UP                                   |
    | availability_zone_hints |                                      |
    | availability_zones      |                                      |
    | created_at              | 2022-01-01T06:50:44Z                 |
    | description             |                                      |
    | distributed             | False                                |
    | enable_ndp_proxy        | False                                |
    | external_gateway_info   | null                                 |
    | flavor_id               | None                                 |
    | ha                      | False                                |
    | id                      | 3aab8554-e5c4-4262-ab95-b92857c641de |
    | name                    | test-router                          |
    | project_id              | bcb0c7a5338b4a46959e47971c58f0f1     |
    | revision_number         | 1                                    |
    | routes                  |                                      |
    | status                  | ACTIVE                               |
    | tags                    |                                      |
    | updated_at              | 2022-01-01T06:50:44Z                 |
    +-------------------------+--------------------------------------+
    
  6. 为路由器设置外部网关

    $ openstack router set test-router --external-gateway public
    

    注意

    如果外部网络没有 IPv6 子网,并且在 neutron-l3-agent 上配置了 ipv6_gateway,您可能需要将 use_lla_address 设置为 True 在 /etc/neutron/neutron.conf,否则以下命令将引发 403 错误。

  7. 在路由器上启用 NDP 代理支持

    $ openstack router set test-router --enable-ndp-proxy
    

    警告

    如果您使用另一种方法(例如:BGP前缀委派 等)来发布内部 IPv6 地址,该命令将破坏数据平面流量。

  8. 创建内部网络和 IPv6 子网,并将子网添加到上述路由器

    $ openstack network create int-net
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2022-01-01T07:11:08Z                 |
    | description               |                                      |
    | dns_domain                | None                                 |
    | id                        | e527b38e-9e2a-439b-adf8-4ee1aa4f03b1 |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | is_default                | False                                |
    | is_vlan_transparent       | None                                 |
    | mtu                       | 1450                                 |
    | name                      | int-net                              |
    | port_security_enabled     | True                                 |
    | project_id                | bcb0c7a5338b4a46959e47971c58f0f1     |
    | provider:network_type     | vxlan                                |
    | provider:physical_network | None                                 |
    | provider:segmentation_id  | 575                                  |
    | qos_policy_id             | None                                 |
    | revision_number           | 1                                    |
    | router:external           | Internal                             |
    | segments                  | None                                 |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      |                                      |
    | updated_at                | 2022-01-01T07:11:08Z                 |
    +---------------------------+--------------------------------------+
    $ openstack subnet create --network int-net --subnet-pool test-subnetpool \
      --prefix-length 112 --ip-version 6 \
      --ipv6-ra-mode dhcpv6-stateful \
      --ipv6-address-mode dhcpv6-stateful int-sub
    +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | allocation_pools     | 2001:db8::1:2-2001:db8::1:ffff       |
    | cidr                 | 2001:db8::1:0/112                    |
    | created_at           | 2022-09-05T06:24:13Z                 |
    | description          |                                      |
    | dns_nameservers      |                                      |
    | dns_publish_fixed_ip | None                                 |
    | enable_dhcp          | True                                 |
    | gateway_ip           | 2001:db8::1:1                        |
    | host_routes          |                                      |
    | id                   | 9bcf194c-d44f-4e6f-90da-98510ddef283 |
    | ip_version           | 6                                    |
    | ipv6_address_mode    | dhcpv6-stateful                      |
    | ipv6_ra_mode         | dhcpv6-stateful                      |
    | name                 | int-sub                              |
    | network_id           | e527b38e-9e2a-439b-adf8-4ee1aa4f03b1 |
    | project_id           | bcb0c7a5338b4a46959e47971c58f0f1     |
    | revision_number      | 0                                    |
    | segment_id           | None                                 |
    | service_types        |                                      |
    | subnetpool_id        | 4af07f59-45b8-424d-98c5-35d20ba61526 |
    | tags                 |                                      |
    | updated_at           | 2022-01-02T08:20:26Z                 |
    +----------------------+--------------------------------------+
    $ openstack router add subnet test-router int-sub
    
  9. 启动实例

    $ openstack server create --flavor m1.tiny --image cirros-0.5.2-x86_64-disk --network int-net test-server
    +-------------------------------------+-----------------------------------------------------------------+
    | Field                               | Value                                                           |
    +-------------------------------------+-----------------------------------------------------------------+
    | OS-DCF:diskConfig                   | MANUAL                                                          |
    | OS-EXT-AZ:availability_zone         |                                                                 |
    | OS-EXT-SRV-ATTR:host                | None                                                            |
    | OS-EXT-SRV-ATTR:hypervisor_hostname | None                                                            |
    | OS-EXT-SRV-ATTR:instance_name       |                                                                 |
    | OS-EXT-STS:power_state              | NOSTATE                                                         |
    | OS-EXT-STS:task_state               | scheduling                                                      |
    | OS-EXT-STS:vm_state                 | building                                                        |
    | OS-SRV-USG:launched_at              | None                                                            |
    | OS-SRV-USG:terminated_at            | None                                                            |
    | accessIPv4                          |                                                                 |
    | accessIPv6                          |                                                                 |
    | addresses                           |                                                                 |
    | adminPass                           | 97UvRLgdFozR                                                    |
    | config_drive                        |                                                                 |
    | created                             | 2022-01-02T08:22:35Z                                            |
    | flavor                              | m1.tiny (1)                                                     |
    | hostId                              |                                                                 |
    | id                                  | 189a104c-36cd-479a-8702-8111eb34fdb6                            |
    | image                               | cirros-0.5.2-x86_64-disk (2b2d2975-7ffc-463b-8c0e-993122f38b77) |
    | key_name                            | None                                                            |
    | name                                | test-server                                                     |
    | progress                            | 0                                                               |
    | project_id                          | bcb0c7a5338b4a46959e47971c58f0f1                                |
    | properties                          |                                                                 |
    | security_groups                     | name='default'                                                  |
    | status                              | BUILD                                                           |
    | updated                             | 2022-01-02T08:22:34Z                                            |
    | user_id                             | 27e0947bb4fe47e4981da31d4a18ddf7                                |
    | volumes_attached                    |                                                                 |
    +-------------------------------------+-----------------------------------------------------------------+
    
  10. 为实例的端口创建 NDP 代理

    查询实例的端口

    $ openstack port list --server test-server
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------+--------+
    | ID                                   | Name | MAC Address       | Fixed IP Addresses                                                             | Status |
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------+--------+
    | bdd64aa0-437a-4db6-bbca-99869426c908 |      | fa:16:3e:ac:15:b8 | ip_address='2001:db8::1:284', subnet_id='9bcf194c-d44f-4e6f-90da-98510ddef283' | ACTIVE |
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------+--------+
    

    为端口创建 NDP 代理

    $ openstack router ndp proxy create test-router --port bdd64aa0-437a-4db6-bbca-99869426c908 --name test-np
    +-----------------+--------------------------------------+
    | Field           | Value                                |
    +-----------------+--------------------------------------+
    | created_at      | 2022-01-02T08:25:31Z                 |
    | description     |                                      |
    | id              | 73889fee-e322-443f-941e-142e4fc5f898 |
    | ip_address      | 2001:db8::1:284                      |
    | name            | test-np                              |
    | port_id         | bdd64aa0-437a-4db6-bbca-99869426c908 |
    | project_id      | bcb0c7a5338b4a46959e47971c58f0f1     |
    | revision_number | 0                                    |
    | router_id       | 3aab8554-e5c4-4262-ab95-b92857c641de |
    | updated_at      | 2022-01-02T08:25:31Z                 |
    +-----------------+--------------------------------------+
    
  11. 然后从 upstream 路由器 ping 端口的地址

    $ ping 2001:db8::1:284
    PING 2001:db8::1:284(2001:db8::1:284) 56 data bytes
    64 bytes from 2001:db8::1:284: icmp_seq=1 ttl=64 time=0.365 ms
    64 bytes from 2001:db8::1:284: icmp_seq=2 ttl=64 time=0.385 ms
    

    注意

    您可能还需要添加一个安全组规则,允许指向实例的 ICMPv6 流量。

已知限制

  • 将 NDP 代理与 OVN 后端结合使用不受支持。