BGP 動的ルーティング

BGP 動的ルーティング

BGP 動的ルーティングを使うと、セルフサービス (プライベート) ネットワークのネットワークプレフィックスを、ルーターなどの BGP に対応した物理ネットワークデバイスに広告できるようになります。これにより、従来からの静的経路による方法に依存する必要がなくなります。この機能は アドレススコープ に依存しており、また、適切なデプロイメントを運用するだけの知識も必要です。

BGP 動的ルーティングは、サービスプラグインとエージェントで構成されます。サービスプラグインは Networking サービスの API 拡張を実装し、エージェントは BGP ピアリングセッションの管理を行います。クラウド管理者は CLI や API を使って BGP スピーカーを作成、設定し、手動で BGP スピーカーを 1 つ以上のエージェントが動作するホストに割り当てます。エージェントは他の Networking サービスのエージェントと同じホストに置くことも別のホストに置くこともできます。プレフィックス広告 (prefix advertisement) は、BGP スピーカーが関連付けられた外部ネットワーク、および外部と内部の IP アドレス範囲やサブネットのアドレススコープに基いて行われます。

BGP dynamic routing overview

注釈

セルフサービスネットワークの IPv4 サブネットでは一般的にはプライベート IP アドレス範囲 (RFC1918) が使用されますが、 BGP 動的ルーティングはどのような IPv4 アドレス範囲でも広告できます。

設定例

この設定例では、以下の構成要素が登場します。

  • 1 個の BGP エージェント。

  • 1 個のアドレススコープ。このアドレススコープは、プロバイダーネットワーク用の IP アドレス範囲 203.0.113.0/24 および、セルフサービスネットワーク用の IP アドレス範囲 10.0.1.0/24 と 10.0.2.0/24 を含みます。

  • 1 個のプロバイダーネットワーク。 IP アドレス範囲として 203.0.113.0/24 を使用します。

  • 3 個のセルフサービスネットワーク。

    • セルフサービスネットワーク 1 と 2 は、アドレススコープ内の IP アドレス範囲を使用します。

    • セルフサービスネットワーク 3 は、独自の IP アドレス範囲 10.0.3.0/24 を使用します。これを用いて、 BGP スピーカーがアドレススコープ外のプレフィックスを広告しないことを確認します。

  • 3 個のルーター。各ルーターはそれぞれ 1 個のセルフサービスネットワークをプロバイダーネットワークに接続します。

    • ルーター 1 は IP アドレス 203.0.113.11 と 10.0.1.1 を持ちます。

    • ルーター 2 は IP アドレス 203.0.113.12 と 10.0.2.1 を持ちます。

    • ルーター 3 は IP アドレス 203.0.113.13 と 10.0.3.1 を持ちます。

注釈

この設定例では、 Networking サービスやルーティング、BGP についての十分な知識があることを前提にしています。 Networking サービスの基本的なデプロイメントについては、 Deployment examples のいずれかを参考にしてください。 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.ryu.driver.RyuBgpDriver
      

      注釈

      現在のところ、エージェントが対応しているのは Ryu BGP ドライバーのみです。

    • ルーター ID を設定します。

      [BGP]
      bgp_router_id = ROUTER_ID
      

      ROUTER_ID は、適切な一意な 32 ビットの数字に置き換えます。通常は、エージェントが動作しているホストの IPv4 アドレスを使います。例: 192.0.2.2。

サービスの動作検証

  1. 管理プロジェクトのクレデンシャルを読み込みます。

  2. BGP 動的ルーティングエージェントが存在し機能していることを確認します。

    $ neutron agent-list --agent-type=="BGP dynamic routing agent"
    +--------------------------------------+---------------------------+------------+-------------------+-------+----------------+---------------------------+
    | id                                   | agent_type                | host       | availability_zone | alive | admin_state_up | binary                    |
    +--------------------------------------+---------------------------+------------+-------------------+-------+----------------+---------------------------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | BGP dynamic routing agent | controller |                   | :-)   | True           | neutron-bgp-dragent       |
    +--------------------------------------+---------------------------+------------+-------------------+-------+----------------+---------------------------+
    

アドレススコープとサブネットプールの作成

  1. アドレススコープを作成します。プロバイダー (外部) ネットワークとセルフサービスネットワークは同じアドレススコープに属していなければいけません。これは、エージェントはセルフサービスサービスネットワークのプレフィックスを広告するために必要です。

    $ neutron address-scope-create --shared bgp 4
    Created a new address_scope:
    +------------+--------------------------------------+
    | Field      | Value                                |
    +------------+--------------------------------------+
    | id         | c02c358a-9d35-43ea-8313-986b3e4a91c0 |
    | ip_version | 4                                    |
    | name       | bgp                                  |
    | shared     | True                                 |
    | tenant_id  | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +------------+--------------------------------------+
    
  2. サブネットプールを作成します。プロバイダーネットワークとセルフサービスネットワークは異なるプールを使用します。

    • プロバイダーネットワーク用のプールを作成します。

      $ neutron subnetpool-create --pool-prefix 203.0.113.0/24 \
        --address-scope bgp provider
      Created a new subnetpool:
      +-------------------+--------------------------------------+
      | Field             | Value                                |
      +-------------------+--------------------------------------+
      | address_scope_id  | c02c358a-9d35-43ea-8313-986b3e4a91c0 |
      | created_at        | 2016-03-17T23:11:12                  |
      | default_prefixlen | 8                                    |
      | default_quota     |                                      |
      | description       |                                      |
      | id                | 3771c0e7-7096-46d3-a3bd-699c58e70259 |
      | ip_version        | 4                                    |
      | is_default        | False                                |
      | max_prefixlen     | 32                                   |
      | min_prefixlen     | 8                                    |
      | name              | provider                             |
      | prefixes          | 203.0.113.0/24                       |
      | shared            | False                                |
      | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
      | updated_at        | 2016-03-17T23:11:12                  |
      +-------------------+--------------------------------------+
      
    • セルフサービスネットワーク用のプールを作成します。

      $ neutron subnetpool-create --pool-prefix 10.0.1.0/24 \
        --pool-prefix 10.0.2.0/24 --address-scope bgp \
        --shared selfservice
      Created a new subnetpool:
      +-------------------+--------------------------------------+
      | Field             | Value                                |
      +-------------------+--------------------------------------+
      | address_scope_id  | c02c358a-9d35-43ea-8313-986b3e4a91c0 |
      | created_at        | 2016-03-17T23:11:51                  |
      | default_prefixlen | 8                                    |
      | default_quota     |                                      |
      | description       |                                      |
      | id                | c7e9737a-cfd3-45b5-a861-d1cee1135a92 |
      | ip_version        | 4                                    |
      | is_default        | False                                |
      | max_prefixlen     | 32                                   |
      | min_prefixlen     | 8                                    |
      | name              | selfservice                          |
      | prefixes          | 10.0.1.0/24                          |
      |                   | 10.0.2.0/24                          |
      | shared            | True                                 |
      | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
      | updated_at        | 2016-03-17T23:11:51                  |
      +-------------------+--------------------------------------+
      

プロバイダーネットワークとセルフサービスネットワークの作成

  1. プロバイダーネットワークを作成します。

    $ neutron net-create --router:external True --provider:physical_network provider \
      --provider:network_type flat provider
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | True                                 |
    | id                        | 68ec148c-181f-4656-8334-8f4eb148689d |
    | name                      | provider                             |
    | provider:network_type     | flat                                 |
    | provider:physical_network | provider                             |
    | provider:segmentation_id  |                                      |
    | router:external           | True                                 |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tenant_id                 | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +---------------------------+--------------------------------------+
    
  2. プロバイダーサブネットプール内の IP アドレス範囲を使って、プロバイダーネットワーク上にサブネットを作成します。

    $ neutron subnet-create --name provider --subnetpool provider \
      --prefixlen 24 --allocation-pool start=203.0.113.11,end=203.0.113.254 \
      --gateway 203.0.113.1 provider
    Created a new subnet:
    +-------------------+---------------------------------------------------+
    | Field             | Value                                             |
    +-------------------+---------------------------------------------------+
    | allocation_pools  | {"start": "203.0.113.11", "end": "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 |                                                   |
    | ipv6_ra_mode      |                                                   |
    | name              | provider                                          |
    | network_id        | 68ec148c-181f-4656-8334-8f4eb148689d              |
    | subnetpool_id     | 3771c0e7-7096-46d3-a3bd-699c58e70259              |
    | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d                  |
    | updated_at        | 2016-03-17T23:17:16                               |
    +-------------------+---------------------------------------------------+
    

    注釈

    IP アドレスの割り当てプールが .11 で始まっているのは、説明を分かりやすくするためです。省略しても問題ありません。

  3. セルフサービスネットワークを作成します。

    $ neutron net-create selfservice1
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | True                                 |
    | id                        | be79de1e-5f56-11e6-9dfb-233e41cec48c |
    | name                      | selfservice1                         |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tenant_id                 | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +---------------------------+--------------------------------------+
    
    $ neutron net-create selfservice2
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | True                                 |
    | id                        | c1fd9846-5f56-11e6-a8ac-0f998d9cc0a2 |
    | name                      | selfservice2                         |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tenant_id                 | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +---------------------------+--------------------------------------+
    
    $ neutron net-create selfservice3
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | True                                 |
    | id                        | c283dc1c-5f56-11e6-bfb6-efc30e1eb73b |
    | name                      | selfservice3                         |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tenant_id                 | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +---------------------------+--------------------------------------+
    
  4. 最初の 2 つのセルフサービスネットワークは、セルフサービスサブネットプールの IP アドレス範囲を使って作成します。

    $ neutron subnet-create --name selfservice1 --subnetpool selfservice \
      --prefixlen 24 selfservice1
    Created a new subnet:
    +-------------------+--------------------------------------------+
    | Field             | Value                                      |
    +-------------------+--------------------------------------------+
    | allocation_pools  | {"start": "10.0.1.2", "end": "10.0.1.254"} |
    | cidr              | 10.0.1.0/24                                |
    | created_at        | 2016-03-17T23:20:20                        |
    | description       |                                            |
    | dns_nameservers   |                                            |
    | enable_dhcp       | True                                       |
    | gateway_ip        | 10.0.1.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       |
    | subnetpool_id     | c7e9737a-cfd3-45b5-a861-d1cee1135a92       |
    | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d           |
    | updated_at        | 2016-03-17T23:20:20                        |
    +-------------------+--------------------------------------------+
    
    $ neutron subnet-create --name selfservice2 --subnetpool selfservice \
      --prefixlen 24 selfservice2
    Created a new subnet:
    +-------------------+--------------------------------------------+
    | Field             | Value                                      |
    +-------------------+--------------------------------------------+
    | allocation_pools  | {"start": "10.0.2.2", "end": "10.0.2.254"} |
    | cidr              | 10.0.2.0/24                                |
    | created_at        | 2016-03-17T23:20:20                        |
    | description       |                                            |
    | dns_nameservers   |                                            |
    | enable_dhcp       | True                                       |
    | gateway_ip        | 10.0.2.1                                   |
    | 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       |
    | subnetpool_id     | c7e9737a-cfd3-45b5-a861-d1cee1135a92       |
    | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d           |
    | updated_at        | 2016-03-17T23:20:20                        |
    +-------------------+--------------------------------------------+
    
  5. 最後のセルフサービスネットワークは、アドレススコープに属さない IP アドレス範囲を使って作成します。

    $ neutron subnet-create --name subnet3 selfservice3 10.0.3.0/24
    Created a new subnet:
    +-------------------+--------------------------------------------+
    | Field             | Value                                      |
    +-------------------+--------------------------------------------+
    | allocation_pools  | {"start": "10.0.3.2", "end": "10.0.3.254"} |
    | cidr              | 10.0.3.0/24                                |
    | created_at        | 2016-03-17T23:20:20                        |
    | description       |                                            |
    | dns_nameservers   |                                            |
    | enable_dhcp       | True                                       |
    | gateway_ip        | 10.0.3.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       |
    | subnetpool_id     |                                            |
    | tenant_id         | b3ac05ef10bf441fbf4aa17f16ae1e6d           |
    | updated_at        | 2016-03-17T23:20:20                        |
    +-------------------+--------------------------------------------+
    

ルーターの作成と設定

  1. ルーターを作成します。

    $ neutron router-create router1
    +-----------------------+--------------------------------------+
    | Field                 | Value                                |
    +-----------------------+--------------------------------------+
    | admin_state_up        | True                                 |
    | external_gateway_info |                                      |
    | id                    | 3f6f4ef8-63be-11e6-bbb3-2fbcef363ab8 |
    | name                  | router1                              |
    | status                | ACTIVE                               |
    | tenant_id             | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------------------+--------------------------------------+
    
    $ neutron router-create router2
    +-----------------------+--------------------------------------+
    | Field                 | Value                                |
    +-----------------------+--------------------------------------+
    | admin_state_up        | True                                 |
    | external_gateway_info |                                      |
    | id                    | 3fd21a60-63be-11e6-9c95-5714c208c499 |
    | name                  | router1                              |
    | status                | ACTIVE                               |
    | tenant_id             | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------------------+--------------------------------------+
    
    $ neutron router-create router3
    +-----------------------+--------------------------------------+
    | Field                 | Value                                |
    +-----------------------+--------------------------------------+
    | admin_state_up        | True                                 |
    | external_gateway_info |                                      |
    | id                    | 40069a4c-63be-11e6-9ecc-e37c1eaa7e84 |
    | name                  | router1                              |
    | status                | ACTIVE                               |
    | tenant_id             | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------------------+--------------------------------------+
    
  2. それぞれのルーターで、セルフサービスサブネットをルーターのインターフェースとして追加します。

    $ neutron router-interface-add router1 selfservice1
    Added interface 90e3880a-5f5c-11e6-914c-9f3e20c8c151 to router router1.
    
    $ neutron router-interface-add router2 selfservice2
    Added interface 91628362-5f5c-11e6-826a-7322fb03a821 to router router2.
    
    $ neutron router-interface-add router3 selfservice3
    Added interface 91d51044-5f5c-11e6-bf55-ffd180541cc2 to router router3.
    
  3. 各ルーターのゲートウェイとしてプロバイダーネットワークを追加します。

    $ neutron router-gateway-set router1 provider
    Set gateway for router router1
    
    $ neutron router-gateway-set router2 provider
    Set gateway for router router2
    
    $ neutron router-gateway-set router3 provider
    Set gateway for router router3
    

BGP スピーカーの作成と設定

BGP スピーカーは、要件を満たすセルフサービスネットワークおよびそれらのネットワークに接続されたインスタンスの Floating IP アドレスに対するネクストホップを広告します。

  1. BGP スピーカーを作成します。

    $ neutron 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 番号 (autonomous system number) に置き換えてください。設定例では AS 1234 を使っています。

  2. 有効なプレフィックスを判定するには、 BGP スピーカーはプロバイダーネットワークと関連付けられている必要があります。この関連付けにより、同じアドレススコープにあるプロバイダーネットワークとセルフサービスネットワークにゲートウェイがある全仮想ルーターのリストを作成し、BGP スピーカーが、セルフサービスネットワークのプレフィックス、およびネクストホップ IP アドレスとして対応するルーターを広告できるようにします。 BGP スピーカーをプロバイダーネットワークと関連付けます。

    $ neutron bgp-speaker-network-add bgpspeaker provider
    Added network provider to BGP speaker bgpspeaker.
    
  3. プロバイダーネットワークが BGP スピーカーに関連付いていることを確認します。

    $ neutron 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 アドレスを確認します。

    $ neutron bgp-speaker-advertiseroute-list bgpspeaker
    +-------------+--------------+
    | destination | next_hop     |
    +-------------+--------------+
    | 10.0.1.0/24 | 203.0.113.11 |
    | 10.0.2.0/24 | 203.0.113.12 |
    +-------------+--------------+
    
  5. BGP ピアを作成します。

    $ neutron bgp-peer-create --peer-ip 192.0.2.1 \
      --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   | 192.0.2.1                            |
    | remote_as | 4321                                 |
    | tenant_id | b3ac05ef10bf441fbf4aa17f16ae1e6d     |
    +-----------+--------------------------------------+
    

    REMOTE_AS は、適切なリモート AS 番号 (autonomous system number) に置き換えてください。設定例では AS 4321 を使用し、 EBGP ピアリングで接続されます。

    注釈

    BGP エージェントが動作するホストは、プロバイダールーターへの L3 での接続性が必要です。

  6. BGP ピアを BPG スピーカーに追加します。

    $ neutron bgp-speaker-peer-add bgpspeaker bgppeer
    Added BGP peer bgppeer to BGP speaker bgpspeaker.
    
  7. BGP ピアが BGP スピーカーに関連付いていることを確認します。

    $ neutron 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     |
    +-----------------------------------+--------------------------------------+
    

    注釈

    ピアリングセッションを作成した後で、ローカルやリモートの AS 番号を変更することはできません。

BGP スピーカーのエージェントへのスケジューリング

  1. 多くのエージェントとは違い、 BGP スピーカーは手動でエージェントにスケジューリングする必要があります。 BGP スピーカーがピアリングセッションを構成しプレフィックス広告を開始するのは、エージェントへのスケジューリング後だけです。 BGP スピーカーをエージェント 37729181-2224-48d8-89ef-16eca8e2f77e にスケジューリングします。

    $ neutron bgp-dragent-speaker-add 37729181-2224-48d8-89ef-16eca8e2f77e bgpspeaker
    Associated BGP speaker bgpspeaker to the Dynamic Routing agent.
    
  2. BGP スピーカーのエージェントへのスケジューリングを確認します。

    $ neutron bgp-dragent-list-hosting-speaker bgpspeaker
    +--------------------------------------+------------+----------------+-------+
    | id                                   | host       | admin_state_up | alive |
    +--------------------------------------+------------+----------------+-------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | controller | True           | :-)   |
    +--------------------------------------+------------+----------------+-------+
    
    $ neutron bgp-speaker-list-on-dragent 37729181-2224-48d8-89ef-16eca8e2f77e
    +--------------------------------------+------------+----------+------------+
    | id                                   | name       | local_as | ip_version |
    +--------------------------------------+------------+----------+------------+
    | 5f227f14-4f46-4eca-9524-fc5a1eabc358 | bgpspeaker |     1234 |          4 |
    +--------------------------------------+------------+----------+------------+
    

プレフィックス広告

BGP 動的ルーティングは、セルフサービスネットワークのプレフィックスや Floating IP アドレスへのホストルートを広告します。

セルフサービスネットワークが広告されるには、以下の条件が成立する必要があります。

  • 外部ネットワークとセルフサービスネットワークが同じアドレススコープに属している。

  • ルーターが、セルフサービスサブネットに接続されたインターフェースと、外部ネットワークに接続されたゲートウェイを持つ。

  • BGP スピーカーが、ルーターのゲートウェイを提供する外部ネットワークに関連付けられている。

  • BGP スピーカーの advertise_tenant_networks 属性が True に設定されている。

Example of prefix advertisements with self-service networks

Floating IP アドレスが広告されるには、以下の条件が成立する必要があります。

  • Floating IP アドレスが関連付けられたルーターのゲートウェイが、 BGP スピーカーの関連付けがある外部ネットワーク上にある。

  • BGP スピーカーの advertise_floating_ip_host_routesTrue に設定されている。

Example of prefix advertisements with floating IP addresses

分散仮想ルーター (DVR) 利用時の動作

DVR を使ったデプロイメントでは、 BGP スピーカーは Floating IP アドレスとセルフサービスネットワークを異なる方法で広告します。 Floating IP アドレスの場合は、 BGP スピーカーは対応するコンピュートノードの Floating IP エージェントゲートウェイをネクストホップの IP アドレスとして広告します。 SNAT を使ったセルフサービスネットワークの場合は、 BGP スピーカーは DVR SNAT ノードをネクストホップの IP アドレスとして広告します。

例えば、以下の構成要素がある場合を考えます。

  1. プロバイダーネットワークは IP アドレス範囲 203.0.113.0/24 を使用し、 Floating IP アドレスとして 203.0.113.101, 203.0.113.102, 203.0.113.103 を使用できる。

  2. セルフサービスネットワークは IP アドレス範囲 10.0.1.0/24 を使用する。

  3. SNAT ゲートウェイは IP アドレス 203.0.113.11 を持つ。

  4. Floating IP エージェントゲートウェイ (各コンピュートノードに 1 つ置かれる) は IP アドレス 203.0.113.12, 203.0.113.13, 203.0.113.14 を持つ。

  5. 3 つのインスタンスが、各コンピュートノードに 1 つずつあり、それぞれ Floating IP アドレスを持つ。

$ neutron bgp-speaker-advertiseroute-list bgpspeaker
+------------------+--------------+
| destination      | next_hop     |
+------------------+--------------+
| 10.0.1.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 |
+------------------+--------------+

注釈

DVR は、 Floating IP エージェントのゲートウェイポート経由での Fixed IP アドレスへの直接のルーティングに対応していません。そのため、 BGP スピーカーは Fixed IP アドレスを広告できません。

以下のように Floating IP エージェントゲートウェイを確認することも、BGP スピーカーの動作確認の一助となるでしょう。

$ neutron port-list --device_owner="network:floatingip_agent_gateway"
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------------------------+
| id                                   | name | mac_address       | fixed_ips                                                                                              |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------------------------+
| 87cf2970-4970-462e-939e-00e808295dfa |      | fa:16:3e:7c:68:e3 | {"subnet_id": "8ed65d41-2b2a-4f3a-9f92-45adb266e01a", "ip_address": "203.0.113.12"}                    |
| 8d218440-0d2e-49d0-8a7b-3266a6146dc1 |      | fa:16:3e:9d:78:cf | {"subnet_id": "8ed65d41-2b2a-4f3a-9f92-45adb266e01a", "ip_address": "203.0.113.13"}                    |
| 87cf2970-4970-462e-939e-00e802281dfa |      | fa:16:3e:6b:18:e0 | {"subnet_id": "8ed65d41-2b2a-4f3a-9f92-45adb266e01a", "ip_address": "203.0.113.14"}                    |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------------------------+

IPv6

BGP 動的ルーティングは、 IPv6 経由のピアリングと IPv6 プレフィックスの広告に対応しています。

  • IPv6 経由のピアリングを有効にするには、 BGP ピアを作成する際に peer_ip に IPv6 アドレスを使用します。

  • IPv6 プレフィックスの広告を行うには、 ip_version=6 でアドレススコープを作成し、 ip_version=6 で BGP スピーカーを作成します。

注釈

IPv6 での DVR 機能は IPv4 での DVR を同様です。

高可用性

BGP 動的ルーティングでは、 BGP スピーカーを複数のエージェントにスケジューリングすることもできます。この場合、実際には同じピアに対してプレフィックス広告が複数送られることになります。あるエージェントが故障しても、ピアは残りの動作しているエージェントから広告を受信し続けます。

  1. 利用可能な動的ルーティングエージェントを表示します。

    $ neutron agent-list --agent-type=="BGP dynamic routing agent"
    +--------------------------------------+---------------------------+----------+-------------------+-------+----------------+---------------------------+
    | id                                   | agent_type                | host     | availability_zone | alive | admin_state_up | binary                    |
    +--------------------------------------+---------------------------+----------+-------------------+-------+----------------+---------------------------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | BGP dynamic routing agent | bgp-ha1  |                   | :-)   | True           | neutron-bgp-dragent       |
    | 1a2d33bb-9321-30a2-76ab-22eff3d2f56a | BGP dynamic routing agent | bgp-ha2  |                   | :-)   | True           | neutron-bgp-dragent       |
    +--------------------------------------+---------------------------+----------+-------------------+-------+----------------+---------------------------+
    
  2. BGP スピーカーを複数のエージェントにスケジューリングします。

    $ neutron bgp-dragent-speaker-add 37729181-2224-48d8-89ef-16eca8e2f77e bgpspeaker
    Associated BGP speaker bgpspeaker to the Dynamic Routing agent.
    
    $ neutron bgp-dragent-speaker-add 1a2d33bb-9321-30a2-76ab-22eff3d2f56a bgpspeaker
    Associated BGP speaker bgpspeaker to the Dynamic Routing agent.
    
    $ neutron bgp-dragent-list-hosting-speaker bgpspeaker
    +--------------------------------------+---------+----------------+-------+
    | id                                   | host    | admin_state_up | alive |
    +--------------------------------------+---------+----------------+-------+
    | 37729181-2224-48d8-89ef-16eca8e2f77e | bgp-ha1 | True           | :-)   |
    | 1a2d33bb-9321-30a2-76ab-22eff3d2f56a | bgp-ha2 | True           | :-)   |
    +--------------------------------------+---------+----------------+-------+
    
    $ neutron bgp-speaker-list-on-dragent 37729181-2224-48d8-89ef-16eca8e2f77e
    +--------------------------------------+------------+----------+------------+
    | id                                   | name       | local_as | ip_version |
    +--------------------------------------+------------+----------+------------+
    | 5f227f14-4f46-4eca-9524-fc5a1eabc358 | bgpspeaker |     1234 |          4 |
    +--------------------------------------+------------+----------+------------+
    
    $ neutron bgp-speaker-list-on-dragent 1a2d33bb-9321-30a2-76ab-22eff3d2f56a
    +--------------------------------------+------------+----------+------------+
    | id                                   | name       | local_as | ip_version |
    +--------------------------------------+------------+----------+------------+
    | 5f227f14-4f46-4eca-9524-fc5a1eabc358 | bgpspeaker |     1234 |          4 |
    +--------------------------------------+------------+----------+------------+
    
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.