eve-ngをGCE(GCP)に導入してみた


いつの間にか公式サイトでGCP上でインストールするための方法が
記載されていたので以下のサイトを参考にしたほうがいいと思います
公式サイト様、ありがとうございます。
1年前に出してほしかった
Google Cloud Install - Eve-NG

1.はじめに

はじめての方は初めまして@aoi96です。

定期的にコミュニティ活動でネットワークイベントのお手伝いをしており、
イベントで使用するインフラ基盤の開発・構築・不具合対応であったり、
イベントのコンテンツ作成をしたいと思っています。インフラが一人しかいなくて手が回らない
ネットワークイベントに関してはこの記事をご確認ください。

今回は、ネットワークイベント開催にあたって
ネットワークOSをエミュレート可能かつ安価で、
参加・運営双方の事前準備が少なく、複数展開が容易なインフラが
必要になったのでそのインフラの構築方法のメモになります。

2.使用したもの

  • Google Cloud Platform(GCP)
    • Nested Virtualization(VMのネスト機能)対応のため
  • eve-ng(community版)
  • Amazon Web Service(AWS)
    • gcloudコマンド叩く用

AWSのEC2にgoogle SDKをインストールする方法に関しては、
気が向けば記事にしようかなと思っています。

3.構築手順

Step1. Nested Virtualization対応のイメージ作成

まずは、VMのネスト機能に対応したイメージを作成します。
作成の大まかな作業は以下2つになります。
1.イメージのもとになるインスタンスの作成
2.1で立てたインスタンスからgcloudコマンドでイメージを作成

はじめに、イメージ作成のベースとなるインスタンスを作成します。
インスタンスの作り方は、コンピューティング→Compute Engineの中の
VMインスタンスから作成します。
今回作ったものの変更点は以下になります。

・名前:base
・リージョン:東京(asia-northeast1)
・ゾーン:asia-northeast1-b
・マシンタイプ:n1-standard-1(vCPU x1,メモリ 3.75GB)
・イメージ:Ubuntu16.04LTS, サイズ30G
・IDとAPIへのアクセス:すべての Cloud API に完全アクセス権を許可
・ファイアウォール:HTTPトラフィックを許可する
         :HTTPSトラフィックを許可する 

インスタンスの作成が完了したら、
gcloudコマンドでインスタンスにログインします

gcloud compute --project "<プロジェクト名>" ssh --zone "asia-northeast1-b" "base"(インスタンス名)
WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):(今回は空白でenter)
Enter same passphrase again:(今回は空白でenter)
Your identification has been saved in /home/ubuntu/.ssh/google_compute_engine.
       ~~~(省略)~~~
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-1025-gcp x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

New release 
ubuntu@base:~$

ログインできたらupdate&&upgradeをして
nested VMに対応しているか確認してみます。

ubuntu@base:~$sudo apt update && sudo apt upgrade -y
ubuntu@base:~$ cat /proc/cpuinfo | grep vmx | wc -l
0 ← 1以上なら対応しています(今は0なので非対応です)
ubuntu@base:~$

ついでにこのタイミングでsshの公開鍵を登録しておくと
複数展開時に楽になります。
私は別インスタンスで鍵を作成してから、
公開鍵を登録後に秘密鍵を開発用PCにコピーしてインスタンスを削除しました

登録が終わったら一度インスタンスを停止させます。

インスタンスを停止してから以下のgcloudコマンドでnested VM対応のカスタムイメージを作成します。

gcloud compute --project=<project名> images create <イメージ名> --source-disk=base --source-disk-zon=asia-northeast1-b(停止したインスタンスのあるゾーン) --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"

その後、カスタムイメージからインスタンスを作成し、
作成したインスタンスにloginしてVMのネスト機能の確認してみます。

:~$ ssh -i .ssh/<秘密鍵> [email protected]
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-1025-gcp x86_64)
             (省略)
~$ cat /proc/cpuinfo | grep vmx | wc -l
4 ← nested VM対応!!
~$

これでVMのネスト機能に対応したインスタンスが作成できました。

Step2. eve-ngのインストール前の準備

Step1.で作成したVMのネスト機能対応のイメージから、
インスタンスを作成し、公式サイトを参考にeve-ngをインストール
(をする前の環境調整を)していきます。
ここでは大きく以下の3つの作業をしていきます。
1.インスタンスの作成
2.interfece名の変更&/etc/network/interfaces.d/50-cloud-init.cfgの書き換え
3.rootパスワードの設定
4.一時的にsshdの変更(root passwordログインの許可) ← セキュリティ的に脆弱になるので注意

2.1今回は以下のようなインスタンスを作成しました。

・名前:eve-ng-install
・リージョン:東京(asia-northeast1)
・ゾーン:asia-northeast1-b
・マシンタイプ:n1-standard-4(vCPU x4,メモリ 15GB)
・イメージ(カスタムイメージ):(Step1.で作成したイメージ), サイズ30G
・IDとAPIへのアクセス:すべての Cloud API に完全アクセス権を許可
・ファイアウォール:HTTPトラフィックを許可する
         :HTTPSトラフィックを許可する 

インスタンスの作成が完了したら、

2.2インターフェース名・Nested VMへの対応を確認します。

ubuntu@eve-ng-install:~$ 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
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000 ←(eth*にしないといけない)
         (省略)
ubuntu@eve-ng-install:~$ cat /proc/cpuinfo | grep vmx | wc -l
4 ← nested VMに対応(4は4coreだから)
ubuntu@eve-ng-install:~$

次に、/etc/udev/rules.d/70-persistent-net.rulesを以下のように編集して、/etc/network/interfaces.d/50-cloud-init.cfgに以下の2行を追記します。(注)インターフェース名の変更は再起動後に有効になります。

/etc/udev/rules.d/70-persistent-net.rules
変更前
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="42:01:0a:92:00:03", NAME="ens4"

変更後
#SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="42:01:0a:92:00:03", NAME="ens4"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="42:01:0a:92:00:03", NAME="eth0"
/etc/network/interfaces.d/50-cloud-init.cfg
auto ens4
iface ens4 inet dhcp

### 追記
auto eth0
iface eth0 inet dhcp

この作業を忘れると再起動後にインスタンスに
アクセスできなくなる可能性があるので注意ですね。

次にルートパスワードをeveに設定します。

ubuntu@eve-ng-install:~$ sudo passwd root
Enter new UNIX password:(eveと入力してエンター)
Retype new UNIX password:(eveと入力してエンター)
passwd: password updated successfully
ubuntu@eve-ng-install:~$

rootパスワードの設定後、/etc/ssh/sshd_configを編集して、root userのパスワードログインを可能にします。

変更前
PermitRootLogin prohibit-password
PasswordAuthentication no
変更後
PermitRootLogin yes
PasswordAuthentication yes

変更が終わったらsudo systemctl restart sshdで
サービスの再起動を行いsshできるかの確認をします。

ubuntu@eve-ng-install:~$ sudo systemctl restart sshd
ubuntu@eve-ng-install:~$ ssh root@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:405I5aGQrXpiFUV3WBCVOFy8ftTTMjFNq4KI1FDMDMA.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
ubuntu@eve-ng-install:~$

sshの確認完了後、インスタンスの再起動を行い
nic名が変わっているかを確認します

root@eve-ng-install:~# 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000
    link/ether 42:01:0a:92:00:0d brd ff:ff:ff:ff:ff:ff
    inet 10.146.0.13/32 brd 10.146.0.13 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4001:aff:fe92:d/64 scope link
       valid_lft forever preferred_lft forever

nic名の変更が確認出来たらeve-ngをインストールします

Step3. eve-ngのインストール

公式サイトの3.1. EVE Community free versionを参考に
eve-ngをインストールします。

root@eve-ng-install:~#wget -O - http://www.eve-ng.net/repo/install-eve.sh | bash -i
    ~~~~~~ 省略 ~~~~~~~
root@instance-1:~# cp /lib/firmware/bnx2/*.fw /lib/firmware/4.9.40-eve-ng-ukms-2+/bnx2/
cp: cannot stat '/lib/firmware/bnx2/*.fw': No such file or directory
root@instance-1:~# exit
root@instance-1:~# reboot

次にrootユーザーでsshでログインを行うと青い画面になって
eve-ngのセットアップが始まります。
password,domain, ntp, proxyなどなどのセットアップが終わると
自動的に再起動します。
その後、再起動後にブラウザ(http)にアクセスするとeve-ngのlogin画面が表示されます。

Tips. 複数展開のための工夫

今回作成したインスタンスをもとにVMを展開するとnic名?が原因で
インスタンスにアドレスがうまく割り当てられないくて?(詳細不明)
うまく展開できない事象が発生したので/etc/interfacesをデフォルトのnic名(ens4)に書き換えます

iface eth0 inet manual
auto pnet0
iface pnet0 inet dhcp
    bridge_ports eth0
    ## add
    bridge_ports ens4
    bridge_stp off

4.終わりに

今回、スナップショットではなくイメージを作っている理由は
私の知識不足で差がわからないからです
同じことができるならどっちでもよかった
ちなみにVMwareを使ってimportしたほうが圧倒的に楽ですね

これでエミュレーターの環境は整いました。
しかし、これはあくまでも箱だけなので、
肝心のjunosやiol、server系OSなどのOS(中身)がないと意味がありません。
OS・OSのセットアップ方法に関しては書かないので、
なんでも知ってるgoogleさんにeve-ng iolとかって聞いたらだめですよ。

セットアップ方法に関しては、
以下のように調べたら大概出てくるはずです。

vSRXをセットアップしたい場合(例)
eve-ng vSRX

初投稿の拙い記事を読んだ方がもしいらっしゃれば
読んでいただきありがとうございました。