VirtualBoxとCentOSでOpenVNetのテスト環境をつくったときのまとめ

#今回行うこと
- NATに対しポートフォワーディングの設定によりWindowsからSSHで接続できるようする。
- ホストオンリーネットワークを各マシンに追加する。
- ホストオンリーネットワーク間でルーティングがされるようにする。
- OpenVNetを動かすために必要な設定を行う。

#背景
[OpenVNet](http://openvnet.org/)とは仮想ネットワークを構築するソフトウェアです。このOpenVNetではマシン間の通信に同一ネットワーク上のマシン間で使うMAC2MACとL3スイッチをまたいでつながる二つのネットワーク間で使うGREトンネルの2種類の方法を使います。そのために、CentOS3台のマシンとMAC2MAC、GREトンネルの二つの通信を試すことのできるネットワークを無料で用意できる環境を探し、その結果VirtualBoxを使用することにしました。

#概要
VirtualBoxでCentOS6.7の仮想マシン4台を用意し、下図のようにOpenVNetを動作させるために必要となるネットワークをホストオンリーネットワークで3つ（黒線）、CentOSがインターネットに接続する＆ホストマシンのWindowsからSSHで接続するためにつかうNAT接続を1つ（緑線）の計4つのネットワークを設定していきます。

![VB.png](https://qiita-image-store.s3.amazonaws.com/0/86684/8156ccca-c0b9-60fe-74f5-1a62b13f0b68.png)


#準備
Windows（64bit） **<font color="#ff0000">32bit環境ではOpenVNetは2015/9/29現在は動きません</font>**
VirtualBoxをダウンロード・インストール
CentOS-6.7-x86_64-bin-DVD1.iso ＆ CentOS-6.7-x86_64-bin-DVD2.iso または　CentOS-6.7-x86_64-minimal.isoをダウンロード

#VirtualBox
##ネットワークの生成
VirtualBoxを立ち上げると出てくるOracle VM VirtualBoxマネージャーで
1. ファイル→環境設定をクリック
2. ネットワーク→ホストオンリーネットワーク→プラスマークのついているアイコンをクリック
3. VirtualBox Host-Only Ethernet Adapter #2が作られたことを確認
4. 同じようにプラスマークをクリックしVirtualBox Host-Only Ethernet Adapter #3が作成されたことを確認
5. それぞれのネットワークを選択してドライバーアイコンをクリックしIPアドレスを確認

私の設定ではそれぞれのIPアドレスが
VirtualBox Host-Only Ethernet Adapter　 ：192.168.56.1
VirtualBox Host-Only Ethernet Adapter #2：192.168.125.1
VirtualBox Host-Only Ethernet Adapter #3：192.168.198.1
になっています。

##仮想マシンの作成
Oracle VM VirtualBoxマネージャーで仮想マシン4台を作ります。
1. 新規をクリック
2. 名前をVM0～3で作成（任意のものでよい）
3. タイプをLinux、バージョンをRed Hat(64bit)を選択
4. 残りの項目はすべて次へをクリックして問題ありません。

##仮想マシンへのネットワークの設定
各仮想マシンのネットワークの設定を上図のようになるよう構築していきます。

以下の作業を各マシンで行います。
1. 仮想マシンを右クリックし設定をクリックします。
2. ネットワークを選択し、アダプタ1～3を選択で以下の作業を行います。
3. ネットワークアダプタを有効化にチェックを入れて、割り当て名前を以下のように設定していきます。

|マシン	|アダプター	|割り当て|名前|
|---	|-----------|--------|-----|
|VM0|アダプター1|NAT						|											
|VM0|アダプター2|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter		|
|VM0|アダプター3|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter #2	|
|VM1|アダプター1|NAT						|											
|VM1|アダプター2|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter		|
|VM1|アダプター3|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter #3	|
|VM2|アダプター1|NAT						|	
|VM2|アダプター2|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter　　　	|
|VM2|アダプター3|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter #3	|
|VM3|アダプター1|NAT						|											|
|VM3|アダプター2|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter #2	|
|VM3|アダプター3|ホストオンリーアダプター	|VirtualBox Host-Only Ethernet Adapter #3	|
3. アダプター1の高度→ポートフォワーディングをクリック
4. SSH接続のため、各マシンでホストポートの値が被らないよう以下のように設定をしていきます
マシン0

|名前|プロトコル|ホストIP|ホストポート|ゲストIP|ゲストポート|
|---|----|----|----|----|----|
|Rule 1|TCP|　|2220|　|22|
VM1

|名前|プロトコル|ホストIP|ホストポート|ゲストIP|ゲストポート|
|---|----|----|----|----|----|
|Rule 1|TCP|　|2221|　|22|
VM2 

|名前|プロトコル|ホストIP|ホストポート|ゲストIP|ゲストポート|
|---|----|----|----|----|----|
|Rule 1|TCP|　|2222|　|22|

VM3

|名前|プロトコル|ホストIP|ホストポート|ゲストIP|ゲストポート|
|---|----|----|----|----|----|
|Rule 1|TCP|　|2223|　|22|

これでWindowsからSSHもできるようになったと思います。

```
ssh -p ＜2220～2223＞ root@localhost
```
各マシンに入ったらSELINUXを切ります。

```
vi /etc/selinux/config

SELINUX=disabled
```
# OpenVNet
## ルーター
VM0を192.168.56.0と192.168.125.0間のルーターとして動作するよう設定します。
eth1の設定

```
vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
HWADDR=＜既に設定されている値＞
TYPE=Ethernet
#UUID=＜既に設定されている値＞
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.56.254
NETMASK=255.255.255.0
```

eth2の設定

```
vi /etc/sysconfig/network-scripts/ifcfg-eth2

DEVICE=eth2
HWADDR=＜既に設定されている値＞
TYPE=Ethernet
#UUID=＜既に設定されている値＞
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.125.254
NETMASK=255.255.255.0
```

ルータの機能を有効にします

```
echo 1 >/proc/sys/net/ipv4/ip_forward
```

```
vi /etc/sysctl.conf

net.ipv4.ip_forward = 1
```


## 仮想マシン
VM1~VM3の設定を行っていきます。
各マシンのeth0の設定を行います。

```
vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
HWADDR=＜既に設定されている値＞
TYPE=Ethernet
UUID=＜既に設定されている値＞
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
```

各マシンのeth1の設定を行います。

```
vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
HWADDR=＜既に設定されている値＞
DEVICETYPE=ovs
TYPE=OVSPort
#UUID=＜既に設定されている値＞
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
OVS_BRIDGE=br0
```



各マシンのeth2の設定を行います。

```
vi /etc/sysconfig/network-scripts/ifcfg-eth2

DEVICE=eth2
HWADDR=＜既に設定されている値＞
TYPE=Ethernet
#UUID=＜既に設定されている値＞
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=＜各マシンのIPアドレス＞
NETMASK=255.255.255.0
```

各マシンのIPアドレスは

|マシン名|eth2|
|----|----|
|VM1|192.168.198.10|
|VM2|192.168.198.11|
|VM3|192.168.198.12|

各マシンでbr0を作成します

```
vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0
DEVICETYPE=ovs
TYPE=OVSBridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=＜各マシンのIPアドレス＞
NETMASK=255.255.255.0
HOTPLUG=no
OVS_EXTRA="
 set bridge     ${DEVICE} protocols=OpenFlow10,OpenFlow12,OpenFlow13 --
 set bridge     ${DEVICE} other_config:disable-in-band=true --
 set bridge     ${DEVICE} other-config:datapath-id=＜各マシンのdatapath-id＞ --
 set bridge     ${DEVICE} other-config:hwaddr=＜各マシンのMACアドレス＞ --
 set-fail-mode  ${DEVICE} standalone --
 set-controller ${DEVICE} tcp:127.0.0.1:6633
"
```

各マシンのIPアドレスは


|マシン名|IPアドレス|datapath-id|MACアドレス|IPアドレス|
|----|----|----|----|----|
|VM1|192.168.198.10|0000020100000001|02:01:00:00:00:01|192.168.56.10|
|VM2|192.168.198.11|0000020100000002|02:01:00:00:00:02|192.168.56.11|
|VM3|192.168.198.12|0000020100000003|02:01:00:00:00:03|192.168.125.10|

を設定します。
datapath-idとMACアドレスはマシン間で被らなければ任意の値で問題ありません。

## OpenVNetインストール
インストールマニュアルを参考に必要なもののインストールを行っていきます。
http://openvnet.org/installation/

```
curl -o /etc/yum.repos.d/openvnet.repo -R https://raw.githubusercontent.com/axsh/openvnet/master/deployment/yum_repositories/stable/openvnet.repo

curl -o /etc/yum.repos.d/openvnet-third-party.repo -R https://raw.githubusercontent.com/axsh/openvnet/master/deployment/yum_repositories/stable/openvnet-third-party.repo

yum install -y epel-release
```

さらに

```
yum install -y openvnet
```
で

```
Error: Package: kmod-openvswitch-2.3.1-1.el6.x86_64 (openvnet-third-party)
           Requires: kernel(openvswitch_handle_frame_hook) = 0xbe03eb4d
```
とでて失敗します。
ここはCentOS6.6ではマニュアルのままで成功する環境もありました。
そこで、こちら
https://github.com/mao172/ovs-installer
のovs-installerをお借りしてみます。

```
curl -L https://raw.githubusercontent.com/mao172/ovs-installer/master/install.sh | bash -s -- -v 2.3.1
```
そこでもう一回

```
yum install -y openvnet
```
をすると成功します。

続いて、

```
yum install -y mysql-server redis
```

これでインストールは終了です。

## ルーティング

ネットワークの再起動を行います。

```
service network restart
```

VM1～VM3のルーティングテーブルに設定を追加します。

```
# VM1、VM2
route add -net 192.168.125.0/24 gw 192.168.56.254 br0

# VM3
route add -net 192.168.56.0/24 gw 192.168.125.254 br0
```
## iptables

本当は適切なポートを開けるべきなのでしょうがとりあえずVM0~VM3のiptables を停止させておきます。

```
iptables -F
```
# 動作確認
VM1-VM3間及びVM2-VM3間でpingを打って届くか確認しましょう。

```
VM1からpingを打つ場合

ping 192.168.125.10
```

そしてルーター上を通過しているか確認しましょう

```
ルーターマシン上で

tcpdump -i eth1
```

これでpingが飛んで行ってることを確認できれば成功です。

DBへの作るネットワークの設定の登録とLXCの設定を行えばOpenVNetが動作するようになります。

GREトンネルとMAC2MACを使ったOpenVNetの設定は[こっち](http://qiita.com/ko-he-8/items/39f501cca29ed906df01)に書きました