BGP 动态路由

BGP 动态路由能够将自助服务(私有)网络前缀通告给支持 BGP 的物理网络设备,例如路由器,从而消除了对静态路由的传统依赖。此功能依赖于 地址范围,并且需要了解其操作才能正确部署。

BGP 动态路由由一个服务插件和一个代理组成。服务插件实现网络服务扩展,而代理管理 BGP 对等会话。云管理员使用 CLI 或 API 创建和配置 BGP 扬声器,并将其手动调度到一个或多个运行代理的主机上。代理可以驻留在具有或不具有其他网络服务代理的主机上。前缀通告取决于外部网络与 BGP 扬声器的绑定以及外部和内部 IP 地址范围或子网的地址范围。

BGP dynamic routing overview

注意

虽然自助服务网络通常使用私有 IP 地址范围(RFC1918)用于 IPv4 子网,但 BGP 动态路由可以通告任何 IPv4 地址范围。

示例配置

示例配置涉及以下组件

  • 一个 BGP 代理。

  • 一个地址范围,包含用于提供商网络的 IP 地址范围 203.0.113.0/24,以及用于自助服务网络的 IP 地址范围 192.0.2.0/25 和 192.0.2.128/25。

  • 一个使用 IP 地址范围 203.0.113.0/24 的提供商网络。

  • 三个自助服务网络。

    • 自助服务网络 1 和 2 使用地址范围内的 IP 地址范围。

    • 自助服务网络 3 使用唯一的 IP 地址范围 198.51.100.0/24,以演示 BGP 扬声器不会通告地址范围外的任何前缀。

  • 三个路由器。每个路由器将一个自助服务网络连接到提供商网络。

    • 路由器 1 包含 IP 地址 203.0.113.11 和 192.0.2.1

    • 路由器 2 包含 IP 地址 203.0.113.12 和 192.0.2.129

    • 路由器 3 包含 IP 地址 203.0.113.13 和 198.51.100.1

  • 一个预先存在的对等网络 10.0.0.0/24,位于运行 neutron BGP 动态路由代理的主机上,以促进与对等方的 BGP 通信。10.0.0.1 是主机的地址,10.0.0.2 是对等方的地址。

注意

示例配置假定您对网络服务、路由和 BGP 有足够的了解。有关网络服务的基本部署,请参阅其中一个 部署示例。有关 BGP 的更多信息,请参阅 RFC 4271

控制器节点

  • neutron.conf 文件中,启用传统的第 3 层和 BGP 动态路由服务插件

    [DEFAULT]
    service_plugins = neutron_dynamic_routing.services.bgp.bgp_plugin.BgpPlugin,neutron.services.l3_router.l3_router_plugin.L3RouterPlugin
    

代理节点

  • bgp_dragent.ini 文件中

    • 配置驱动程序。

      [BGP]
      bgp_speaker_driver = neutron_dynamic_routing.services.bgp.agent.driver.os_ken.driver.OsKenBgpDriver
      

      注意

      代理当前仅支持 os-ken BGP 驱动程序。

    • 配置路由器 ID。

      [BGP]
      bgp_router_id = ROUTER_ID
      

      ROUTER_ID 替换为合适的唯一的 32 位数字,通常是运行代理的主机上的 IPv4 地址。例如,10.0.0.1。

验证服务操作

  1. 获取管理项目凭据。

  2. 验证每个 BGP 动态路由代理的存在和操作。

    $ openstack network agent list --agent-type bgp
    +--------------------------------------+---------------------------+------------+-------------------+-------+-------+---------------------+
    | ID                                   | Agent Type                | Host       | Availability Zone | Alive | State | Binary              |
    +--------------------------------------+---------------------------+------------+-------------------+-------+-------+---------------------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | BGP dynamic routing agent | controller | None              | :-)   | UP    | neutron-bgp-dragent |
    +--------------------------------------+---------------------------+------------+-------------------+-------+-------+---------------------+
    

创建地址范围和子网池

  1. 创建一个地址范围。提供商(外部)和自助服务网络必须属于同一个地址范围,才能使代理通告这些自助服务网络前缀。

    $ openstack address scope create --share --ip-version 4 bgp
    
    +------------+--------------------------------------+
    | Field      | Value                                |
    +------------+--------------------------------------+
    | headers    |                                      |
    | id         | f71c958f-dbe8-49a2-8fb9-19c5f52a37f1 |
    | ip_version | 4                                    |
    | name       | bgp                                  |
    | project_id | 86acdbd1d72745fd8e8320edd7543400     |
    | shared     | True                                 |
    +------------+--------------------------------------+
    
  2. 创建子网池。提供商和自助服务网络使用不同的池。

    • 创建提供商网络池。

      $ openstack subnet pool create --pool-prefix 203.0.113.0/24 \
        --address-scope bgp provider
      
      +-------------------+--------------------------------------+
      | Field             | Value                                |
      +-------------------+--------------------------------------+
      | address_scope_id  | f71c958f-dbe8-49a2-8fb9-19c5f52a37f1 |
      | created_at        | 2017-01-12T14:58:57Z                 |
      | default_prefixlen | 8                                    |
      | default_quota     | None                                 |
      | description       |                                      |
      | headers           |                                      |
      | id                | 63532225-b9a0-445a-9935-20a15f9f68d1 |
      | ip_version        | 4                                    |
      | is_default        | False                                |
      | max_prefixlen     | 32                                   |
      | min_prefixlen     | 8                                    |
      | name              | provider                             |
      | prefixes          | 203.0.113.0/24                       |
      | project_id        | 86acdbd1d72745fd8e8320edd7543400     |
      | revision_number   | 1                                    |
      | shared            | False                                |
      | tags              | []                                   |
      | updated_at        | 2017-01-12T14:58:57Z                 |
      +-------------------+--------------------------------------+
      
    • 创建自助服务网络池。

      $ openstack subnet pool create --pool-prefix 192.0.2.0/25 \
        --pool-prefix 192.0.2.128/25 --address-scope bgp \
        --share selfservice
      
      +-------------------+--------------------------------------+
      | Field             | Value                                |
      +-------------------+--------------------------------------+
      | address_scope_id  | f71c958f-dbe8-49a2-8fb9-19c5f52a37f1 |
      | created_at        | 2017-01-12T15:02:31Z                 |
      | default_prefixlen | 8                                    |
      | default_quota     | None                                 |
      | description       |                                      |
      | headers           |                                      |
      | id                | 8d8270b1-b194-4b7e-914c-9c741dcbd49b |
      | ip_version        | 4                                    |
      | is_default        | False                                |
      | max_prefixlen     | 32                                   |
      | min_prefixlen     | 8                                    |
      | name              | selfservice                          |
      | prefixes          | 192.0.2.0/25, 192.0.2.128/25         |
      | project_id        | 86acdbd1d72745fd8e8320edd7543400     |
      | revision_number   | 1                                    |
      | shared            | True                                 |
      | tags              | []                                   |
      | updated_at        | 2017-01-12T15:02:31Z                 |
      +-------------------+--------------------------------------+
      

创建提供商和自助服务网络

  1. 创建提供商网络。

    $ openstack network create provider --external --provider-physical-network \
      provider --provider-network-type flat
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2016-12-21T08:47:41Z                 |
    | description               |                                      |
    | headers                   |                                      |
    | id                        | 190ca651-2ee3-4a4b-891f-dedda47974fe |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | is_default                | False                                |
    | mtu                       | 1450                                 |
    | name                      | provider                             |
    | port_security_enabled     | True                                 |
    | project_id                | c961a8f6d3654657885226378ade8220     |
    | provider:network_type     | flat                                 |
    | provider:physical_network | provider                             |
    | provider:segmentation_id  | 66                                   |
    | revision_number           | 3                                    |
    | router:external           | External                             |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      | []                                   |
    | updated_at                | 2016-12-21T08:47:41Z                 |
    +---------------------------+--------------------------------------+
    
  2. 在提供商网络上创建一个子网,使用来自提供商子网池的 IP 地址范围。

    $ openstack subnet create --subnet-pool provider \
      --prefix-length 24 --gateway 203.0.113.1 --network provider \
      --allocation-pool start=203.0.113.11,end=203.0.113.254 provider
    +-------------------+--------------------------------------+
    | Field             | Value                                |
    +-------------------+--------------------------------------+
    | allocation_pools  | 203.0.113.11-203.0.113.254           |
    | cidr              | 203.0.113.0/24                       |
    | created_at        | 2016-03-17T23:17:16                  |
    | description       |                                      |
    | dns_nameservers   |                                      |
    | enable_dhcp       | True                                 |
    | gateway_ip        | 203.0.113.1                          |
    | host_routes       |                                      |
    | id                | 8ed65d41-2b2a-4f3a-9f92-45adb266e01a |
    | ip_version        | 4                                    |
    | ipv6_address_mode | None                                 |
    | ipv6_ra_mode      | None                                 |
    | name              | provider                             |
    | network_id        | 68ec148c-181f-4656-8334-8f4eb148689d |
    | project_id        | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    | segment_id        | None                                 |
    | service_types     |                                      |
    | subnetpool_id     | 3771c0e7-7096-46d3-a3bd-699c58e70259 |
    | tags              |                                      |
    | updated_at        | 2016-03-17T23:17:16                  |
    +-------------------+--------------------------------------+
    

    注意

    .11 开始的 IP 地址分配池可以提高图表的清晰度。您可以安全地省略它。

  3. 创建自助服务网络。

    $ openstack network create selfservice1
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2016-12-21T08:49:38Z                 |
    | description               |                                      |
    | headers                   |                                      |
    | id                        | 9d842606-ef3d-4160-9ed9-e03fa63aed96 |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | mtu                       | 1450                                 |
    | name                      | selfservice1                         |
    | port_security_enabled     | True                                 |
    | project_id                | c961a8f6d3654657885226378ade8220     |
    | provider:network_type     | vxlan                                |
    | provider:physical_network | None                                 |
    | provider:segmentation_id  | 106                                  |
    | revision_number           | 3                                    |
    | router:external           | Internal                             |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      | []                                   |
    | updated_at                | 2016-12-21T08:49:38Z                 |
    +---------------------------+--------------------------------------+
    
    $ openstack network create selfservice2
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2016-12-21T08:50:05Z                 |
    | description               |                                      |
    | headers                   |                                      |
    | id                        | f85639e1-d23f-438e-b2b1-f40570d86b1c |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | mtu                       | 1450                                 |
    | name                      | selfservice2                         |
    | port_security_enabled     | True                                 |
    | project_id                | c961a8f6d3654657885226378ade8220     |
    | provider:network_type     | vxlan                                |
    | provider:physical_network | None                                 |
    | provider:segmentation_id  | 21                                   |
    | revision_number           | 3                                    |
    | router:external           | Internal                             |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      | []                                   |
    | updated_at                | 2016-12-21T08:50:05Z                 |
    +---------------------------+--------------------------------------+
    
    $ openstack network create selfservice3
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2016-12-21T08:50:35Z                 |
    | description               |                                      |
    | headers                   |                                      |
    | id                        | eeccdb82-5cf4-4999-8ab3-e7dc99e7d43b |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | mtu                       | 1450                                 |
    | name                      | selfservice3                         |
    | port_security_enabled     | True                                 |
    | project_id                | c961a8f6d3654657885226378ade8220     |
    | provider:network_type     | vxlan                                |
    | provider:physical_network | None                                 |
    | provider:segmentation_id  | 86                                   |
    | revision_number           | 3                                    |
    | router:external           | Internal                             |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      | []                                   |
    | updated_at                | 2016-12-21T08:50:35Z                 |
    +---------------------------+--------------------------------------+
    
  4. 在最初两个自助服务网络上创建一个子网,使用来自自助服务子网池的 IP 地址范围。

    $ openstack subnet create --network selfservice1 --subnet-pool selfservice \
      --prefix-length 25 selfservice1
    +-------------------+----------------------------------------------------+
    | Field             | Value                                              |
    +-------------------+----------------------------------------------------+
    | allocation_pools  | 192.0.2.2-192.0.2.127                              |
    | cidr              | 192.0.2.0/25                                       |
    | created_at        | 2016-03-17T23:20:20                                |
    | description       |                                                    |
    | dns_nameservers   |                                                    |
    | enable_dhcp       | True                                               |
    | gateway_ip        | 198.51.100.1                                       |
    | host_routes       |                                                    |
    | id                | 8edd3dc2-df40-4d71-816e-a4586d61c809               |
    | ip_version        | 4                                                  |
    | ipv6_address_mode |                                                    |
    | ipv6_ra_mode      |                                                    |
    | name              | selfservice1                                       |
    | network_id        | be79de1e-5f56-11e6-9dfb-233e41cec48c               |
    | project_id        | b3ac05ef10bf441fbf4aa17f16ae1e6d                   |
    | revision_number   | 1                                                  |
    | subnetpool_id     | c7e9737a-cfd3-45b5-a861-d1cee1135a92               |
    | tags              | []                                                 |
    | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d                   |
    | updated_at        | 2016-03-17T23:20:20                                |
    +-------------------+----------------------------------------------------+
    
    $ openstack subnet create --network selfservice2 --subnet-pool selfservice \
      --prefix-length 25 selfservice2
    +-------------------+------------------------------------------------+
    | Field             | Value                                          |
    +-------------------+------------------------------------------------+
    | allocation_pools  | 192.0.2.130-192.0.2.254                        |
    | cidr              | 192.0.2.128/25                                 |
    | created_at        | 2016-03-17T23:20:20                            |
    | description       |                                                |
    | dns_nameservers   |                                                |
    | enable_dhcp       | True                                           |
    | gateway_ip        | 192.0.2.129                                    |
    | host_routes       |                                                |
    | id                | 8edd3dc2-df40-4d71-816e-a4586d61c809           |
    | ip_version        | 4                                              |
    | ipv6_address_mode |                                                |
    | ipv6_ra_mode      |                                                |
    | name              | selfservice2                                   |
    | network_id        | c1fd9846-5f56-11e6-a8ac-0f998d9cc0a2           |
    | project_id        | b3ac05ef10bf441fbf4aa17f16ae1e6d               |
    | revision_number   | 1                                              |
    | subnetpool_id     | c7e9737a-cfd3-45b5-a861-d1cee1135a92           |
    | tags              | []                                             |
    | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d               |
    | updated_at        | 2016-03-17T23:20:20                            |
    +-------------------+------------------------------------------------+
    
  5. 在最后一个自助服务网络上创建一个子网,使用地址范围外的 IP 地址范围。

    $ openstack subnet create --network selfservice3 --prefix 198.51.100.0/24 subnet3
    +-------------------+----------------------------------------------------+
    | Field             | Value                                              |
    +-------------------+----------------------------------------------------+
    | allocation_pools  | 198.51.100.2-198.51.100.254                        |
    | cidr              | 198.51.100.0/24                                    |
    | created_at        | 2016-03-17T23:20:20                                |
    | description       |                                                    |
    | dns_nameservers   |                                                    |
    | enable_dhcp       | True                                               |
    | gateway_ip        | 198.51.100.1                                       |
    | host_routes       |                                                    |
    | id                | cd9f9156-5f59-11e6-aeec-172ec7ee939a               |
    | ip_version        | 4                                                  |
    | ipv6_address_mode |                                                    |
    | ipv6_ra_mode      |                                                    |
    | name              | selfservice3                                       |
    | network_id        | c283dc1c-5f56-11e6-bfb6-efc30e1eb73b               |
    | project_id        | b3ac05ef10bf441fbf4aa17f16ae1e6d                   |
    | revision_number   | 1                                                  |
    | subnetpool_id     |                                                    |
    | tags              | []                                                 |
    | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d                   |
    | updated_at        | 2016-03-17T23:20:20                                |
    +-------------------+----------------------------------------------------+
    

创建和配置路由器

  1. 创建路由器。

    $ openstack router create router1
    +-------------------------+--------------------------------------+
    | Field                   | Value                                |
    +-------------------------+--------------------------------------+
    | admin_state_up          | UP                                   |
    | availability_zone_hints |                                      |
    | availability_zones      |                                      |
    | created_at              | 2017-01-10T13:15:19Z                 |
    | description             |                                      |
    | distributed             | False                                |
    | external_gateway_info   | null                                 |
    | flavor_id               | None                                 |
    | ha                      | False                                |
    | headers                 |                                      |
    | id                      | 3f6f4ef8-63be-11e6-bbb3-2fbcef363ab8 |
    | name                    | router1                              |
    | project_id              | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    | revision_number         | 1                                    |
    | routes                  |                                      |
    | status                  | ACTIVE                               |
    | tags                    | []                                   |
    | updated_at              | 2017-01-10T13:15:19Z                 |
    +-------------------------+--------------------------------------+
    
    $ openstack router create router2
    +-------------------------+--------------------------------------+
    | Field                   | Value                                |
    +-------------------------+--------------------------------------+
    | admin_state_up          | UP                                   |
    | availability_zone_hints |                                      |
    | availability_zones      |                                      |
    | created_at              | 2017-01-10T13:15:19Z                 |
    | description             |                                      |
    | distributed             | False                                |
    | external_gateway_info   | null                                 |
    | flavor_id               | None                                 |
    | ha                      | False                                |
    | headers                 |                                      |
    | id                      | 3fd21a60-63be-11e6-9c95-5714c208c499 |
    | name                    | router2                              |
    | project_id              | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    | revision_number         | 1                                    |
    | routes                  |                                      |
    | status                  | ACTIVE                               |
    | tags                    | []                                   |
    | updated_at              | 2017-01-10T13:15:19Z                 |
    +-------------------------+--------------------------------------+
    
    $ openstack router create router3
    +-------------------------+--------------------------------------+
    | Field                   | Value                                |
    +-------------------------+--------------------------------------+
    | admin_state_up          | UP                                   |
    | availability_zone_hints |                                      |
    | availability_zones      |                                      |
    | created_at              | 2017-01-10T13:15:19Z                 |
    | description             |                                      |
    | distributed             | False                                |
    | external_gateway_info   | null                                 |
    | flavor_id               | None                                 |
    | ha                      | False                                |
    | headers                 |                                      |
    | id                      | 40069a4c-63be-11e6-9ecc-e37c1eaa7e84 |
    | name                    | router3                              |
    | project_id              | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    | revision_number         | 1                                    |
    | routes                  |                                      |
    | status                  | ACTIVE                               |
    | tags                    | []                                   |
    | updated_at              | 2017-01-10T13:15:19Z                 |
    +-------------------------+--------------------------------------+
    
  2. 对于每个路由器,添加一个自助服务子网作为路由器上的接口。

    $ openstack router add subnet router1 selfservice1
    
    $ openstack router add subnet router2 selfservice2
    
    $ openstack router add subnet router3 selfservice3
    
  3. 将提供商网络作为每个路由器的网关添加。

    $ openstack router set --external-gateway provider router1
    
    $ openstack router set --external-gateway provider router2
    
    $ openstack router set --external-gateway provider router3
    

创建和配置 BGP 扬声器

BGP 扬声器通告符合条件的自助服务网络和使用这些网络的实例的浮动 IP 地址的下一跳 IP 地址。

  1. 创建 BGP 扬声器。

    $ openstack bgp speaker create --ip-version 4 \
      --local-as LOCAL_AS bgpspeaker
    Created a new bgp_speaker:
    +-----------------------------------+--------------------------------------+
    | Field                             | Value                                |
    +-----------------------------------+--------------------------------------+
    | advertise_floating_ip_host_routes | True                                 |
    | advertise_tenant_networks         | True                                 |
    | id                                | 5f227f14-4f46-4eca-9524-fc5a1eabc358 |
    | ip_version                        | 4                                    |
    | local_as                          | 1234                                 |
    | name                              | bgpspeaker                           |
    | networks                          |                                      |
    | peers                             |                                      |
    | tenant_id                         | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------------------------------+--------------------------------------+
    

    LOCAL_AS 替换为合适的本地自治系统编号。示例配置使用 AS 1234。

  2. BGP 扬声器需要与提供商网络关联才能确定符合条件的前缀。关联会构建一个包含所有具有在同一地址范围内的提供商和自助服务网络上的网关的虚拟路由器的列表,以便 BGP 扬声器可以通告自助服务网络前缀,并将相应的路由器作为下一跳 IP 地址。将 BGP 扬声器与提供商网络关联。

    $ openstack bgp speaker add network bgpspeaker provider
    Added network provider to BGP speaker bgpspeaker.
    
  3. 验证提供商网络与 BGP 扬声器的关联。

    $ openstack bgp speaker show bgpspeaker
    +-----------------------------------+--------------------------------------+
    | Field                             | Value                                |
    +-----------------------------------+--------------------------------------+
    | advertise_floating_ip_host_routes | True                                 |
    | advertise_tenant_networks         | True                                 |
    | id                                | 5f227f14-4f46-4eca-9524-fc5a1eabc358 |
    | ip_version                        | 4                                    |
    | local_as                          | 1234                                 |
    | name                              | bgpspeaker                           |
    | networks                          | 68ec148c-181f-4656-8334-8f4eb148689d |
    | peers                             |                                      |
    | tenant_id                         | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------------------------------+--------------------------------------+
    
  4. 验证 BGP 扬声器通告的前缀和下一跳 IP 地址。

    $ openstack bgp speaker list advertised routes bgpspeaker
    +-----------------+--------------+
    | Destination     | Nexthop      |
    +-----------------+--------------+
    | 192.0.2.0/25    | 203.0.113.11 |
    | 192.0.2.128/25  | 203.0.113.12 |
    +-----------------+--------------+
    
  5. 创建一个 BGP 对等体。

    $ openstack bgp peer create --peer-ip 10.0.0.2 \
      --remote-as REMOTE_AS bgppeer
    Created a new bgp_peer:
    +-----------+--------------------------------------+
    | Field     | Value                                |
    +-----------+--------------------------------------+
    | auth_type | none                                 |
    | id        | 35c89ca0-ac5a-4298-a815-0b073c2362e9 |
    | name      | bgppeer                              |
    | peer_ip   | 10.0.0.2                             |
    | remote_as | 4321                                 |
    | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------+--------------------------------------+
    

    REMOTE_AS 替换为合适的远程自治系统编号。示例配置使用 AS 4321,这将触发 EBGP 对等。

    注意

    包含 BGP 代理的主机必须具有与提供商路由器的第 3 层连接。

  6. 将 BGP 对等体添加到 BGP 扬声器。

    $ openstack bgp speaker add peer bgpspeaker bgppeer
    Added BGP peer bgppeer to BGP speaker bgpspeaker.
    
  7. 验证将 BGP 对等体添加到 BGP 扬声器。

    $ openstack bgp speaker show bgpspeaker
    +-----------------------------------+--------------------------------------+
    | Field                             | Value                                |
    +-----------------------------------+--------------------------------------+
    | advertise_floating_ip_host_routes | True                                 |
    | advertise_tenant_networks         | True                                 |
    | id                                | 5f227f14-4f46-4eca-9524-fc5a1eabc358 |
    | ip_version                        | 4                                    |
    | local_as                          | 1234                                 |
    | name                              | bgpspeaker                           |
    | networks                          | 68ec148c-181f-4656-8334-8f4eb148689d |
    | peers                             | 35c89ca0-ac5a-4298-a815-0b073c2362e9 |
    | tenant_id                         | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------------------------------+--------------------------------------+
    

    注意

    在创建对等会话后,无法更改本地或远程自治系统编号。

将 BGP 扬声器调度到代理

  1. 与大多数代理不同,BGP 扬声器需要手动调度到代理。BGP 扬声器仅在调度到代理后才会形成对等会话并开始前缀通告。将 BGP 扬声器调度到代理 37729181-2224-48d8-89ef-16eca8e2f77e

    $ openstack bgp dragent add speaker 37729181-2224-48d8-89ef-16eca8e2f77e bgpspeaker
    Associated BGP speaker bgpspeaker to the Dynamic Routing agent.
    
  2. 验证将 BGP 扬声器调度到代理。

    $ openstack bgp dragent list --bgp-speaker bgpspeaker
    +--------------------------------------+------------+-------+-------+
    | ID                                   | Host       | State | Alive |
    +--------------------------------------+------------+-------+-------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | controller | True  | :-)   |
    +--------------------------------------+------------+-------+-------+
    

前缀通告

BGP 动态路由通告自助服务网络的前缀和浮动 IP 地址的主机路由。

通告自助服务网络需要满足以下条件

  • 外部和自助服务网络位于同一个地址范围。

  • 路由器包含自助服务子网上的接口以及外部网络上的网关。

  • BGP 扬声器与提供具有路由器上网关的外部网络关联。

  • BGP 扬声器具有将 advertise_tenant_networks 属性设置为 True

Example of prefix advertisements with self-service networks

通告浮动 IP 地址需要满足以下条件

  • 具有浮动 IP 地址绑定的路由器包含外部网络上的网关,该网络与 BGP 扬声器关联。

  • BGP 扬声器具有将 advertise_floating_ip_host_routes 属性设置为 True

Example of prefix advertisements with floating IP addresses

与分布式虚拟路由器 (DVR) 配合使用

对于浮动 IP 和 IPv4 固定 IP 地址,BGP 扬声器通告对应计算节点上的浮动 IP 代理网关作为下一跳 IP 地址。在使用 IPv6 固定 IP 地址时,BGP 扬声器通告 DVR SNAT 节点作为下一跳 IP 地址。

例如,考虑以下组件

  1. 一个使用 IP 地址范围 203.0.113.0/24 的提供商网络,并支持浮动 IP 地址 203.0.113.101、203.0.113.102 和 203.0.113.103。

  2. 一个使用 IP 地址范围 198.51.100.0/24 的自助服务网络。

  3. 具有固定 IP 198.51.100.11、198.51.100.12 和 198.51.100.13 的实例

  4. SNAT 网关位于 203.0.113.11。

  5. 浮动 IP 代理网关(每个计算节点一个)位于 203.0.113.12、203.0.113.13 和 203.0.113.14。

  6. 三个实例,每个计算节点一个,每个实例都有一个浮动 IP 地址。

  7. advertise_tenant_networks 设置为 BGP 扬声器上的 False

$ openstack bgp speaker list advertised routes bgpspeaker
+------------------+--------------+
| Destination      | Nexthop      |
+------------------+--------------+
| 198.51.100.0/24  | 203.0.113.11 |
| 203.0.113.101/32 | 203.0.113.12 |
| 203.0.113.102/32 | 203.0.113.13 |
| 203.0.113.103/32 | 203.0.113.14 |
+------------------+--------------+

当浮动 IP 被取消关联并且 advertise_tenant_networks 设置为 True 时,将通告以下路由

$ openstack bgp speaker list advertised routes bgpspeaker
+------------------+--------------+
| Destination      | Nexthop      |
+------------------+--------------+
| 198.51.100.0/24  | 203.0.113.11 |
| 198.51.100.11/32 | 203.0.113.12 |
| 198.51.100.12/32 | 203.0.113.13 |
| 198.51.100.13/32 | 203.0.113.14 |
+------------------+--------------+

您还可以识别您环境中的浮动 IP 代理网关,以帮助验证 BGP 扬声器的操作。

$ openstack port list --device-owner network:floatingip_agent_gateway
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------------------------+
| ID                                   | Name | MAC Address       | Fixed IP Addresses                                                                                     |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------------------------+
| 87cf2970-4970-462e-939e-00e808295dfa |      | fa:16:3e:7c:68:e3 | ip_address='203.0.113.12', subnet_id='8ed65d41-2b2a-4f3a-9f92-45adb266e01a'                            |
| 8d218440-0d2e-49d0-8a7b-3266a6146dc1 |      | fa:16:3e:9d:78:cf | ip_address='203.0.113.13', subnet_id='8ed65d41-2b2a-4f3a-9f92-45adb266e01a'                            |
| 87cf2970-4970-462e-939e-00e802281dfa |      | fa:16:3e:6b:18:e0 | ip_address='203.0.113.14', subnet_id='8ed65d41-2b2a-4f3a-9f92-45adb266e01a'                            |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------------------------+

IPv6

BGP 动态路由支持通过 IPv6 进行对等,并通告 IPv6 前缀。

  • 要启用通过 IPv6 进行对等,请创建一个 BGP 对等体,并使用 IPv6 地址作为 peer_ip

  • 要启用通告 IPv6 前缀,请创建一个具有 ip_version=6 和 BGP 扬声器具有 ip_version=6 的地址范围。

注意

DVR 缺乏直接通过浮动 IP 代理网关端口将路由路由到固定 IPv6 地址的支持,从而阻止 BGP 扬声器通告 /128 主机路由。

高可用性

BGP 动态路由支持将 BGP 扬声器调度到多个代理,从而有效地将对同一对等体的通告前缀数量增加一倍。如果一个代理失败,对等体将继续从一个或多个运行的代理接收通告。

  1. 显示可用的动态路由代理。

    $ openstack network agent list --agent-type bgp
    +--------------------------------------+---------------------------+------- --+-------------------+-------+-------+---------------------------+
    | ID                                   | Agent Type                | Host     | Availability Zone | Alive | State | Binary                    |
    +--------------------------------------+---------------------------+----------+-------------------+-------+-------+---------------------------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | BGP dynamic routing agent | bgp-ha1  | None              | :-)   | UP    | neutron-bgp-dragent       |
    | 1a2d33bb-9321-30a2-76ab-22eff3d2f56a | BGP dynamic routing agent | bgp-ha2  | None              | :-)   | UP    | neutron-bgp-dragent       |
    +--------------------------------------+---------------------------+----------+-------------------+-------+-------+---------------------------+
    
  2. 将 BGP 扬声器调度到多个代理。

    $ openstack bgp dragent add speaker 37729181-2224-48d8-89ef-16eca8e2f77e bgpspeaker
    Associated BGP speaker bgpspeaker to the Dynamic Routing agent.
    
    $ openstack bgp dragent add speaker 1a2d33bb-9321-30a2-76ab-22eff3d2f56a bgpspeaker
    Associated BGP speaker bgpspeaker to the Dynamic Routing agent.
    
    $ openstack bgp dragent list --bgp-speaker bgpspeaker
    +--------------------------------------+---------+-------+-------+
    | ID                                   | Host    | State | Alive |
    +--------------------------------------+---------+-------+-------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | bgp-ha1 | True  | :-)   |
    | 1a2d33bb-9321-30a2-76ab-22eff3d2f56a | bgp-ha2 | True  | :-)   |
    +--------------------------------------+---------+-------+-------+