このセクションでは、次の項目を説明します。
OpenStack Networking でデュアルスタックのネットワークを有効にするのに必要なことは、 ip_version
フィールドが 6
のサブネットを作成し、 IPv6 関連属性 (ipv6_ra_mode
と ipv6_address_mode
) を設定することです。 ipv6_ra_mode
と ipv6_address_mode
の詳細は次の節で説明します。最後の 1 つは、サブネットの cidr
を適切に指定することです。
This section does not include the following items:
Juno 時点では、 OpenStack Networking サービス (neutron) のサブネットオブジェクトには 2 つの属性があり、この属性により API ユーザーは IPv6 サブネットの設定が可能です。
2 つの IPv6 関連の属性があります。
ipv6_ra_mode
ipv6_address_mode
これらの属性には以下の値を設定できます。
slaac
dhcpv6-stateful
dhcpv6-stateless
これらの属性に値を設定しないままにすることもできます。
ipv6_address_mode
属性は、 OpenStack がどのようにアドレス割り当てを行うかを制御するのに使用されます。 ゲストインスタンスが IPv6 アドレスを取得する方法には様々なものがあり、この属性は Networking API のユーザーに選択肢を公開しています。
ipv6_ra_mode
属性は、サブネットに対するルーター広告を制御するのに使用されます。
The IPv6 Protocol uses Internet Control Message Protocol packets (ICMPv6) as a way to distribute information about networking. ICMPv6 packets with the type flag set to 134 are called “Router Advertisement” packets, which contain information about the router and the route that can be used by guest instances to send network traffic.
The ipv6_ra_mode
is used to specify if the Networking service should
generate Router Advertisement packets for a subnet.
ipv6 ra mode | ipv6 address mode | radvd A,M,O | External Router A,M,O | 説明 |
---|---|---|---|---|
指定なし | 指定なし | オフ | 未定義 | Juno より前の IPv6 動作と後方互換性があります。 |
指定なし | slaac | オフ | 1,0,0 | ゲストインスタンスは SLAAC を使って OpenStack 外のルーターから IPv6 アドレスを取得します。 |
指定なし | dhcpv6-stateful | オフ | 0,1,1 | 今のところ参照実装では未実装です。 |
指定なし | dhcpv6-stateless | オフ | 1,0,1 | 今のところ参照実装では未実装です。 |
slaac | 指定なし | 1,0,0 | オフ | 今のところ参照実装では未実装です。 |
dhcpv6-stateful | 指定なし | 0,1,1 | オフ | 今のところ参照実装では未実装です。 |
dhcpv6-stateless | 指定なし | 1,0,1 | オフ | 今のところ参照実装では未実装です。 |
slaac | slaac | 1,0,0 | オフ | ゲストインスタンスは SLAAC を使って OpenStack が管理する radvd から IPv6 アドレスを取得します。 |
dhcpv6-stateful | dhcpv6-stateful | 0,1,1 | オフ | ゲストインスタンスは DHCPv6 stateful を使って dnsmasq から IPv6 アドレスを取得し、DHCPv6 を使って dnsmasq から追加情報を取得します。 |
dhcpv6-stateless | dhcpv6-stateless | 1,0,1 | オフ | ゲストインスタンスは SLAAC を使って OpenStack が管理する radvd から IPv6 アドレスを取得し、DHCPv6 を使って dnsmasq から追加情報を取得します。 |
slaac | dhcpv6-stateful | 無効な組み合わせ | ||
slaac | dhcpv6-stateless | 無効な組み合わせ | ||
dhcpv6-stateful | slaac | 無効な組み合わせ | ||
dhcpv6-stateful | dhcpv6-stateless | 無効な組み合わせ | ||
dhcpv6-stateless | slaac | 無効な組み合わせ | ||
dhcpv6-stateless | dhcpv6-stateful | 無効な組み合わせ |
Linux ブリッジと Open vSwitch のデータプレーンモジュールは両方とも、ゲスト同士やルーターポートとの間の IPv6 パケットの転送をサポートしています。 IPv4 と同様に、送信元から宛先へ IPv6 を使ってパケットをデータプレーンが適切に転送できるようにするように特別な設定や構成は必要ありません。また、ポートがすべて接続され、MAC アドレスのラーニングが行われた後は、同じネットワーク上のホスト間のリンクローカルアドレス (LLA) パケットの転送も、OpenStack コンポーネントによる特別な関与や設定なしに、正しく行われます。
There are three methods currently implemented for a subnet to get its
cidr
in OpenStack:
In the future, additional techniques could be used to allocate subnets to projects, for example, use of an external IPAM module.
注釈
An external DHCPv6 server in theory could override the full address OpenStack assigns based on the EUI-64 address, but that would not be wise as it would not be consistent through the system.
IPv6 では、アドレス設定と追加のネットワーク情報の提供方法に関して、 3 つの異なるアドレス割り当て方法がサポートされています。
OpenStack は、OpenStack Networking が OpenStack 上のネットワークに対して RA、 DHCP relay、 DHCPv6 アドレス、追加の情報を直接提供するようにセットアップすることも、こうした機能を使用するドライバーに基いて外部のルーターやサービスに移譲できるようにすることもできます。 Neutron サブネットには、 ipv6_ra_mode
と ipv6_address_mode
という 2 つの属性があり、これらの属性により IPv6 アドレスとネットワーク情報をプロジェクトのインスタンスにどのように提供するかが決定されます。
ipv6_ra_mode
: RA を誰が送信するかを決定します。ipv6_address_mode
: インスタンスが IPv6 アドレス、デフォルトゲートウェイ、追加の情報をどのように取得するかを決定します。上記の 2 つの属性が意味を持つには、そのサブネットの enable_dhcp
属性が True になっていなければなりません。
SLAAC を使う場合、現在サポートされている ipv6_ra_mode
と ipv6_address_mode
の組み合わせは以下の通りです。
ipv6_ra_mode | ipv6_address_mode | 結果 |
---|---|---|
指定なし | SLAAC | アドレスは EUI-64 を使って割り当てられます。ルーティング情報は外部ルーターにより提供されます。 |
SLAAC | SLAAC | アドレスは EUI-64 を使って割り当てられます。ルーティング情報も OpenStack Networking が提供します。 |
ipv6_ra_mode
を slaac
に設定すると、 OpenStack Networking のルーターはルーター作成時に RA パケットを送信するように設定されます。 RA メッセージのアドレス設定フラグは以下の値に設定されます。
New or existing neutron networks that contain a SLAAC enabled IPv6 subnet will result in all neutron ports attached to the network receiving IPv6 addresses. This is because when RA broadcast messages are sent out on a neutron network, they are received by all IPv6 capable ports on the network, and each port will then configure an IPv6 address based on the information contained in the RA packet. In some cases, an IPv6 SLAAC address will be added to a port, in addition to other IPv4 and IPv6 addresses that the port already has been assigned.
For DHCPv6, the currently supported combinations are as follows:
ipv6_ra_mode | ipv6_address_mode | 結果 |
---|---|---|
DHCPv6-stateless | DHCPv6-stateless | Addresses are assigned through RAs (see SLAAC above) and optional information is delivered through DHCPv6. |
DHCPv6-stateful | DHCPv6-stateful | アドレスと追加の情報は DHCPv6 を使って割り当てられます。 |
Setting DHCPv6-stateless for ipv6_ra_mode
configures the neutron
router with radvd agent to send RAs. The list below captures the
values set for the address configuration flags in the RA packet in
this scenario. Similarly, setting DHCPv6-stateless for
ipv6_address_mode
configures neutron DHCP implementation to provide
the additional network information.
Setting DHCPv6-stateful for ipv6_ra_mode
configures the neutron
router with radvd agent to send RAs. The list below captures the
values set for the address configuration flags in the RA packet in
this scenario. Similarly, setting DHCPv6-stateful for
ipv6_address_mode
configures neutron DHCP implementation to provide
addresses and additional network information through DHCPv6.
The behavior of the neutron router for IPv6 is different than for IPv4 in a few ways.
ネットワークのデフォルトゲートウェイポートして動作する内部ルーターポートでは、そのネットワークに関連付けられた IPv6 サブネットすべてで 1 つの共通のポートが共有されます。つまり、IPv6 内部ルーターインターフェースは複数の IPv6 アドレスを持ち、そのアドレスはそのネットワークに関連付けられた各 IPv6 サブネットから 1 つずつ割り当てられ、それとは別に IPv4 サブネットに対する IPv4 内部ルーターインターフェースが作成されるということになります。一方、外部ルーターポートではデュアルスタック設定が可能で、 IPv4 と IPv6 アドレスの両方が割り当てられます。
グローバルに一意なアドレス (Global Unicast Address; GUA) プレフィックスとアドレスを割り当てられた neutron プロジェクトネットワークは、外部の世界にアクセスする際に neutron ルーターの外部ゲートウェイポートでの NAT が不要です。 NAT が不要なため、外部ルーターポートは外部ネットワークと送受信するための GUA が必要ありません。これは、neutron 外部ネットワークに GUA な IPv6 サブネットプレフィックスが不要なことを意味します。デフォルトでは、外部ゲートウェイポートに関連付けられた IPv6 LLA がルーティング用に使用されます。このシナリオに対応するため、 neutron の router-gateway-set API に変更が行われ、 neutron ルーターに関連付ける外部ネットワークで IPv6 サブネットが必須ではなくなりました。 上流ルーターの LLA アドレスは以下の 2 つの方法で学習されます。
ipv6_gateway
フラグで外部ルーターのゲートウェイ LLA を設定できます。ipv6_gateway
フラグが設定されていない場合、 neutron ルーターはネクストホップの LLA を自動的に学習します。実際には、 ipv6_gateway
フラグが上流ルーターから受信する RA よりも優先されます。 GUA のネクストホップを使いたい場合は、外部ルーターポートにサブネットを確保して、そのサブネットのゲートウェイとして上流ルーターの GUA アドレスを割り当てることで実現できます。
注釈
It should be possible for projects to communicate with each other on an isolated network (a network without a router port) using LLA with little to no participation on the part of OpenStack. The authors of this section have not proven that to be true for all scenarios.
注釈
When using the neutron L3 agent in a configuration where it is
auto-configuring an IPv6 address via SLAAC, and the agent is
learning its default IPv6 route from the ICMPv6 Router Advertisement,
it may be necessary to set the
net.ipv6.conf.<physical_interface>.accept_ra
sysctl to the
value 2
in order for routing to function correctly.
For a more detailed description, please see the bug.
分散仮想ルーター (DVR) 機能が有効の場合も IPv6 は動きますが、すべての入力方向、出力方向のトラフィックが centralized router を経由します (つまり、分散ではありません)。IPv6 が DVR が完全に動作するようになるには、まだ開発が必要です。
VPNaaS は IPv6 に対応していますが、 Kilo およびそれ以前のリリースでは、バグがあり、使い方が制限されてしまう可能性があります。 Liberty リリースでより徹底的にテストとバグ修正が行われ、 IPv6 ベースの VPNaaS は IPv4 の場合と同様に使えるようになりました。 peer_address
と peer_cidr
の一方または両方に IPv6 アドレスを指定できます。上で説明したアドレスモード属性とルーターモード属性の組み合わせにより、IPv6 サポートのレベルが変わることはありません。
TODO
FWaaS では、IPv6 を使ったルールを作成できます。
At the current time OpenStack Networking does not provide any facility to support any flavor of NAT with IPv6. Unlike IPv4 there is no current embedded support for floating IPs with IPv6. It is assumed that the IPv6 addressing amongst the projects is using GUAs with no overlap across the projects.
OpenStack は現在のところ RFC 4941 で定義されたプライバシー拡張に対応していません。使用するインターフェース識別子と DUID は、 RFC 2373 に書かれているように直接 MAC に基づいて生成される必要があります。コンピュートホストは、インターフェース識別子の生成時にプライバシー拡張を使用しないように設定しなければいけません。
There is no provisions for an IPv6-based metadata service similar to what is provided for IPv4. In the case of dual stacked guests though it is always possible to use the IPv4 metadata service instead.
Unlike IPv4 the MTU of a given network can be conveyed in the RA messages sent by the router as well as in the DHCP messages.
As of the Kilo release, considerable effort has gone in to ensuring the project network can handle dual stack IPv6 and IPv4 transport across the variety of configurations described above. OpenStack control network can be run in a dual stack configuration and OpenStack API endpoints can be accessed via an IPv6 network. At this time, Open vSwitch (OVS) tunnel types - STT, VXLAN, GRE, support both IPv4 and IPv6 endpoints.
Liberty リリース以降では、 OpenStack Networking は IPv6 prefix delegation に対応しています。このセクションでは、IPv6 prefix delegation を使って サブネットの CIDR の自動的な割り当てを行えるようにするのに必要な設定と利用手順を説明します。これにより、 OpenStack 管理者は (OpenStack Networking サービスの) 外部の DHCPv6 サーバーを使って、プロジェクトのネットワークのプレフィックスの管理を行えるようになります。
注釈
prefix delegation が利用できるようになったのは Liberty リリースです。Kilo リリースでは利用できません。 HA ルーターと DVR ルーターは現時点ではこの機能に対応していません。
prefix delegation を有効にするには、 /etc/neutron/neutron.conf
ファイルを編集します。 OpenStack Liberty を実行している場合には、以下の変更を行います。
default_ipv6_subnet_pool = prefix_delegation
OpenStack Mitaka を実行している場合には、以下の変更を行います。
ipv6_pd_enabled = True
注釈
prefix delegation 用としてデフォルトの dibbler ベースのドライバーを使っていない場合は、 /etc/neutron/neutron.conf
でドライバーの設定も必要です。
pd_dhcp_driver = <class path to driver>
デフォルト以外のドライバーの場合、追加の設定が必要な場合があります。 追加の設定 を参照してください。
これにより、ユーザーが CIDR またはサブネットプール ID をサブネット作成時に指定しなかった場合、 OpenStack Networking は prefix delegation 機構を使ってサブネット割り当てを行うようになります。
To use this feature, you need a prefix delegation capable DHCPv6 server that is reachable from your OpenStack Networking node(s). This could be software running on the OpenStack Networking node(s) or elsewhere, or a physical router. For the purposes of this guide we are using the open-source DHCPv6 server, Dibbler. Dibbler is available in many Linux package managers, or from source at tomaszmrugalski/dibbler.
OpenStack Networking の prefix delegation ドライバーの参照実装を使う場合、 Dibbler は、 DHCPv6 クライアントとなる OpenStack Networking ノード上にインストールする必要があります。バージョン 1.0.1 以上が必要です。
このガイドでは、外部ネットワークブリッジが存在するネットワークノード上で Dibbler サーバーが動いていることを前提にします。すでに prefix delegation に対応した DHCPv6 サーバーがそこで動いている場合には、次のセクションはスキップできます。
Dibbler をインストールしたら、 /etc/dibbler/server.conf
ファイルを編集します。
script "/var/lib/dibbler/pd-server.sh"
iface "br-ex" {
pd-class {
pd-pool 2001:db8:2222::/48
pd-length 64
}
}
上記の設定ファイルで使用されているオプションは以下の通りです:
script
: プレフィックスの移譲、解放が行われた際に実行されるスクリプトを指します。このスクリプトが必要なのは、サブネットのインスタンスが外部ネットワークへのアクセスが必要な場合だけです。詳しくは後述します。iface
: prefix delegation メッセージを待ち受けるネットワークインターフェース名。pd-pool
: 移譲される prefix の取得元となるプレフィックス。外部ネットワークアクセスが不要の場合は設定例のままで十分です。アクセスが必要な場合は、一意でグローバルに到達可能なプレフィックスを指定する必要があります。pd-length
: 移譲されるプレフィックスの長さ。現在の OpenStack Networking の参照実装で動作するためには、この値は 64 でなければいけません。インスタンスに外部ネットワークへのアクセスを提供する場合、 Dibbler サーバーは移譲するプレフィックスそれぞれについて新しい経路を作成する必要があります。これは、上記の設定ファイルで指定した名前のスクリプトにより行われます。 ファイル /var/lib/dibbler/pd-server.sh
を編集します。
if [ "$PREFIX1" != "" ]; then
if [ "$1" == "add" ]; then
sudo ip -6 route add ${PREFIX1}/64 via $REMOTE_ADDR dev $IFACE
fi
if [ "$1" == "delete" ]; then
sudo ip -6 route del ${PREFIX1}/64 via $REMOTE_ADDR dev $IFACE
fi
fi
上記のスクリプトで使用されている変数は以下の通りです。
$PREFIX1
: Dibbler サーバーにより追加、削除されるプレフィックス$1
: 実行中の操作$REMOTE_ADDR
: 要求を行った Dibbler クライアントの IP アドレス$IFACE
: 要求を受信したネットワークインターフェースThe above is all you need in this scenario, but more information on installing, configuring, and running Dibbler is available in the Dibbler user guide, at Dibbler – a portable DHCPv6.
Dibbler サーバーを開始するには、以下を実行します。
# dibbler-server run
もしくは headless モードで実行するには、以下のようにします。
# dibbler-server start
DevStack を使用する場合には、 stack.sh
が完了した後にサーバーを開始することが重要です。必要なネットワークインターフェースが作成された状態でサーバーを開始するためです。
最初に、ネットワークと IPv6 サブネットを作成します。
$ openstack network create ipv6-pd
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2017-01-25T19:26:01Z |
| description | |
| headers | |
| id | 4b782725-6abe-4a2d-b061-763def1bb029 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| mtu | 1450 |
| name | ipv6-pd |
| port_security_enabled | True |
| project_id | 61b7eba037fd41f29cfba757c010faff |
| provider:network_type | vxlan |
| provider:physical_network | None |
| provider:segmentation_id | 46 |
| revision_number | 3 |
| router:external | Internal |
| shared | False |
| status | ACTIVE |
| subnets | |
| tags | [] |
| updated_at | 2017-01-25T19:26:01Z |
+---------------------------+--------------------------------------+
$ openstack subnet create --ip-version 6 --ipv6-ra-mode slaac \
--ipv6-address-mode slaac --use-default-subnet-pool \
--network ipv6-pd ipv6-pd-1
+------------------------+--------------------------------------+
| Field | Value |
+------------------------+--------------------------------------+
| allocation_pools | ::2-::ffff:ffff:ffff:ffff |
| cidr | ::/64 |
| created_at | 2017-01-25T19:31:53Z |
| description | |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | ::1 |
| headers | |
| host_routes | |
| id | 1319510d-c92c-4532-bf5d-8bcf3da761a1 |
| ip_version | 6 |
| ipv6_address_mode | slaac |
| ipv6_ra_mode | slaac |
| name | ipv6-pd-1 |
| network_id | 4b782725-6abe-4a2d-b061-763def1bb029 |
| project_id | 61b7eba037fd41f29cfba757c010faff |
| revision_number | 2 |
| service_types | |
| subnetpool_id | prefix_delegation |
| updated_at | 2017-01-25T19:31:53Z |
| use_default_subnetpool | True |
+------------------------+--------------------------------------+
サブネットは、 prefix delegation でアドレスが割り当てられるまでは、仮の CIDR で作成されます。重複エラーが発生しないかぎりは、仮の CIDR を持つサブネットは何個でも存在できます。 subnetpool_id は自動的に prefix_delegation
に設定されます。
prefix delegation 処理を行うには、ルーターインターフェースを作成し、このサブネットと外部ネットワーク上にアクティブなインターフェースを持つルーターを接続します。
$ openstack router add subnet router1 ipv6-pd-1
prefix delegation 機構により、外部ネットワーク経由で prefix delegation サーバーに要求が送信され、 prefix delegation サーバーは移譲するプレフィックスを返します。サブネットは新しいプレフィックスを持つように更新され、新しい IP アドレスがすべてのポートに発行されます。
$ openstack subnet show ipv6-pd-1
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| allocation_pools | 2001:db8:2222:6977::2-2001:db8:2222: |
| | 6977:ffff:ffff:ffff:ffff |
| cidr | 2001:db8:2222:6977::/64 |
| created_at | 2017-01-25T19:31:53Z |
| description | |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 2001:db8:2222:6977::1 |
| host_routes | |
| id | 1319510d-c92c-4532-bf5d-8bcf3da761a1 |
| ip_version | 6 |
| ipv6_address_mode | slaac |
| ipv6_ra_mode | slaac |
| name | ipv6-pd-1 |
| network_id | 4b782725-6abe-4a2d-b061-763def1bb029 |
| project_id | 61b7eba037fd41f29cfba757c010faff |
| revision_number | 4 |
| service_types | |
| subnetpool_id | prefix_delegation |
| updated_at | 2017-01-25T19:35:26Z |
+-------------------+--------------------------------------+
prefix delegation サーバーがグローバルに到達可能なプレフィックスを移譲して経路を設定するように設定されている場合には、このサブネット上のポートを持つインスタンスはこの時点で外部ネットワークにアクセスできるようになります。
ルーターインターフェースを削除すると、サブネットは仮の CIDR に戻り、すべてのポートの IP アドレスが更新されます。移譲されていたプレフィックスは解放され、必要に応じて自動的に新たに使用されます。
The following link provides a great step by step tutorial on setting up IPv6 with OpenStack: Tenant IPV6 deployment in OpenStack Kilo release.
dhcpv6_pd_agent 用のドライバーを有効にするには、 /etc/neutron/neutron.conf
: で pd_dhcp_driver に dhcpv6_pd_agent を指定します。
pd_dhcp_driver = neutron_pd_agent
neutron-pd-agent が prefix delegation サーバーと通信できるように、外部通信に使うネットワークインターフェースを設定しなければいけません。 DevStack では、デフォルト値として br-ex
が設定されます。
pd_interface = br-ex
DevStack 実行後は、以下のコマンドを実行して neutron-pd-agent を開始します。
neutron-pd-agent --config-file /etc/neutron/neutron.conf
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.