OpenStack Neutronで、IPv6ネットワーク動作を体験する [dhcpv6-stateful編]

Rocky版OpenStack Neutronを活用して、<b>"dhcpv6-statefulモードによるIPv6ネットワーク"</b>のデプロイ動作を体験してみます。ただし、デプロイするテナントネットワークは、単一のL3セグメント構成のみです。
外部への通信を想定したルータ環境の配備とか、一切、想定していません。
なお、Neutronでは、オプションとして、<b>Prefix Delegation</b>が利用できるようですが、本記事では、扱いません。
さらに、OpenStack Neutronを活用してIPv6ネットワークをでデプロイする方法は、`dhcpv6-stateful`以外に、次の方法もあります。

- [OpenStack Neutronで、IPv6ネットワーク動作を体験する \[slaac編\]](https://qiita.com/ttsubo/items/917bbad9f39bcb47dcb2)
- [OpenStack Neutronで、IPv6ネットワーク動作を体験する \[dhcpv6-stateless編\]](https://qiita.com/ttsubo/items/dc47e4d37f4df5e140ab)

ちなみに、"[OpenStack Neutronで、IPv4ネットワーク動作を体験する](https://qiita.com/ttsubo/items/a58bafe0bd01831ecc8a)"と比較してみると、理解の助けになるかもしれません。


# ■ どうやって、dhcpv6-statefulモードのIPv6ネットワークをデプロイするの？
OpenStack Neutronで、IPv6ネットワークをデプロイする場合、`ipv6_address_mode`と`ipv6_ra_mode`のアトリビュートによって決定されます。
なお、"[OpenStack Documantation: IPv6](https://docs.openstack.org/neutron/pike/admin/config-ipv6.html)"では、次のように記載されています。

> For DHCPv6, the currently supported combinations are as follows:

|ipv6_ra_mode|	ipv6_address_mode|	Result                                      |
|------------|-------------------|--------------------------------------------------|
|DHCPv6-stateless	|DHCPv6-stateless	|Addresses are assigned through RAs (see SLAAC above) and optional information is delivered through DHCPv6.|
|DHCPv6-stateful	|DHCPv6-stateful	|Addresses and optional information are assigned using DHCPv6.|

> Setting DHCPv6-stateful for <b>ipv6_ra_mode</b> 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 <b>ipv6_address_mode</b> configures neutron DHCP implementation to provide addresses and additional network information through DHCPv6.

> - Auto Configuration Flag = 0
- Managed Configuration Flag = 1
- Other Configuration Flag = 1


## □ ipv6_address_mode / ipv6_ra_mode アトリビュート

- slaac
- dhcpv6-stateful
- dhcpv6-stateless

Neutron標準の機能を使って、IPv6ネットワークをデプロイする場合には、`ipv6_address_mode`と`ipv6_ra_mode`には、同じ値を設定しておけば良いです。

## □ サブネット管理
`"dhcpv6-stateful"`で、IPv6アドレスを管理する場合、特に、制約は発生しないようです。


# ■ dhcpv6-statefulモードでの想定されるNeutron基本動作
IPv6ネットワークをデプロイすると、Network Node上にテナント専用ルータ環境として<b>radvd</b>が配備されます。
その後、クライアント環境は、ICMPv6 RAメッセージを受信して、RAのフラグオプションにある"Managed address configuration" flag（m-flag）と "Other configuration" flag（o-flag）から、次の振る舞いを判断します。
そして、クライアント側のNICインタフェースには、DHCPv6プロトコルを使用して、IPv6アドレスが割り当てられます。
（詳細は、[「RFC-4861: Neighbor Discovery for IP version 6 (IPv6)」](https://tools.ietf.org/html/rfc4861)を参照のこと。）

![NeutronによるIPv4:IPv6ネットワーク構築.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103595/7e952e38-bb73-67b2-3a41-4e6c4fa87954.png)


## □ Routerリソース作成時のデプロイ作業の流れ
ここでのNeutron内部処理のゴールは、Neutron Manager内部で保持するデータベースに、テナントネットワーク用のRouter基本情報を登録する程度でしょう。
この段階では、一切、Compute Node、Network Nodeに対する設定作業は行われません。

## □ Networkリソース作成時のデプロイ作業の流れ
ここでのNeutron内部処理のゴールは、Neutron Manager内部で保持するデータベースに、テナントネットワークの基本情報を登録する程度でしょう。
この段階では、一切、Compute Node、Network Nodeに対する設定作業は行われません。

## □ Subnetリソース作成時のデプロイ作業の流れ
ここでのNeutron内部処理でのゴールは、テナント専用DHCPサーバ環境を配備することです。

![NeutronによるIPv4:IPv6ネットワーク構築.002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103595/9d3eb2e4-19e9-860a-9eac-ce5b5e937f32.png)

- NeutronManagerは、Subnetリソースに応じた<b>IPAM機構</b>を配備する
- Neutron-dhcp-agentは、新たにSubnetリソースが作成されたことを検知する
- Neutron-dhcp-agentは、NeutronManagerに、DHCP専用のPortリソースの作成を依頼する
- NeutronManagerは、DHCP専用のPortリソースを作成する
- NeutronManagerは、DHCPサーバ用Port追加設定を、Neutron-openvswitch-agentに依頼する
- Neutron-openvswitch-agentは、OpenvSwitchの`br-int`ブリッジ上に、DHCPサーバ用Portを追加する
- NeutronManagerは、DHCP環境の配備を、Neutron-dhcp-agentに依頼する
- Neutron-dhcp-agentは、DHCP専用のPortリソースに基づき、DHCPサーバ環境を整備する
  1. Neutron-dhcp-agentは、DHCP用ネームスペースを作成する
  2. Neutron-dhcp-agentは、DHCP用ネームスペース内にdnsmasq環境を整備する

## □ Routerリソース更新時のデプロイ作業の流れ
ここでのNeutron内部処理でのゴールは、別途、Neutronルータがクライアン環境に、ICMPv6 RAメッセージを送信できるように<b>radvd</b>を設定することです。

- NeutronManagerは、Routerリソースへのインタフェース追加処理を開始する
- NeutronManagerは、ROUTER専用のPortリソースを作成する
- NeutronManagerは、ROUTERサーバ用Port追加設定を、Neutron-openvswitch-agentに依頼する
- Neutron-openvswitch-agentは、OpenvSwitchの`br-int`ブリッジ上に、ROUTERサーバ用Portを追加する
- NeutronManagerは、ROUTER環境の配備を、Neutron-l3-agentに依頼する
- Neutron-l3-agentは、ROUTER専用のPortリソースに基づき、ROUTER環境を整備する
  1. Neutron-l3-agentは、ROUTER用ネームスペースを作成する
  2. Neutron-l3-agentは、ROUTER用ネームスペース内にradvd環境を整備する

## □ Portリソース作成時のデプロイ作業の流れ
ここでのNeutron内部処理でのゴールは、別途、クライアン環境から、DHCP取得依頼が発生した場合に、IPv4アドレスを配布できるようDHCPサーバ環境を設定することです。

- NeutronManagerは、Portリソースに対応するMACアドレスを割り当てる
- NeutronManagerは、<b>IPAM機構</b>にPortリソース情報のエントリする
- NeutronManagerは、<b>IPAM機構</b>での内部処理に基づき、IPv6アドレスを割り当てる
- NeutronManagerは、DHCPサーバ環境でのIPv6アドレス払い出し設定を、Neutron-dhcp-agentに依頼する
- Neutron-dhcp-agentは、dnsmasq設定ファイルに当該エントリを設定する
- Neutron-dhcp-agentは、dnsmasqプロセスを再起動(kill -HUP)して、エントリ設定を有効化する


# ■ テナントネットワークのデプロイの作業履歴
Rocky版OpenStack Neutronを使って、Neutron基本動作を、ステップbyステップで確認していきます。

## 1. OpenvSwitch初期構成の確認
OpenvSwitchの初期状態として動作しているbridge構成を確認しておきます
なお、今回は、all_in_one環境で作業しているので、Compute NodeとNetwork Nodeは、同一サーバで動作しています

### (1.1) OpenvSwitchの全体構成を確認する

```
# ovs-vsctl show
3b782d6f-a956-4c33-85fa-527d9eb2a0d5
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-ex
        Port "eth0"
            Interface "eth0"
        Port br-ex
            Interface br-ex
                type: internal
    Bridge br-tun
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port br-tun
            Interface br-tun
                type: internal
        Port patch-int
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    ovs_version: "2.10.1"
```

### (1.2) `br-int`ブリッジに収容されたPortを確認する

```
# ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000b675f3f6eb45
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 3(patch-tun): addr:ce:e0:2b:eb:f5:41
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-int): addr:b6:75:f3:f6:eb:45
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

### (1.3) `br-ex`ブリッジに収容されたPortを確認する

```
# ovs-ofctl show br-ex
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000526d7a08dd4d
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(eth0): addr:52:54:00:2b:07:df
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-ex): addr:52:6d:7a:08:dd:4d
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

## 2. Routerリソース作成の作業履歴
実際に、Routerリソースを作成します

### (2.1) Routerリソースを作成する

```
# openstack router create ipv6-router-dhcpv6-stateful
```

### (2.2) Routerリソースを確認しておく

```
# openstack router show ipv6-router-dhcpv6-stateful -f json
{
  "external_gateway_info": null, 
  "status": "ACTIVE", 
  "availability_zone_hints": "", 
  "availability_zones": "", 
  "description": "", 
  "admin_state_up": "UP", 
  "created_at": "2020-03-17T03:03:43Z", 
  "tags": "", 
  "distributed": null, 
  "updated_at": "2020-03-17T03:03:43Z", 
  "interfaces_info": "[]", 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "flavor_id": null, 
  "revision_number": 0, 
  "routes": "", 
  "ha": null, 
  "id": "dd86d13e-8d8c-448f-bd34-e907a9ab09c4", 
  "name": "ipv6-router-dhcpv6-stateful"
}
```

## 3. Networkリソース作成の作業履歴
実際に、Networkリソースを作成します

### (3.1) Networkリソースを作成する

```
# openstack network create ipv6-net-dhcpv6-stateful
```
### (3.2) Networkリソースを確認しておく

```
# openstack network show ipv6-net-dhcpv6-stateful -f json
{
  "provider:physical_network": null, 
  "ipv6_address_scope": null, 
  "dns_domain": null, 
  "is_vlan_transparent": null, 
  "revision_number": 2, 
  "port_security_enabled": true, 
  "provider:network_type": null, 
  "id": "39ba3329-8476-4127-8d78-3c83e6932ff4", 
  "router:external": "Internal", 
  "availability_zone_hints": "", 
  "availability_zones": "", 
  "segments": null, 
  "name": "ipv6-net-dhcpv6-stateful", 
  "ipv4_address_scope": null, 
  "shared": false, 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "status": "ACTIVE", 
  "subnets": "", 
  "description": "", 
  "tags": "", 
  "updated_at": "2020-03-17T03:04:38Z", 
  "is_default": null, 
  "provider:segmentation_id": null, 
  "qos_policy_id": null, 
  "admin_state_up": "UP", 
  "created_at": "2020-03-17T03:04:38Z", 
  "mtu": 1450
}
```



## 4. Subnetリソース作成の作業履歴
Subnetリソースを作成します

### (4.1) Subnetリソースを作成する

```
# openstack subnet create \
--subnet-range 2001:db8:2222::/64 \
--ip-version 6 \
--ipv6-ra-mode dhcpv6-stateful \
--ipv6-address-mode dhcpv6-stateful \
--network ipv6-net-dhcpv6-stateful \
ipv6-subnet-dhcpv6-stateful
```

### (4.2) Subnetリソースを確認しておく
```
# openstack subnet show ipv6-subnet-dhcpv6-stateful -f json
{
  "service_types": "", 
  "description": "", 
  "enable_dhcp": true, 
  "segment_id": null, 
  "network_id": "39ba3329-8476-4127-8d78-3c83e6932ff4", 
  "created_at": "2020-03-17T03:05:26Z", 
  "tags": "", 
  "dns_nameservers": "", 
  "updated_at": "2020-03-17T03:05:26Z", 
  "ipv6_ra_mode": "dhcpv6-stateful", 
  "allocation_pools": "2001:db8:2222::2-2001:db8:2222:0:ffff:ffff:ffff:ffff", 
  "gateway_ip": "2001:db8:2222::1", 
  "revision_number": 0, 
  "ipv6_address_mode": "dhcpv6-stateful", 
  "ip_version": 6, 
  "host_routes": "", 
  "cidr": "2001:db8:2222::/64", 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "id": "b06dad55-e686-4129-94f0-cc29a5d85863", 
  "subnetpool_id": null, 
  "name": "ipv6-subnet-dhcpv6-stateful"
}
```

### (4.3) Portリソース（DHCP）を確認しておく

```
# openstack port list -f json
[
  {
    "Status": "DOWN", 
    "Fixed IP Addresses": "ip_address='2001:db8:2222::2', subnet_id='b06dad55-e686-4129-94f0-cc29a5d85863'", 
    "ID": "28dd452a-ec9a-4949-9f27-aa79d0480d69", 
    "MAC Address": "fa:16:3e:2d:c0:9b", 
    "Name": ""
  }
]
```
```
# openstack port show 28dd452a-ec9a-4949-9f27-aa79d0480d69 -f json
{
  "allowed_address_pairs": "", 
  "extra_dhcp_opts": "", 
  "updated_at": "2020-03-17T03:05:27Z", 
  "dns_domain": null, 
  "device_owner": "network:dhcp", 
  "revision_number": 3, 
  "port_security_enabled": false, 
  "fixed_ips": "ip_address='2001:db8:2222::2', subnet_id='b06dad55-e686-4129-94f0-cc29a5d85863'", 
  "id": "28dd452a-ec9a-4949-9f27-aa79d0480d69", 
  "description": "", 
  "binding_vnic_type": "normal", 
  "qos_policy_id": null, 
  "mac_address": "fa:16:3e:2d:c0:9b", 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "status": "DOWN", 
  "binding_profile": null, 
  "binding_vif_type": null, 
  "binding_vif_details": null, 
  "tags": "", 
  "dns_assignment": null, 
  "trunk_details": null, 
  "security_group_ids": "", 
  "device_id": "dhcpf4ce2912-1ee5-5084-ac17-a8fe43c4ca19-39ba3329-8476-4127-8d78-3c83e6932ff4", 
  "name": "", 
  "admin_state_up": "UP", 
  "network_id": "39ba3329-8476-4127-8d78-3c83e6932ff4", 
  "dns_name": null, 
  "created_at": "2020-03-17T03:05:27Z", 
  "data_plane_status": null, 
  "binding_host_id": null
}
```
### (4.4) DHCP用ネームスペースが正しく作成されたことを確認する

```
# ip netns
qdhcp-39ba3329-8476-4127-8d78-3c83e6932ff4 (id: 0)
```
```
# ip netns exec qdhcp-39ba3329-8476-4127-8d78-3c83e6932ff4 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
15: tap28dd452a-ec: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:2d:c0:9b brd ff:ff:ff:ff:ff:ff
    inet6 2001:db8:2222::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe2d:c09b/64 scope link 
       valid_lft forever preferred_lft forever
```
### (4.5) DHCP用ネームスペースで動作するdnsmasqプロセスを確認する

```
# ps -ef|grep dnsmasq
nobody   18708     1  0 12:05 ?        00:00:00 dnsmasq --no-hosts --no-resolv --pid-file=/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/host --addn-hosts=/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/opts --dhcp-leasefile=/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/leases --dhcp-match=set:ipxe,175 --local-service --bind-interfaces --dhcp-range=set:tag0,2001:db8:2222::,static,64,86400s --dhcp-option-force=option:mtu,1450 --dhcp-lease-max=16777216 --conf-file= --domain=openstacklocal
```
### (4.6) dnsmasqの各種設定ファイルを確認する

#### (4.6.1) hostファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/host
fa:16:3e:2d:c0:9b,host-2001-db8-2222--2.openstacklocal,[2001:db8:2222::2] 
```
#### (4.6.2) add_hostファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/addn_hosts
2001:db8:2222::2	host-2001-db8-2222--2.openstacklocal host-2001-db8-2222--2
```
#### (4.6.3) optファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/opts
tag:tag0,option6:domain-search,openstacklocal
```
#### (4.6.4) leaseファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/leases
duid 00:01:00:01:26:02:fb:11:fa:16:3e:2d:c0:9b
```

### (4.7) OpenvSwitchの構成を確認する

#### (4.7.1) OpenvSwitchの全体構成を確認する

```
# ovs-vsctl show
3b782d6f-a956-4c33-85fa-527d9eb2a0d5
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true

    ...(snip)

    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "tap28dd452a-ec"
            tag: 4095
            Interface "tap28dd452a-ec"
                type: internal
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    ovs_version: "2.10.1"
```

#### (4.7.2) `br-int`ブリッジに収容されたPortを確認する

```
# ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000b675f3f6eb45
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 3(patch-tun): addr:ce:e0:2b:eb:f5:41
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 8(tap28dd452a-ec): addr:fa:16:3e:2d:c0:9b
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-int): addr:b6:75:f3:f6:eb:45
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

## 5.Routerリソース更新の作業履歴
Routerリソースに、subnetを追加します

### (5.1) Routerリソースを更新する
```
# openstack router add subnet ipv6-router-dhcpv6-stateful ipv6-subnet-dhcpv6-stateful
```

### (5.2) Routerリソースを確認しておく

```
# openstack router show ipv6-router-dhcpv6-stateful -f json
{
  "external_gateway_info": null, 
  "status": "ACTIVE", 
  "availability_zone_hints": "", 
  "availability_zones": "nova", 
  "description": "", 
  "admin_state_up": "UP", 
  "created_at": "2020-03-17T03:03:43Z", 
  "tags": "", 
  "distributed": null, 
  "updated_at": "2020-03-17T03:17:49Z", 
  "interfaces_info": "[{\"subnet_id\": \"b06dad55-e686-4129-94f0-cc29a5d85863\", \"ip_address\": \"2001:db8:2222::1\", \"port_id\": \"af4aa6d2-dd0b-4cd4-9b03-cb8d2887ea15\"}]", 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "flavor_id": null, 
  "revision_number": 1, 
  "routes": "", 
  "ha": null, 
  "id": "dd86d13e-8d8c-448f-bd34-e907a9ab09c4", 
  "name": "ipv6-router-dhcpv6-stateful"
}
```
### (5.3) Portリソース（ROUTER）を確認しておく

```
# openstack port list -f json
[
  {
    "Status": "DOWN", 
    "Fixed IP Addresses": "ip_address='2001:db8:2222::2', subnet_id='b06dad55-e686-4129-94f0-cc29a5d85863'", 
    "ID": "28dd452a-ec9a-4949-9f27-aa79d0480d69", 
    "MAC Address": "fa:16:3e:2d:c0:9b", 
    "Name": ""
  }, 
  {
    "Status": "DOWN", 
    "Fixed IP Addresses": "ip_address='2001:db8:2222::1', subnet_id='b06dad55-e686-4129-94f0-cc29a5d85863'", 
    "ID": "af4aa6d2-dd0b-4cd4-9b03-cb8d2887ea15", 
    "MAC Address": "fa:16:3e:1b:4a:02", 
    "Name": ""
  }
]
```
```
# openstack port show af4aa6d2-dd0b-4cd4-9b03-cb8d2887ea15 -f json
{
  "allowed_address_pairs": "", 
  "extra_dhcp_opts": "", 
  "updated_at": "2020-03-17T03:17:50Z", 
  "dns_domain": null, 
  "device_owner": "network:router_interface", 
  "revision_number": 5, 
  "port_security_enabled": false, 
  "fixed_ips": "ip_address='2001:db8:2222::1', subnet_id='b06dad55-e686-4129-94f0-cc29a5d85863'", 
  "id": "af4aa6d2-dd0b-4cd4-9b03-cb8d2887ea15", 
  "description": "", 
  "binding_vnic_type": "normal", 
  "qos_policy_id": null, 
  "mac_address": "fa:16:3e:1b:4a:02", 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "status": "DOWN", 
  "binding_profile": null, 
  "binding_vif_type": null, 
  "binding_vif_details": null, 
  "tags": "", 
  "dns_assignment": null, 
  "trunk_details": null, 
  "security_group_ids": "", 
  "device_id": "dd86d13e-8d8c-448f-bd34-e907a9ab09c4", 
  "name": "", 
  "admin_state_up": "UP", 
  "network_id": "39ba3329-8476-4127-8d78-3c83e6932ff4", 
  "dns_name": null, 
  "created_at": "2020-03-17T03:17:48Z", 
  "data_plane_status": null, 
  "binding_host_id": null
}
```

### (5.4) ROUTER用ネームスペースが正しく作成されたことを確認する

```
# ip netns
qrouter-dd86d13e-8d8c-448f-bd34-e907a9ab09c4 (id: 3)
qdhcp-39ba3329-8476-4127-8d78-3c83e6932ff4 (id: 0)
```
```
# ip netns exec qrouter-dd86d13e-8d8c-448f-bd34-e907a9ab09c4 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
16: qr-af4aa6d2-dd: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:1b:4a:02 brd ff:ff:ff:ff:ff:ff
    inet6 2001:db8:2222::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe1b:4a02/64 scope link 
       valid_lft forever preferred_lft forever
```
### (5.5) ROUTER用ネームスペースで動作するradvdプロセスを確認する

```
# ps -ef|grep radvd
neutron  19866     1  0 12:17 ?        00:00:00 radvd -C /var/lib/neutron/ra/dd86d13e-8d8c-448f-bd34-e907a9ab09c4.radvd.conf -p /var/lib/neutron/external/pids/dd86d13e-8d8c-448f-bd34-e907a9ab09c4.pid.radvd -u neutron -m syslog
neutron  19867 19866  0 12:17 ?        00:00:00 radvd -C /var/lib/neutron/ra/dd86d13e-8d8c-448f-bd34-e907a9ab09c4.radvd.conf -p /var/lib/neutron/external/pids/dd86d13e-8d8c-448f-bd34-e907a9ab09c4.pid.radvd -u neutron -m syslog
```
### (5.6) radvdの設定ファイルを確認する

```text:/var/lib/neutron/ra/dd86d13e-8d8c-448f-bd34-e907a9ab09c4.radvd.conf
interface qr-af4aa6d2-dd
{
   AdvSendAdvert on;
   MinRtrAdvInterval 30;
   MaxRtrAdvInterval 100;

   
   AdvLinkMTU 1450;
   

   

   
   AdvManagedFlag on;
   

   

   

   
   prefix 2001:db8:2222::/64
   {
        AdvOnLink on;
        AdvAutonomous off;
   };
   
};
```

### (5.7) dnsmasqの各種設定ファイルを確認する

#### (5.7.1) hostファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/host
fa:16:3e:2d:c0:9b,host-2001-db8-2222--2.openstacklocal,[2001:db8:2222::2]
fa:16:3e:1b:4a:02,host-2001-db8-2222--1.openstacklocal,[2001:db8:2222::1]
```
#### (5.7.2) add_hostファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/addn_hosts
2001:db8:2222::2	host-2001-db8-2222--2.openstacklocal host-2001-db8-2222--2
2001:db8:2222::1	host-2001-db8-2222--1.openstacklocal host-2001-db8-2222--1
```
#### (5.7.3) optファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/opts
tag:tag0,option6:domain-search,openstacklocal
```

#### (5.7.4) leaseファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/leases
duid 00:01:00:01:26:02:fd:e1:fa:16:3e:2d:c0:9b
```

### (5.8) OpenvSwitchの構成を確認する

#### (5.8.1) OpenvSwitchの全体構成を確認する

```
# ovs-vsctl show
3b782d6f-a956-4c33-85fa-527d9eb2a0d5
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-ex
        Port "eth0"
            Interface "eth0"
        Port br-ex
            Interface br-ex
                type: internal

    ...(snip)

    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "tap28dd452a-ec"
            tag: 4095
            Interface "tap28dd452a-ec"
                type: internal
        Port "qr-af4aa6d2-dd"
            tag: 4095
            Interface "qr-af4aa6d2-dd"
                type: internal
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    ovs_version: "2.10.1"
```

#### (5.8.2) `br-int`ブリッジに収容されたPortを確認する

```
# ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000b675f3f6eb45
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 3(patch-tun): addr:ce:e0:2b:eb:f5:41
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 8(tap28dd452a-ec): addr:fa:16:3e:2d:c0:9b
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 9(qr-af4aa6d2-dd): addr:fa:16:3e:1b:4a:02
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-int): addr:b6:75:f3:f6:eb:45
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

#### (5.8.3) `br-ex`ブリッジに収容されたPortを確認する

```
# ovs-ofctl show br-ex
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000526d7a08dd4d
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(eth0): addr:52:54:00:2b:07:df
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-ex): addr:52:6d:7a:08:dd:4d
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

## 6.Portリソース作成の作業履歴
Portリソースを作成します

### (6.1) Portリソースを作成する
```
# openstack port create --network ipv6-net-dhcpv6-stateful ipv6-port-dhcpv6-stateful
```

### (6.2) Portリソースを確認しておく
```
# openstack port show ipv6-port-dhcpv6-stateful -f json
{
  "allowed_address_pairs": "", 
  "extra_dhcp_opts": "", 
  "updated_at": "2020-03-17T03:27:41Z", 
  "dns_domain": null, 
  "device_owner": "", 
  "revision_number": 2, 
  "port_security_enabled": true, 
  "fixed_ips": "ip_address='2001:db8:2222::b', subnet_id='b06dad55-e686-4129-94f0-cc29a5d85863'", 
  "id": "f332ed7a-b831-4928-a967-e21e21419975", 
  "description": "", 
  "binding_vnic_type": "normal", 
  "qos_policy_id": null, 
  "mac_address": "fa:16:3e:90:ef:a1", 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "status": "DOWN", 
  "binding_profile": null, 
  "binding_vif_type": null, 
  "binding_vif_details": null, 
  "tags": "", 
  "dns_assignment": null, 
  "trunk_details": null, 
  "security_group_ids": "ae012f61-83a5-43e6-9cd8-dfeae6e62110", 
  "device_id": "", 
  "name": "ipv6-port-dhcpv6-stateful", 
  "admin_state_up": "UP", 
  "network_id": "39ba3329-8476-4127-8d78-3c83e6932ff4", 
  "dns_name": null, 
  "created_at": "2020-03-17T03:27:41Z", 
  "data_plane_status": null, 
  "binding_host_id": null
}
```

### (6.3) dnsmasqの各種設定ファイルを確認する

#### (6.3.1) hostファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/host
fa:16:3e:2d:c0:9b,host-2001-db8-2222--2.openstacklocal,[2001:db8:2222::2]
fa:16:3e:1b:4a:02,host-2001-db8-2222--1.openstacklocal,[2001:db8:2222::1]
fa:16:3e:90:ef:a1,host-2001-db8-2222--b.openstacklocal,[2001:db8:2222::b]
```
#### (6.3.2) add_hostファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/addn_hosts
2001:db8:2222::2	host-2001-db8-2222--2.openstacklocal host-2001-db8-2222--2
2001:db8:2222::1	host-2001-db8-2222--1.openstacklocal host-2001-db8-2222--1
2001:db8:2222::b	host-2001-db8-2222--b.openstacklocal host-2001-db8-2222--b
```
#### (6.3.3) optファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/opts
tag:tag0,option6:domain-search,openstacklocal
```

#### (6.3.4) leaseファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/leases
duid 00:01:00:01:26:02:fd:e1:fa:16:3e:2d:c0:9b
```

### (6.4) radvdの設定ファイルを確認する

```text:/var/lib/neutron/ra/dd86d13e-8d8c-448f-bd34-e907a9ab09c4.radvd.conf
interface qr-af4aa6d2-dd
{
   AdvSendAdvert on;
   MinRtrAdvInterval 30;
   MaxRtrAdvInterval 100;

   
   AdvLinkMTU 1450;
   

   

   
   AdvManagedFlag on;
   

   

   

   
   prefix 2001:db8:2222::/64
   {
        AdvOnLink on;
        AdvAutonomous off;
   };
   
};
```

### (6.5) OpenvSwitchの構成を確認する

#### (6.5.1) OpenvSwitchの全体構成を確認する

```
# ovs-vsctl show
3b782d6f-a956-4c33-85fa-527d9eb2a0d5
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-ex
        Port "eth0"
            Interface "eth0"
        Port br-ex
            Interface br-ex
                type: internal

    ...(snip)

    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "tap28dd452a-ec"
            tag: 4095
            Interface "tap28dd452a-ec"
                type: internal
        Port "qr-af4aa6d2-dd"
            tag: 4095
            Interface "qr-af4aa6d2-dd"
                type: internal
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    ovs_version: "2.10.1"
```

#### (6.5.2) `br-int`ブリッジに収容されたPortを確認する

```
# ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000b675f3f6eb45
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 3(patch-tun): addr:ce:e0:2b:eb:f5:41
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 8(tap28dd452a-ec): addr:fa:16:3e:2d:c0:9b
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 9(qr-af4aa6d2-dd): addr:fa:16:3e:1b:4a:02
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-int): addr:b6:75:f3:f6:eb:45
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

#### (6.5.3) `br-ex`ブリッジに収容されたPortを確認する

```
# ovs-ofctl show br-ex
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000526d7a08dd4d
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(eth0): addr:52:54:00:2b:07:df
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-ex): addr:52:6d:7a:08:dd:4d
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

# ■ テナントネットワーク動作確認

クライアント環境のネットワークインタフェースには、事前に、<b>"fa:16:3e:90:ef:a1"</b>のMACアドレスを設定しておき、<b>"2001:db8:2222::b"</b>のIPv6アドレスを自動で割り当てることが期待値です

```
# openstack port show ipv6-port-dhcpv6-stateful -f json
{
  ...(snip)

  "fixed_ips": "ip_address='2001:db8:2222::b', subnet_id='b06dad55-e686-4129-94f0-cc29a5d85863'",

  ...(snip)

  "mac_address": "fa:16:3e:90:ef:a1",

  ...(snip)
}
```

## 7. クライアント環境整備の作業履歴
DHCPv6プロトコルを使用して、IPv6アドレスの割り当てが確認できるよう、クライアント環境を整備します

### (7.1) client用ネームスペースを作成する

```
# ip netns add client
# ip netns
client
qrouter-dd86d13e-8d8c-448f-bd34-e907a9ab09c4 (id: 3)
qdhcp-39ba3329-8476-4127-8d78-3c83e6932ff4 (id: 0)
```

### (7.2) vethインターフェイスを作成し、片方の端点をclient用ネームスペースに設定する

```
# ip link add ovs-veth0 type veth peer name client-veth0
# ip link set client-veth0 netns client
```

### (7.3) `OpenvSwitch`の`br-int`構成を確認し、各Port収容で使用している`tag`を把握しておく（この例の場合だと、`"4095"`である）

```
# ovs-vsctl show
3b782d6f-a956-4c33-85fa-527d9eb2a0d5
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true

    ...(snip)
    
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "tap28dd452a-ec"
            tag: 4095
            Interface "tap28dd452a-ec"
                type: internal
        Port "qr-af4aa6d2-dd"
            tag: 4095
            Interface "qr-af4aa6d2-dd"
                type: internal
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    ovs_version: "2.10.1"
```

### (7.4) vethインターフェイスの対向側の端点を`OpenvSwitch`の`br-int`に収容設定する
```
# ovs-vsctl add-port br-int ovs-veth0 tag=4095
```
```
# ovs-vsctl show
3b782d6f-a956-4c33-85fa-527d9eb2a0d5
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true

    ...(snip)

    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "tap28dd452a-ec"
            tag: 4095
            Interface "tap28dd452a-ec"
                type: internal
        Port "qr-af4aa6d2-dd"
            tag: 4095
            Interface "qr-af4aa6d2-dd"
                type: internal
        Port br-int
            Interface br-int
                type: internal
        Port "ovs-veth0"
            tag: 4095
            Interface "ovs-veth0"
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    ovs_version: "2.10.1"
```

### (7.5) client側vethインターフェイスにMACアドレスを設定する

```
# ip netns exec client ip link set dev client-veth0 address fa:16:3e:90:ef:a1
```
```
# ip netns exec client ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
17: client-veth0@if18: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether fa:16:3e:90:ef:a1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
```

### (7.6) vethインターフェイスを`UP`に設定する
```
# ip netns exec client ip link set client-veth0 up
# ip link set ovs-veth0 up
```
```
# ip netns exec client ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
17: client-veth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:90:ef:a1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::f816:3eff:fe90:efa1/64 scope link 
       valid_lft forever preferred_lft forever
```
```
# ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000b675f3f6eb45
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 3(patch-tun): addr:ce:e0:2b:eb:f5:41
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 8(tap28dd452a-ec): addr:fa:16:3e:2d:c0:9b
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 9(qr-af4aa6d2-dd): addr:fa:16:3e:1b:4a:02
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 10(ovs-veth0): addr:5a:2d:ff:a1:ec:34
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 LOCAL(br-int): addr:b6:75:f3:f6:eb:45
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

## 8. dhclient動作確認の作業履歴
実際に、DHCPv6プロトコルを使用して、IPv6アドレスの割り当てを確認します

### (8.1) dhclientを起動する

```
# ip netns exec client dhclient -6 client-veth0
```

### (8.2) DHCPv6プロトコルで払い出されたIPv6動作を確認する

#### (8.2.1) IPv6アドレスを確認する
クライアント環境に、<b>"2001:db8:2222::b/64"</b>のIPv6アドレスが割り当てられたことが確認できました

```
# ip netns exec client ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
17: client-veth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:90:ef:a1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 2001:db8:2222::b/64 scope global dynamic 
       valid_lft 7489sec preferred_lft 7189sec
    inet6 fe80::f816:3eff:fe90:efa1/64 scope link 
       valid_lft forever preferred_lft forever
```
#### (8.2.2) ルーティング情報を確認する
radvd環境が動作しているインタフェースのリンクローカルアドレスがデフォルトゲートウェイとして設定されていました

```
# ip netns exec client ip -6 route show
2001:db8:2222::/64 dev client-veth0 proto kernel metric 256 expires 86393sec mtu 1450 pref medium
fe80::/64 dev client-veth0 proto kernel metric 256 mtu 1450 pref medium
default via fe80::f816:3eff:fe1b:4a02 dev client-veth0 proto ra metric 1024 expires 293sec mtu 1450 hoplimit 64 pref medium
```

#### (8.2.3) DHCPサーバとの疎通性を確認する
dnsmasq環境が動作しているインタフェースに対して、pingを打ってみましょう

```
# ip netns exec client ping6 2001:db8:2222::2
PING 2001:db8:2222::2(2001:db8:2222::2) 56 data bytes
64 bytes from 2001:db8:2222::2: icmp_seq=1 ttl=64 time=0.693 ms
64 bytes from 2001:db8:2222::2: icmp_seq=2 ttl=64 time=0.121 ms
64 bytes from 2001:db8:2222::2: icmp_seq=3 ttl=64 time=0.123 ms
64 bytes from 2001:db8:2222::2: icmp_seq=4 ttl=64 time=0.038 ms
^C
--- 2001:db8:2222::2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.038/0.243/0.693/0.262 ms
```

#### (8.2.4) radvdサーバとの疎通性を確認する
radvd環境が動作しているインタフェースに対して、pingを打ってみましょう

```
# ip netns exec client ping6 2001:db8:2222::1
PING 2001:db8:2222::1(2001:db8:2222::1) 56 data bytes
64 bytes from 2001:db8:2222::1: icmp_seq=1 ttl=64 time=0.984 ms
64 bytes from 2001:db8:2222::1: icmp_seq=2 ttl=64 time=0.120 ms
64 bytes from 2001:db8:2222::1: icmp_seq=3 ttl=64 time=0.143 ms
64 bytes from 2001:db8:2222::1: icmp_seq=4 ttl=64 time=0.119 ms
^C
--- 2001:db8:2222::1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.119/0.341/0.984/0.371 ms
```

### (8.3) dnsmasqの各種設定ファイルを確認する

#### (8.3.1) hostファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/host
fa:16:3e:2d:c0:9b,host-2001-db8-2222--2.openstacklocal,[2001:db8:2222::2]
fa:16:3e:1b:4a:02,host-2001-db8-2222--1.openstacklocal,[2001:db8:2222::1]
fa:16:3e:90:ef:a1,host-2001-db8-2222--b.openstacklocal,[2001:db8:2222::b]
```

#### (8.3.2) leaseファイルを確認する

```text:/var/lib/neutron/dhcp/39ba3329-8476-4127-8d78-3c83e6932ff4/leases
1584424099 1049685921 2001:db8:2222::b host-2001-db8-2222--b 00:01:00:01:26:03:03:d5:fa:16:3e:90:ef:a1
```

#### (8.3.3) DHCPクライアントでのlease情報を確認する

```text:/var/lib/dhclient/dhclient6.leases
lease6 {
  interface "client-veth0";
  ia-na 3e:90:ef:a1 {
    starts 1584416599;
    renew 3600;
    rebind 6300;
    iaaddr 2001:db8:2222::b {
      starts 1584416599;
      preferred-life 7200;
      max-life 7500;
    }
  }
  option fqdn.encoded true;
  option fqdn.server-update true;
  option fqdn.no-client-update false;
  option fqdn.fqdn "host-2001-db8-2222--b.openstacklocal";
  option fqdn.hostname "host-2001-db8-2222--b";
  option fqdn.domainname ".openstacklocal";
  option dhcp6.client-id 0:1:0:1:26:3:3:d5:fa:16:3e:90:ef:a1;
  option dhcp6.server-id 0:1:0:1:26:2:fd:e1:fa:16:3e:2d:c0:9b;
  option dhcp6.name-servers 2001:db8:2222::2;
  option dhcp6.domain-search "openstacklocal.";
  option dhcp6.status-code success "success";
}
```
DHCPクライアント環境に、<b>"2001:db8:2222::b/64"</b>のIPv6アドレスが割り当てられたことが確認できました。

以上です。

# ■ 参考URL
- [OpenStack Neutronで、IPv4ネットワーク動作を体験する](https://qiita.com/ttsubo/items/a58bafe0bd01831ecc8a)
- [どう割り振る？ IPv6でのアドレス設計](https://www.atmarkit.co.jp/ait/articles/1109/06/news122.html)
- [OpenStack Documantation: IPv6](https://docs.openstack.org/neutron/pike/admin/config-ipv6.html)
- [OpenStack Neutron IPv6 Lessons](https://www.slideshare.net/ritchey98/openstack-neutron-ipv6-lessons)