OCI ComputeにセカンダリVNICを追加する Part 1

# 1. はじめに

OCI Computeに2つめ以降のVNICを追加する方法を説明する。

### 1-1. TL;DR

* マニュアルにはセカンダリVNICの追加方法が載っているけれど、説明がわかりづらい
* RHEL7系互換ディストリビューションでは、NICの設定に`nmcli`コマンドが推奨されているが、OCI Computeにはインストールされていない（Oracle Linux 8には`nmcli`コマンドあり）

### 1-2. 対象環境

* Oracle Cloud Infrastructure ComputeのVMインスタンス
* Oracle Linux 6やCentOS 6などの6系Linuxディストリビューション
* Oracle Linux 7やCentOS 7などの7系Linuxディストリビューション
* Oracle Linux 8などの8系Linuxディストリビューション

### 1-3. 参考資料

* [OCIマニュアル: 仮想ネットワーク・インタフェース・カード(VNIC)](https://docs.oracle.com/cd/E97706_01/Content/Network/Tasks/managingVNICs.htm)
* [FAQ: 仮想ネットワーク・インタフェース・カード(VNIC)](https://www.oracle.com/jp/cloud/networking/virtual-cloud-network-faq.html)
* [OCI Manuals: Virtual Network Interface Cards (VNICs)](https://docs.cloud.oracle.com/iaas/Content/Network/Tasks/managingVNICs.htm)
* [FAQ: Virtual Network Interface Cards (VNICs)](https://www.oracle.com/cloud/networking/virtual-cloud-network-faq.html)
* [(Official Youtube)Adding a Secondary VNIC to an Oracle Linux Instance in the Oracle Cloud Infrastructure](https://www.youtube.com/watch?v=e6SCzBowOtw)
* [MOS Note:2470376.1 OCI : Automatically add a Secondary VNIC in OL6 using systemV](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2470376.1)※要MOSアカウント
* [MOS Note:2470326.1 OCI : Automatically add a Secondary VNIC in OL7 using an Unit file](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2470326.1)※要MOSアカウント

# 2. セカンダリVNICとは

セカンダリVNICとは、Computeインスタンス作成後に追加するVNICのこと。[シェイプサイズ](https://docs.cloud.oracle.com/iaas/Content/Compute/References/computeshapes.htm)に応じて2個から24個のVNICを使用できる（プライマリVNICを含んだ数）。はじめからアタッチされているVNICはプライマリVNICと呼ぶ。DBaaSなどのPaaSでは、セカンダリVNICは追加できない。

### 2-1. ユースケース

オンプレミスにおける複数NICは、ボンディングによる可用性向上やトラフィック分離による帯域確保、サブネット間のルーティングなどの目的で使用することが多い。それに対してクラウドでは以下の目的で利用する。

<font color="blue">1) 複数サブネットへの簡単なアクセス</font>
<font color="blue">2) ベアメタルサーバでハイパーバイザーを使用する</font>

1)について補足する。たとえば<font color="red">管理系のサーバ</font>の場合、複数ポートを使って監視対象のサーバと通信することがある。このようなケースでは、たくさんのセキュリティリストの追加が必要だ。しかしセカンダリVNICを使うことで、設定するセキュリティリストを削減できる。

とくにVCNをまたいだセカンダリVNICは効果が大きい。VCN間の通信ではLocal Peering Gateway（LPG）の設定が必要だ。しかしセカンダリVNICを使えば、LPGを構成しなくても複数VCNにアクセスできる。

またPaloaltoやFortinet、Checkpointなどの<font color="red">仮想ファイアウォール・アプライアンス</font>を使うときにも有効だ。East-Westトラフィックの制御では、セキュリティ・リストの設定が複雑化しがちだ。さらにオンプレミスとVPN/FastConnectで接続すると複雑さが増加する。

そのようなケースで仮想ファイアウォール・アプライアンスで複数VNICを利用すれば、トラフィック制御を集約化でき管理性も向上する。
![vnc05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/8146e73d-520d-f21b-29b6-e4bd8b1f2727.png)

### 2-2. 注意事項

セカンダリVNICの注意事項としては以下のものがある。

**オンプレミスと異なる点**

* シェイプごとに最大帯域幅が決められているので、複数VNICを使用しても利用可能な帯域幅は変わらない
* インスタンスあたりのVNIC数はシェイプごとに決められている。たとえばVM.Standard2.1ではプライマリNICも合わせて2個まで

**セカンダリVNIC自体の制限事項**

* セカンダリVNCの接続先は、インスタンスと同じADに属するサブネットであること
* 前記の条件を満たせば、異なるコンパートメントや異なるVCNでも作成可能(アクセスに必要なIAMロールは必要)
* プライマリVNICとセカンダリVNICを同じサブネットに接続できるが、ルーティングトラブルの元なので非推奨

# 3. セカンダリVNICを追加する

セカンダリVNICについて理解したところで、実際に設定してみよう。手順としては、OCIの機能でセカンダリVNICを追加し、次にOSを設定する。

**<font color="blue">なお、ここからPart2まで内部構造の説明や解析をしている。設定方法だけを知りたいかたは「 [OCI ComputeにセカンダリVNICを追加する Part 3](https://qiita.com/yamada-hakase/items/abe8114d327c19c98acd)」に進んでほしい。その中でもocidサービスを利用するのが一番簡単な方法だ。</font>**


### 3-1. 構成図

今回の構成は以下のとおり。VM1に、サブネットBに属するセカンダリVNICをアタッチする。

![2nd-vnic01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/f146f8a6-ddce-243a-466d-424ee8160008.png)

### 3-2. 管理コンソールでVNICを追加する

管理コンソールから以下の手順を実行する。

1. Computeページからインスタンスをクリック
1. ページ左の「Attached VNICs（アタッチされたVNIC）」をクリック
1. 「Create VNIC（VNICの作成）」をクリック
1. 以下の項目の入力が終わったら、ウインドウ下にある「Create VNIC（VNICの作成）」をクリックする。<font color="red">※</font>は必須項目。

* **Name:**VNICを区別する名前。指定しないときは自動生成
* **Virtual Cloud Network<font color="red">※</font>:**VNICをアタッチするVCN
* **Network:**VMwareソリューション以外はNormal Setup
* **Subnet<font color="red">※</font>:**VNICをアタッチするサブネット
* **Use network security groups to control traffic:**ネットワークセキュリティグループ使用
* **Skip Source/Destination Check<font color="red">※</font>:**デフォルトはチェックなし。チェックするとNATによるパケット転送などができる
* **Private IP Address:**サブネットCIDRで未割り当てのIPを指定する。指定しないときは利用可能なアドレスを自動割り当て
* **Assign public IP address:**パブリックサブネットのみ指定可能
* **Hostname：**VCNリゾルバで名前解決できるホスト名

### 3-3. 追加したVNICを確認する

該当インスタンスにsshでログインしてVNICを確認する。すると以下のことがわかる。

* セカンダリVNICとしてens5が追加
* ステータスはDOWN
* IPアドレスは未割り当て
* MTUは1500

```shell-session
# 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
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:00:08:22 brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.5/24 brd 10.1.0.255 scope global dynamic ens3
       valid_lft 52752sec preferred_lft 52752sec
4: ★ens5: <BROADCAST,MULTICAST> ★mtu 1500 qdisc noop state ★DOWN group default qlen 1000
    link/ether 02:00:17:00:0d:43 brd ff:ff:ff:ff:ff:ff
```

VNIC構成前のルーティングテーブルも確認する。ens5にはIPアドレスが割り当てられていないので、当然ルーティングテーブルにも表示されない。

```shell-session
# ip route
default via 10.1.0.1 dev ens3
10.1.0.0/24 dev ens3 proto kernel scope link src 10.1.0.5
169.254.0.0/16 dev ens3 proto static scope link
169.254.0.0/16 dev ens3 scope link metric 1002
```

# 4. スクリプトでセカンダリVNICを構成する

インスタンスにVNICを追加してもIPアドレスが設定されないことが分かった。オンプレミスで言えばNICをサーバに挿しただけの状態。そこでマニュアルに書かれているスクリプトを使って、セカンダリVNICにIPアドレスを割り当てる。

<font color="blue">スクリプトでは無くocidサービスを使った自動設定は「[OCI ComputeにセカンダリVNICを追加する Part 3](https://qiita.com/yamada-hakase/items/abe8114d327c19c98acd)」に書いてある。</font>

### 4-1. セカンダリVNICにIPアドレスを割り当てる

スクリプトを使ってVNICを構成してみよう。マニュアルにも書かれているように下記の注意点があることを忘れずに。

<font color="red">**重要**：このスクリプトで設定した変更は永続的ではない。そのためOSをリブートすると設定が失われる。スクリプトを再実行する必要がある。</font>

1. VNIC構成用スクリプトをダウンロードする。

```shell-session
sudo su -
cd /tmp
curl -O https://docs.cloud.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh
chmod +x /tmp/secondary_vnic_all_configure.sh
```

<font color="red">スクリプトのURIが変わることがあるので、そのときには[マニュアル](https://docs.cloud.oracle.com/en-us/iaas/Content/Network/Tasks/managingVNICs.htm#Linux:)で確認すること。</font>

2.スクリプトの使い方は以下のとおり。スクリプトはrootもしくはsudoで実行すること。

* セカンダリVNICを構成する： `secondary_vnic_all_configure.sh -c`
* セカンダリVNICを強制削除する： `secondary_vnic_all_configure.sh -d`
* ヘルプ： `secondary_vnic_all_configure.sh -h`

興味深いのはconfigureの`-c`オプションで、VNICが構成されていないときは設定を追加し、VNICそのものが削除されているときにはOSから設定を削除する、という2つの役割がある。

ヘルプの内容は必見。マニュアルに載っていないことも書かれている。

 ```shell-session
# /tmp/secondary_vnic_all_configure.sh -h
---以下画面出力---
NAME
    secondary_vnic_all_configure.sh -- display and configure Oracle OCI Virtual Cloud Networks on instance

SYNOPSIS
    secondary_vnic_all_configure.sh [-s] [-e <IP address> <VNIC OCID>]
    secondary_vnic_all_configure.sh -c [-q] [-s] [-n [<format>] [-r]] [-e <IP address> <VNIC OCID> [-e ...]]
    secondary_vnic_all_configure.sh -d [-q] [-s] [-e <IP address> <VNIC OCID>]
★以下省略
```

3.オプションなしで実行するとVNIC情報を表示できる。

```shell-session
# /tmp/secondary_vnic_all_configure.sh
CONFIG ADDR            SPREFIX         SBITS VIRTRT          NS         IND IFACE      VLTAG VLAN        STATE MAC               VNIC
-      10.1.0.5        10.1.0.0        24    10.1.0.1        -          0   ens3       -     -           UP    02:00:17:00:08:22 ocid1.vnic.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ADD    10.1.1.5        10.1.1.0        24    10.1.1.1        -          1   ens5       -     -           DOWN  02:00:17:00:0d:43 ocid1.vnic.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

4.`-c`オプションでセカンダリVNICを設定する。メッセージから以下の3つのことがわかる。

* IPアドレスを割り当て
* MTUを1500から9000に変更
* ルーティングテーブルにセカンダリVNICの情報を追加

```shell-session
# /tmp/secondary_vnic_all_configure.sh -c
Info: adding IP config for VNIC MAC 02:00:17:00:0d:43 with id ocid1.vnic.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Info: added IP address 10.1.1.5 on interface ens5 with MTU 9000
Info: added rule for routing from 10.1.1.5 lookup ort1 with default via 10.1.1.1
```

### 4-2. 設定内容を確認する

実際に設定されているかOSコマンドで確認する。するとIPアドレスが割り当てられ、ステータスもUPになっている。

```shell-session
# 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
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:00:08:22 brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.5/24 brd 10.1.0.255 scope global dynamic ens3
       valid_lft 84471sec preferred_lft 84471sec
4: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> ★mtu 9000 qdisc mq state ★UP group default qlen 1000
    link/ether 02:00:17:00:0d:43 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.5/24 scope global ens5★IPアドレスが割り当てられている
       valid_lft forever preferred_lft forever
```

ルーティングテーブルを確認するとens5の行が追加されている。

```shell-session
# ip route
default via 10.1.0.1 dev ens3
10.1.0.0/24 dev ens3 proto kernel scope link src 10.1.0.5
10.1.1.0/24 dev ens5 proto kernel scope link src 10.1.1.5★追加された
169.254.0.0/16 dev ens3 proto static scope link
169.254.0.0/16 dev ens3 scope link metric 1002
```

### 4-3. OSを再起動すると、どうなるか確認する

`reboot`コマンドでOSを再起動する。結果は同じなので書かないが、「3-3. 追加したVNICを確認する」で`ip a`を実行したときと同じく、セカンダリVNICにはIPアドレスは割り当てられていない。

# 次は

長くなったので、今回はここで終了。次回は永続的に設定する方法を説明する。深い内容もあるので、どうしてくれようか。

* [OCI ComputeにセカンダリVNICを追加する Part 2](https://qiita.com/yamada-hakase/items/6b0c49a0b2b3c5e4c4dd)
* [OCI ComputeにセカンダリVNICを追加する Part 3](https://qiita.com/yamada-hakase/items/abe8114d327c19c98acd)

# まとめ

* セカンダリVNICを使用すると、1つのインスタンスから複数サブネットに簡単に接続できる
* セカンダリVNICを追加しても、インスタンスの最大帯域幅は変わらない
* セカンダリVNICは、同一AD内であれば異なるVCNにも接続できる
* 設定スクリプトを使用すると、セカンダリVNICを簡単に設定できるが、再起動すると設定情報が失われる