doc: Add IPv6 usecase
This practical example shows a typical deployment usecase that provides global IPv6 prefixes for tenant networks. Change-Id: I15c0970f06abb2a710a4c3cfd7bcdb626dafd9cf
This commit is contained in:
parent
513ea649be
commit
2b75e2bfdc
@ -45,6 +45,7 @@ Contents
|
||||
reference/index
|
||||
cli/index
|
||||
contributor/index
|
||||
install/usecase-ipv6
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
540
doc/source/install/usecase-ipv6.rst
Normal file
540
doc/source/install/usecase-ipv6.rst
Normal file
@ -0,0 +1,540 @@
|
||||
..
|
||||
Copyright 2023 OSISM GmbH
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
not use this file except in compliance with the License. You may obtain
|
||||
a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing permissions and limitations
|
||||
under the License.
|
||||
|
||||
|
||||
Convention for heading levels in Neutron devref:
|
||||
======= Heading 0 (reserved for the title in a document)
|
||||
------- Heading 1
|
||||
~~~~~~~ Heading 2
|
||||
+++++++ Heading 3
|
||||
''''''' Heading 4
|
||||
(Avoid deeper levels because they do not render well.)
|
||||
|
||||
======================================================
|
||||
Use-case: Global IPv6 connectivity for tenant networks
|
||||
======================================================
|
||||
|
||||
Motivation
|
||||
----------
|
||||
|
||||
With IPv6 the use of NAT is strongly deprecated with the intention of allowing
|
||||
direct end-to-end connectivity between hosts. Thus the Neutron implementation
|
||||
does not provide a mechanism to create floating IPv6 addresses.
|
||||
|
||||
As a consequence, projects will want globally routed IPv6 adresses directly connected
|
||||
to their instances. As this will be difficult to achieve if you continue to allow
|
||||
your projects to choose their own favorite range of addresses, there are two
|
||||
possible solutions:
|
||||
|
||||
1. Set up a shared network to which your instances will be directly connected and
|
||||
configure this network with a public IPv6 prefix (*provider network*). This
|
||||
way instances will get a public IPv6 address that they can use without any
|
||||
restriction.
|
||||
2. Configure a *subnet pool* containing a range of public IPv6 prefixes, so that
|
||||
projects may configure their own networks by requesting a slice from that
|
||||
subnet pool instead of choosing their own.
|
||||
|
||||
Option 1 has some drawbacks, though:
|
||||
|
||||
- It places all projects into a single shared network, complicating things like
|
||||
per-project firewall rules or rDNS management.
|
||||
- If you want to dual-stack your instances (i.e. provide them with IPv4 and IPv6
|
||||
connectivity at the same time), you either need to use two different networks
|
||||
and attach your instances to both of them, or you will need to also assign a
|
||||
public IPv4 address to every instance, which may be considered a rather wasteful
|
||||
approach to dealing with this scarce resource.
|
||||
|
||||
So this document will describe how to set up option 2 by deploying *dynamic routing*.
|
||||
|
||||
Preparation
|
||||
-----------
|
||||
|
||||
Address scope
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Start by setting up an address scope that will be used by the BGP agent in order
|
||||
to select the set of prefixes to be announced over the BGP sessions. All commands shown
|
||||
in this section will require you to use admin credentials::
|
||||
|
||||
$ openstack address scope create --share --ip-version 6 ipv6-global
|
||||
+------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+------------+--------------------------------------+
|
||||
| id | ee2ee196-156c-424e-81e5-4d029c66190a |
|
||||
| ip_version | 6 |
|
||||
| name | ipv6-global |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| shared | True |
|
||||
+------------+--------------------------------------+
|
||||
|
||||
Subnet pool
|
||||
~~~~~~~~~~~
|
||||
|
||||
Next create the subnet pool that your projects will use to configure their subnets
|
||||
with. For a real deployment, use a globally routable network prefix instead
|
||||
of the documentation prefix that is used in this example::
|
||||
|
||||
$ openstack subnet pool create --address-scope ipv6-global --share --default \
|
||||
> --pool-prefix 2001:db8:1234::/48 --default-prefix-length 64 \
|
||||
> --min-prefix-length 64 --max-prefix-length 124 default-pool-ipv6
|
||||
+-------------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------------+--------------------------------------+
|
||||
| address_scope_id | ee2ee196-156c-424e-81e5-4d029c66190a |
|
||||
| created_at | 2017-02-24T15:28:27Z |
|
||||
| default_prefixlen | 64 |
|
||||
| default_quota | None |
|
||||
| description | |
|
||||
| id | 4c1661ba-b24c-4fda-8815-3f1fd29281af |
|
||||
| ip_version | 6 |
|
||||
| is_default | True |
|
||||
| max_prefixlen | 124 |
|
||||
| min_prefixlen | 64 |
|
||||
| name | default-pool-ipv6 |
|
||||
| prefixes | 2001:db8:1234::/48 |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| revision_number | 1 |
|
||||
| shared | True |
|
||||
| updated_at | 2017-02-24T15:28:27Z |
|
||||
+-------------------+--------------------------------------+
|
||||
|
||||
Public network
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Your public network, the network that the gateway ports of the project routers
|
||||
will be connected to, needs to be configured with the
|
||||
|
||||
For an existing deployment, you will usually already have a network defined
|
||||
using public IPv4 addresses for floating IPs and router gateway ports. This
|
||||
is the network that an IPv6 subnet needs to be added to, using same address
|
||||
scope that was used for the subnet pool above.
|
||||
|
||||
If you do not yet have such a network, you can create it with::
|
||||
|
||||
$ openstack network create --provider-network-type flat --provider-physical-network public --external public
|
||||
<output skipped>
|
||||
|
||||
The exact parameters that you need to specify depend on your deployment and
|
||||
are out of scope for this document, see the Neutron documentation for
|
||||
more details.
|
||||
|
||||
There are now three different options in order to make sure that you have
|
||||
an IPv6 subnet on this public network which is associated with the required
|
||||
address scope:
|
||||
|
||||
Using the shared subnet pool
|
||||
++++++++++++++++++++++++++++
|
||||
|
||||
Create the IPv6 subnet on the public network from the shared subnet pool
|
||||
above::
|
||||
|
||||
$ openstack subnet create --ip-version 6 --use-default-subnet-pool --network public public-ip6
|
||||
+-------------------+----------------------------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------------+----------------------------------------------------------+
|
||||
| allocation_pools | 2001:db8:1234::2-2001:db8:1234:0:ffff:ffff:ffff:ffff |
|
||||
| cidr | 2001:db8:1234::/64 |
|
||||
| created_at | 2017-02-27T10:23:00Z |
|
||||
| description | |
|
||||
| dns_nameservers | |
|
||||
| enable_dhcp | True |
|
||||
| gateway_ip | 2001:db8:1234::1 |
|
||||
| host_routes | |
|
||||
| id | 77551166-fb97-4ea5-912a-c17c75a05eda |
|
||||
| ip_version | 6 |
|
||||
| ipv6_address_mode | None |
|
||||
| ipv6_ra_mode | None |
|
||||
| name | public-ip6 |
|
||||
| network_id | 28c08355-cb8f-4b1b-b5fd-f5442e531b28 |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| revision_number | 2 |
|
||||
| segment_id | None |
|
||||
| service_types | |
|
||||
| subnetpool_id | 56a1b34b-7e0a-4a76-aac9-8893314ee2a4 |
|
||||
| updated_at | 2017-02-27T10:23:00Z |
|
||||
+-------------------+----------------------------------------------------------+
|
||||
|
||||
Using a dedicated subnet pool
|
||||
+++++++++++++++++++++++++++++
|
||||
|
||||
Create a second subnet pool containing just the specific prefix that you
|
||||
want to use for your public network::
|
||||
|
||||
$ openstack subnet pool create --address-scope ipv6-global --pool-prefix 2001:db8:4321:42::/64 --default-prefix-length 64 public-pool
|
||||
+-------------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------------+--------------------------------------+
|
||||
| address_scope_id | ee2ee196-156c-424e-81e5-4d029c66190a |
|
||||
| created_at | 2017-02-27T10:13:38Z |
|
||||
| default_prefixlen | 64 |
|
||||
| default_quota | None |
|
||||
| description | |
|
||||
| id | 56a1b34b-7e0a-4a76-aac9-8893314ee2a4 |
|
||||
| ip_version | 6 |
|
||||
| is_default | False |
|
||||
| max_prefixlen | 128 |
|
||||
| min_prefixlen | 64 |
|
||||
| name | public-pool |
|
||||
| prefixes | 2001:db8:4321:42::/64 |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| revision_number | 1 |
|
||||
| shared | False |
|
||||
| updated_at | 2017-02-27T10:13:38Z |
|
||||
+-------------------+--------------------------------------+
|
||||
|
||||
Create the IPv6 subnet on your public network::
|
||||
|
||||
$ openstack subnet create --ip-version 6 --subnet-pool public-pool --network public public-ip6
|
||||
+-------------------+----------------------------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------------+----------------------------------------------------------+
|
||||
| allocation_pools | 2001:db8:4321:42::2-2001:db8:4321:42:ffff:ffff:ffff:ffff |
|
||||
| cidr | 2001:db8:4321:42::/64 |
|
||||
| created_at | 2017-02-27T10:23:00Z |
|
||||
| description | |
|
||||
| dns_nameservers | |
|
||||
| enable_dhcp | True |
|
||||
| gateway_ip | 2001:db8:4321:42::1 |
|
||||
| host_routes | |
|
||||
| id | 77551166-fb97-4ea5-912a-c17c75a05eda |
|
||||
| ip_version | 6 |
|
||||
| ipv6_address_mode | None |
|
||||
| ipv6_ra_mode | None |
|
||||
| name | public-ip6 |
|
||||
| network_id | 28c08355-cb8f-4b1b-b5fd-f5442e531b28 |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| revision_number | 2 |
|
||||
| segment_id | None |
|
||||
| service_types | |
|
||||
| subnetpool_id | 56a1b34b-7e0a-4a76-aac9-8893314ee2a4 |
|
||||
| updated_at | 2017-02-27T10:23:00Z |
|
||||
+-------------------+----------------------------------------------------------+
|
||||
|
||||
Using subnet onboarding
|
||||
+++++++++++++++++++++++
|
||||
|
||||
If you have enabled the ``subnet_onboard`` extension in your Neutron deployment, there is
|
||||
the simpler option of simply onboarding an existing IPv6 subnet on your public network onto
|
||||
the default IPv6 subnet pool created above::
|
||||
|
||||
$ openstack network onboard subnets public default-pool-ipv6
|
||||
$ # This command does not generate any output
|
||||
|
||||
Verifying the address scope
|
||||
+++++++++++++++++++++++++++
|
||||
|
||||
After you have create the public IPv6 subnet using one of the options shown above, verify
|
||||
that the address scope for IPv6 indeed got set for the public network::
|
||||
|
||||
$ openstack network show public
|
||||
+---------------------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+---------------------------+--------------------------------------+
|
||||
| admin_state_up | UP |
|
||||
| availability_zone_hints | |
|
||||
| availability_zones | |
|
||||
| created_at | 2017-02-27T10:21:04Z |
|
||||
| description | |
|
||||
| dns_domain | None |
|
||||
| id | 28c08355-cb8f-4b1b-b5fd-f5442e531b28 |
|
||||
| ipv4_address_scope | None |
|
||||
| ipv6_address_scope | ee2ee196-156c-424e-81e5-4d029c66190a |
|
||||
| is_default | False |
|
||||
| mtu | 1500 |
|
||||
| name | public |
|
||||
| port_security_enabled | True |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| provider:network_type | flat |
|
||||
| provider:physical_network | external |
|
||||
| provider:segmentation_id | None |
|
||||
| qos_policy_id | None |
|
||||
| revision_number | 6 |
|
||||
| router:external | External |
|
||||
| segments | None |
|
||||
| shared | False |
|
||||
| status | ACTIVE |
|
||||
| subnets | 77551166-fb97-4ea5-912a-c17c75a05eda |
|
||||
| updated_at | 2017-02-27T10:23:00Z |
|
||||
+---------------------------+--------------------------------------+
|
||||
|
||||
.. note::
|
||||
It is essential that the same address scope is being used both for the
|
||||
public subnet and the tenant subnets. If there is a mismatch, the
|
||||
BGP announcement will not happen and connectivity will be broken.
|
||||
|
||||
Dynamic routing setup
|
||||
---------------------
|
||||
|
||||
Now that you have prepared the network configuration, the next step is to
|
||||
configure the dynamic routing part. First add the service plugin to your
|
||||
``neutron.conf`` file. Note that depending on your deployment, there may
|
||||
be other plugins already configured, keep those unchanged, just add the
|
||||
BGP plugin::
|
||||
|
||||
[DEFAULT]
|
||||
# You may have other plugins enabled here depending on your environment
|
||||
# Important thing is you add the BgpPlugin to the list
|
||||
service_plugins = neutron_dynamic_routing.services.bgp.bgp_plugin.BgpPlugin,neutron.services.l3_router.l3_router_plugin.L3RouterPlugin
|
||||
# In case you run into issues, this will also be helpful
|
||||
debug = true
|
||||
|
||||
You need to restart the Neutron service in order activate the plugin.
|
||||
|
||||
Now you can create your first BGP speaker. Set the IP version to 6, select some
|
||||
private ASN that can be used for this POC and disable advertising floating IPs::
|
||||
|
||||
$ openstack bgp speaker create --ip-version 6 --local-as 65000 --no-advertise-floating-ip-host-routes bgp1
|
||||
+-----------------------------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-----------------------------------+--------------------------------------+
|
||||
| advertise_floating_ip_host_routes | False |
|
||||
| advertise_tenant_networks | True |
|
||||
| id | b9547458-7bdd-4738-bd57-a985055fc59c |
|
||||
| ip_version | 6 |
|
||||
| local_as | 65000 |
|
||||
| name | bgp1 |
|
||||
| networks | [] |
|
||||
| peers | [] |
|
||||
| project_id | c67d6ba16ea2484597061245e5258c1e |
|
||||
+-----------------------------------+--------------------------------------+
|
||||
|
||||
Add your public network to this speaker, indicating that you want to advertise all those
|
||||
tenant networks here, which have a router with the public network as gateway::
|
||||
|
||||
$ openstack bgp speaker add network bgp1 public
|
||||
$ # This command does not generate any output
|
||||
|
||||
Assuming your external router has the address 2001:db8:4321:e0::1, configure it as
|
||||
BGP peer and add it to the BGP speaker::
|
||||
|
||||
$ openstack bgp peer create --peer-ip 2001:db8:4321:e0::1 --remote-as 65001 bgp-peer1
|
||||
+------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+------------+--------------------------------------+
|
||||
| auth_type | none |
|
||||
| id | 0183260e-b1d0-40ae-994f-075668b99676 |
|
||||
| name | bgp-peer1 |
|
||||
| peer_ip | 2001:db8:4321:e0::1 |
|
||||
| project_id | c67d6ba16ea2484597061245e5258c1e |
|
||||
| remote_as | 65001 |
|
||||
| tenant_id | c67d6ba16ea2484597061245e5258c1e |
|
||||
+------------+--------------------------------------+
|
||||
$ openstack bgp speaker add peer bgp1 bgp-peer1
|
||||
$ # This command does not generate any output
|
||||
|
||||
Now configure the Neutron BGP agent, add the following data into your ``bgp_dragent.ini``
|
||||
configuration file::
|
||||
|
||||
[BGP]
|
||||
bgp_speaker_driver = neutron_dynamic_routing.services.bgp.agent.driver.os_ken.driver.OsKenBgpDriver
|
||||
|
||||
# 32-bit BGP identifier, typically an IPv4 address owned by the system running
|
||||
# the BGP DrAgent.
|
||||
bgp_router_id = 192.0.2.42
|
||||
|
||||
Again you will have to restart the agent in order for it to pick up the new
|
||||
configuration. If all goes well, the agent should register itself in your setup::
|
||||
|
||||
$ openstack network agent list --agent-type bgp
|
||||
+--------------------------------------+---------------------------+--------------+-------------------+-------+-------+---------------------+
|
||||
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
|
||||
+--------------------------------------+---------------------------+--------------+-------------------+-------+-------+---------------------+
|
||||
| 68d6e83c-db04-4711-b031-44cf3fb51bb7 | BGP dynamic routing agent | network-node | None | :-) | UP | neutron-bgp-dragent |
|
||||
+--------------------------------------+---------------------------+--------------+-------------------+-------+-------+---------------------+
|
||||
|
||||
As the final step, use the agent ID from above and tell the agent that it
|
||||
should host our BGP speaker::
|
||||
|
||||
$ openstack bgp dragent add speaker 68d6e83c-db04-4711-b031-44cf3fb51bb7 bgp1
|
||||
$ # This command does not generate any output
|
||||
|
||||
The view from the outside
|
||||
-------------------------
|
||||
|
||||
The final step is to configure your outside router to accept the BGP session
|
||||
from the Neutron dynamic routing agent, so it can receive the prefix
|
||||
announcements and forward traffic accordingly.
|
||||
|
||||
In this example we assume a system running [BIRD](http://bird.network.cz/), which
|
||||
we configure to be the remote end of the BGP session like this::
|
||||
|
||||
protocol bgp bgp1 {
|
||||
description "Neutron agent";
|
||||
passive on;
|
||||
local 2001:db8:4321:e0::1 as 65001;
|
||||
neighbor 2001:db8:4321:e0::42 as 65000;
|
||||
}
|
||||
|
||||
Verify that the session gets established as expected::
|
||||
|
||||
bird> show proto bgp1
|
||||
name proto table state since info
|
||||
bgp1 BGP master up 00:01:50 Established
|
||||
|
||||
Tenant networks
|
||||
---------------
|
||||
|
||||
You have now prepared everything on the admin side of things, so let's have
|
||||
a look at how your users should configure their networking.
|
||||
The commands in this section are meant to be executed with user credentials::
|
||||
|
||||
$ openstack network create mynet
|
||||
+---------------------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+---------------------------+--------------------------------------+
|
||||
| admin_state_up | UP |
|
||||
| availability_zone_hints | |
|
||||
| availability_zones | |
|
||||
| created_at | 2017-02-27T10:26:22Z |
|
||||
| description | |
|
||||
| dns_domain | None |
|
||||
| id | 1f20da97-ddd4-40f8-b8d3-6321de8671a0 |
|
||||
| ipv4_address_scope | None |
|
||||
| ipv6_address_scope | None |
|
||||
| is_default | None |
|
||||
| mtu | 1500 |
|
||||
| name | mynet |
|
||||
| port_security_enabled | True |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| provider:network_type | None |
|
||||
| provider:physical_network | None |
|
||||
| provider:segmentation_id | None |
|
||||
| qos_policy_id | None |
|
||||
| revision_number | 3 |
|
||||
| router:external | Internal |
|
||||
| segments | None |
|
||||
| shared | False |
|
||||
| status | ACTIVE |
|
||||
| subnets | |
|
||||
| updated_at | 2017-02-27T10:26:22Z |
|
||||
+---------------------------+--------------------------------------+
|
||||
|
||||
In order to add an IPv6 prefix, simply request one from the default pool::
|
||||
|
||||
$ openstack subnet create --ip-version 6 --use-default-subnet-pool \
|
||||
> --ipv6-address-mode slaac --ipv6-ra-mode slaac --network mynet mysubnet
|
||||
+------------------------+--------------------------------------------------------+
|
||||
| Field | Value |
|
||||
+------------------------+--------------------------------------------------------+
|
||||
| allocation_pools | 2001:db8:1234:1::2-2001:db8:1234:1:ffff:ffff:ffff:ffff |
|
||||
| cidr | 2001:db8:1234:1::/64 |
|
||||
| created_at | 2017-02-27T11:14:23Z |
|
||||
| description | |
|
||||
| dns_nameservers | |
|
||||
| enable_dhcp | True |
|
||||
| gateway_ip | 2001:db8:1234:1::1 |
|
||||
| host_routes | |
|
||||
| id | 193f7620-6c4c-4adc-9bb5-ff73c9b08d59 |
|
||||
| ip_version | 6 |
|
||||
| ipv6_address_mode | slaac |
|
||||
| ipv6_ra_mode | slaac |
|
||||
| name | mysubnet |
|
||||
| network_id | 1f20da97-ddd4-40f8-b8d3-6321de8671a0 |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| revision_number | 2 |
|
||||
| segment_id | None |
|
||||
| service_types | |
|
||||
| subnetpool_id | 4c1661ba-b24c-4fda-8815-3f1fd29281af |
|
||||
| updated_at | 2017-02-27T11:14:23Z |
|
||||
| use_default_subnetpool | true |
|
||||
+------------------------+--------------------------------------------------------+
|
||||
|
||||
For outside connectivity create a router, add an interface into your project net and set the gateway to be
|
||||
the public network::
|
||||
|
||||
$ openstack router create router1
|
||||
+-------------------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------------------+--------------------------------------+
|
||||
| admin_state_up | UP |
|
||||
| availability_zone_hints | |
|
||||
| availability_zones | |
|
||||
| created_at | 2017-02-27T12:59:06Z |
|
||||
| description | |
|
||||
| distributed | False |
|
||||
| external_gateway_info | None |
|
||||
| flavor_id | None |
|
||||
| ha | False |
|
||||
| id | d2db0603-fda2-4305-a1de-e793a36c0770 |
|
||||
| name | router1 |
|
||||
| project_id | 6de6f29dcf904ab8a12e8ca558f532e9 |
|
||||
| revision_number | None |
|
||||
| routes | |
|
||||
| status | ACTIVE |
|
||||
| updated_at | 2017-02-27T12:59:06Z |
|
||||
+-------------------------+--------------------------------------+
|
||||
$ openstack router add subnet router1 mysubnet
|
||||
$ openstack router set --external-gateway public router1
|
||||
|
||||
Finally boot an instance and verify that it gets an IPv6 address assigned::
|
||||
|
||||
$ openstack server create --flavor c1 --image cirros vm1
|
||||
$ openstack server list
|
||||
+--------------------------------------+------+--------+-------------+--------------------------------------------+------------+
|
||||
| ID | Name | Status | Power State | Networks | Image Name |
|
||||
+--------------------------------------+------+--------+-------------+--------------------------------------------+------------+
|
||||
| 17b2ac04-9a17-45ff-be30-401aa8331a66 | vm1 | ACTIVE | Running | mynet=2001:db8:1234:1:f816:3eff:fe53:f89e | cirros |
|
||||
+--------------------------------------+------+--------+-------------+--------------------------------------------+------------+
|
||||
$ openstack console log show vm1 | grep -A1 -B1 2001
|
||||
eth0 Link encap:Ethernet HWaddr FA:16:3E:53:F8:9E
|
||||
inet6 addr: 2001:db8:1234:1:f816:3eff:fe53:f89e/64 Scope:Global
|
||||
inet6 addr: fe80::f816:3eff:fe53:f89e/64 Scope:Link
|
||||
|
||||
.. note::
|
||||
|
||||
Most cloud images are built to insist on receiving an IPv4 address via DHCP,
|
||||
so there will be a considerable delay durging booting while waiting for this
|
||||
to run into a timeout. In order to avoid the resulting delay, you could add
|
||||
an IPv4 subnet to your project net.
|
||||
|
||||
.. note::
|
||||
|
||||
There is a similar concern regarding access to the metadata provided by the
|
||||
compute service. While Neutron does provide the option to access metadata via
|
||||
IPv6, this is not available in all deployments and not supported by all cloud
|
||||
images. You can work around this either by adding and IPv4 subnet like mentioned
|
||||
above or by using the config drive option to provide metadata to your instance.
|
||||
|
||||
Verification
|
||||
------------
|
||||
|
||||
As an admin you can now verify that the tenant network gets listed for advertisement::
|
||||
|
||||
$ openstack bgp speaker list advertised routes bgp1
|
||||
+----+--------------------+---------------------+
|
||||
| ID | Destination | Nexthop |
|
||||
+----+--------------------+---------------------+
|
||||
| | 2001:db8:1234::/64 | 2001:db8:4321:42::c |
|
||||
+----+--------------------+---------------------+
|
||||
|
||||
And verify it is being seen on your outside router::
|
||||
|
||||
bird> show route 2001:db8:1234:1::/64
|
||||
2001:db8:1234:1::/64 via 2001:db8:4321:2::5 on ens3 [bgp1 12:06:50 from 2001:db8:4321:e0::42] * (100/0) [i]
|
||||
|
||||
As extra bonus, verify that the instance is reachable from the router::
|
||||
|
||||
router01:~$ ping6 -c3 2001:db8:1234:1:f816:3eff:fecd:6bf4
|
||||
PING 2001:db8:1234:1:f816:3eff:fecd:6bf4(2001:db8:1234:1:f816:3eff:fecd:6bf4) 56 data bytes
|
||||
64 bytes from 2001:db8:1234:1:f816:3eff:fecd:6bf4: icmp_seq=1 ttl=63 time=1.80 ms
|
||||
64 bytes from 2001:db8:1234:1:f816:3eff:fecd:6bf4: icmp_seq=2 ttl=63 time=0.724 ms
|
||||
64 bytes from 2001:db8:1234:1:f816:3eff:fecd:6bf4: icmp_seq=3 ttl=63 time=1.04 ms
|
||||
|
||||
--- 2001:db8:1234:1:f816:3eff:fecd:6bf4 ping statistics ---
|
||||
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
|
||||
rtt min/avg/max/mdev = 0.724/1.190/1.803/0.454 ms
|
||||
router01:~$ ssh -6 2001:db8:1234:1:f816:3eff:fe58:f80a -l cirros
|
||||
cirros@2001:db8:1234:1:f816:3eff:fe58:f80a's password:
|
||||
$
|
Loading…
Reference in New Issue
Block a user