OpenStack Neutronで、IPv4ネットワーク動作を体験する

Rocky版OpenStack Neutronを活用して、IPv4ネットワークのデプロイ動作を体験してみます。
ただし、デプロイするテナントネットワークは、単一のL3セグメント構成のみです。
外部への通信を想定したルータ環境の配備とか、一切、想定していません。


# ■ 想定されるNeutron基本動作
IPv4ネットワークをデプロイすると、Network Node上にテナント専用DHCPサーバ環境として<b>dnsmasq</b>が配備されます。
その後、DHCPv4プロトコルを使用して、クライアント環境にIPv4アドレスが割り当てられれば成功です。

![NeutronによるIPv4:IPv6ネットワーク構築.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103595/6588bdce-df04-a693-8b1b-45e00d20cbad.png)

## □ 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環境を整備する

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

- NeutronManagerは、Portリソースに対応するMACアドレスを割り当てる
- NeutronManagerは、<b>IPAM機構</b>にPortリソース情報のエントリする
- NeutronManagerは、<b>IPAM機構</b>での内部処理に基づき、IPv4アドレスを割り当てる
- NeutronManagerは、DHCPサーバ環境でのIPv4アドレス払い出し設定を、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. Networkリソース作成の作業履歴
実際に、Networkリソースを作成します

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

```
# openstack network create ipv4-net
```
### (2.2) Networkリソースを確認しておく

```
# openstack network show ipv4-net -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": "0c048c13-6884-4fdc-9d1a-491a2143884b", 
  "router:external": "Internal", 
  "availability_zone_hints": "", 
  "availability_zones": "", 
  "segments": null, 
  "name": "ipv4-net", 
  "ipv4_address_scope": null, 
  "shared": false, 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "status": "ACTIVE", 
  "subnets": "", 
  "description": "", 
  "tags": "", 
  "updated_at": "2020-03-15T23:42:13Z", 
  "is_default": null, 
  "provider:segmentation_id": null, 
  "qos_policy_id": null, 
  "admin_state_up": "UP", 
  "created_at": "2020-03-15T23:42:13Z", 
  "mtu": 1450
}
```



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

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

```
# openstack subnet create --subnet-range 10.0.0.0/24 --network ipv4-net ipv4-subnet1 
```

### (3.2) Subnetリソースを確認しておく
```
# openstack subnet show ipv4-subnet1 -f json
{
  "service_types": "", 
  "description": "", 
  "enable_dhcp": true, 
  "segment_id": null, 
  "network_id": "0c048c13-6884-4fdc-9d1a-491a2143884b", 
  "created_at": "2020-03-15T23:43:17Z", 
  "tags": "", 
  "dns_nameservers": "", 
  "updated_at": "2020-03-15T23:43:17Z", 
  "ipv6_ra_mode": null, 
  "allocation_pools": "10.0.0.2-10.0.0.254", 
  "gateway_ip": "10.0.0.1", 
  "revision_number": 0, 
  "ipv6_address_mode": null, 
  "ip_version": 4, 
  "host_routes": "", 
  "cidr": "10.0.0.0/24", 
  "project_id": "f2de30617f9d4ac495035a6cf44ad7b9", 
  "id": "e2dc9080-84c7-4c37-bf71-1f1f3bb3f1d8", 
  "subnetpool_id": null, 
  "name": "ipv4-subnet1"
}
```

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

```
# openstack port list -f json
[
  {
    "Status": "DOWN", 
    "Fixed IP Addresses": "ip_address='10.0.0.2', subnet_id='e2dc9080-84c7-4c37-bf71-1f1f3bb3f1d8'", 
    "ID": "d1496152-b807-4c38-b350-7c570d0a794d", 
    "MAC Address": "fa:16:3e:a2:b5:b6", 
    "Name": ""
  }
]
```
```
# openstack port show d1496152-b807-4c38-b350-7c570d0a794d -f json
{
  "allowed_address_pairs": "", 
  "extra_dhcp_opts": "", 
  "updated_at": "2020-03-15T23:43:18Z", 
  "dns_domain": null, 
  "device_owner": "network:dhcp", 
  "revision_number": 3, 
  "port_security_enabled": false, 
  "fixed_ips": "ip_address='10.0.0.2', subnet_id='e2dc9080-84c7-4c37-bf71-1f1f3bb3f1d8'", 
  "id": "d1496152-b807-4c38-b350-7c570d0a794d", 
  "description": "", 
  "binding_vnic_type": "normal", 
  "qos_policy_id": null, 
  "mac_address": "fa:16:3e:a2:b5:b6", 
  "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-0c048c13-6884-4fdc-9d1a-491a2143884b", 
  "name": "", 
  "admin_state_up": "UP", 
  "network_id": "0c048c13-6884-4fdc-9d1a-491a2143884b", 
  "dns_name": null, 
  "created_at": "2020-03-15T23:43:18Z", 
  "data_plane_status": null, 
  "binding_host_id": null
}
```
### (3.4) DHCP用ネームスペースが正しく作成されたことを確認する

```
# ip netns
qdhcp-0c048c13-6884-4fdc-9d1a-491a2143884b (id: 0)
```
```
# ip netns exec qdhcp-0c048c13-6884-4fdc-9d1a-491a2143884b 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
8: tapd1496152-b8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:a2:b5:b6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global tapd1496152-b8
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fea2:b5b6/64 scope link 
       valid_lft forever preferred_lft forever
```
### (3.5) DHCP用ネームスペースで動作するdnsmasqプロセスを確認する

```
# ps -ef|grep dnsmasq
nobody    3607     1  0 08:43 ?        00:00:00 dnsmasq --no-hosts --no-resolv --pid-file=/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/host --addn-hosts=/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/opts --dhcp-leasefile=/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/leases --dhcp-match=set:ipxe,175 --local-service --bind-interfaces --dhcp-range=set:tag0,10.0.0.0,static,255.255.255.0,86400s --dhcp-option-force=option:mtu,1450 --dhcp-lease-max=256 --conf-file= --domain=openstacklocal
```
### (3.6) dnsmasqの各種設定ファイルを確認する

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

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/host 
fa:16:3e:a2:b5:b6,host-10-0-0-2.openstacklocal,10.0.0.2
```
#### (3.6.2) add_hostファイルを確認する

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/addn_hosts
10.0.0.2	host-10-0-0-2.openstacklocal host-10-0-0-2
```
#### (3.6.3) optファイルを確認する

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/opts
tag:tag0,option:router,10.0.0.1
```
#### (3.6.4) leaseファイルを確認する

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/leases
1584402201 fa:16:3e:a2:b5:b6 10.0.0.2 host-10-0-0-2 *
```

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

#### (3.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 "tapd1496152-b8"
            tag: 4095
            Interface "tapd1496152-b8"
                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"
```

#### (3.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
 2(tapd1496152-b8): addr:fa:16:3e:a2:b5:b6
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 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
```


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

### (4.1) Portリソースを作成する
```
# openstack port create --network ipv4-net ipv4-port1
```

### (4.2) Portリソースを確認しておく
```
# openstack port show ipv4-port1 -f json
{
  "allowed_address_pairs": "", 
  "extra_dhcp_opts": "", 
  "updated_at": "2020-03-15T23:53:38Z", 
  "dns_domain": null, 
  "device_owner": "", 
  "revision_number": 2, 
  "port_security_enabled": true, 
  "fixed_ips": "ip_address='10.0.0.4', subnet_id='e2dc9080-84c7-4c37-bf71-1f1f3bb3f1d8'", 
  "id": "51e9bf84-5fb1-429b-a4a8-579c092210d1", 
  "description": "", 
  "binding_vnic_type": "normal", 
  "qos_policy_id": null, 
  "mac_address": "fa:16:3e:22:0b:f1", 
  "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": "ipv4-port1", 
  "admin_state_up": "UP", 
  "network_id": "0c048c13-6884-4fdc-9d1a-491a2143884b", 
  "dns_name": null, 
  "created_at": "2020-03-15T23:53:38Z", 
  "data_plane_status": null, 
  "binding_host_id": null
}
```

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

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

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/host
fa:16:3e:a2:b5:b6,host-10-0-0-2.openstacklocal,10.0.0.2
fa:16:3e:22:0b:f1,host-10-0-0-4.openstacklocal,10.0.0.4
```
#### (4.3.2) add_hostファイルを確認する

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/addn_hosts
10.0.0.2	host-10-0-0-2.openstacklocal host-10-0-0-2
10.0.0.4	host-10-0-0-4.openstacklocal host-10-0-0-4
```
#### (4.3.3) optファイルを確認する

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/opts
tag:tag0,option:router,10.0.0.1
```

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

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/leases
1584402201 fa:16:3e:a2:b5:b6 10.0.0.2 host-10-0-0-2 *
```

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

#### (4.4.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 "tapd1496152-b8"
            tag: 4095
            Interface "tapd1496152-b8"
                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.4.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
 2(tapd1496152-b8): addr:fa:16:3e:a2:b5:b6
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 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
```


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

DHCPクライアント環境のネットワークインタフェースには、事前に、<b>"fa:16:3e:22:0b:f1"</b>のMACアドレスを設定しておき、DHCPv4プロトコルを使用して、<b>"10.0.0.4"</b>のIPv4アドレスが払い出されることが期待値です

```
# openstack port show ipv4-port1 -f json
{
  ...(snip)

  "fixed_ips": "ip_address='10.0.0.4', subnet_id='e2dc9080-84c7-4c37-bf71-1f1f3bb3f1d8'", 

  ...(snip)

  "mac_address": "fa:16:3e:22:0b:f1", 

  ...(snip)
}
```




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

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

```
# ip netns add client
# ip netns
client
qdhcp-0c048c13-6884-4fdc-9d1a-491a2143884b (id: 0)
```

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

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

### (5.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 "tapd1496152-b8"
            tag: 4095
            Interface "tapd1496152-b8"
                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.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 "tapd1496152-b8"
            tag: 4095
            Interface "tapd1496152-b8"
                type: internal
        Port "ovs-veth0"
            tag: 4095
            Interface "ovs-veth0"
        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.5) client側vethインターフェイスにMACアドレスを設定する

```
# ip netns exec client ip link set dev client-veth0 address fa:16:3e:22:0b:f1
```
```
# 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
9: client-veth0@if10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether fa:16:3e:22:0b:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
```
### (5.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
9: client-veth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:22:0b:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::f816:3eff:fe22:bf1/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
 2(tapd1496152-b8): addr:fa:16:3e:a2:b5:b6
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 3(patch-tun): addr:ce:e0:2b:eb:f5:41
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 4(ovs-veth0): addr:2e:51:c2:35:ec:2b
     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
```

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

### (6.1) dhclientを起動する
```
# ip netns exec client dhclient client-veth0
```
### (6.2) DHCPv4プロトコルで払い出されたIPv4動作を確認する

#### (6.2.1) IPv4アドレスを確認する
```
# 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
9: client-veth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:22:0b:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.0.4/24 brd 10.0.0.255 scope global dynamic client-veth0
       valid_lft 86393sec preferred_lft 86393sec
    inet6 fe80::f816:3eff:fe22:bf1/64 scope link 
       valid_lft forever preferred_lft forever
```
#### (6.2.2) ルーティング情報を確認する
```
# ip netns exec client ip route show
default via 10.0.0.1 dev client-veth0 
10.0.0.0/24 dev client-veth0 proto kernel scope link src 10.0.0.4 
```
#### (6.2.3) DHCPサーバとの疎通性を確認する

```
# ip netns exec client ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.675 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.102 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.103 ms
^C
--- 10.0.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.102/0.245/0.675/0.248 ms
```

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

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

```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/host
fa:16:3e:a2:b5:b6,host-10-0-0-2.openstacklocal,10.0.0.2
fa:16:3e:22:0b:f1,host-10-0-0-4.openstacklocal,10.0.0.4
```
#### (6.3.2) leaseファイルを確認する
```text:/var/lib/neutron/dhcp/0c048c13-6884-4fdc-9d1a-491a2143884b/leases
1584403881 fa:16:3e:22:0b:f1 10.0.0.4 host-10-0-0-4 *
1584402201 fa:16:3e:a2:b5:b6 10.0.0.2 host-10-0-0-2 *
```

### (6.4) DHCPクライアントでのlease情報を確認する
```text:/var/lib/dhclient/dhclient.leases
lease {
  interface "client-veth0";
  fixed-address 10.0.0.4;
  option subnet-mask 255.255.255.0;
  option routers 10.0.0.1;
  option dhcp-lease-time 86400;
  option dhcp-message-type 5;
  option domain-name-servers 10.0.0.2;
  option dhcp-server-identifier 10.0.0.2;
  option interface-mtu 1450;
  option dhcp-renewal-time 43200;
  option broadcast-address 10.0.0.255;
  option dhcp-rebinding-time 75600;
  option host-name "host-10-0-0-4";
  option domain-name "openstacklocal";
  renew 1 2020/03/16 09:32:04;
  rebind 1 2020/03/16 21:11:21;
  expire 2 2020/03/17 00:11:21;
}
```

DHCPクライアント環境に、<b>"10.0.0.4/24"</b>のIPv4アドレスが割り当てられたことが確認できました。

以上です。