インフラのーと

インフラエンジニアが気になったことを書いていきます。アウトプットのための技術ブログ。

GNS3 on GCP を構築してGNS3のネットワークにローカルPCからアクセスする

構築した環境

GCP Compute Engine に GNS3 と OpenVPN をデプロイして、GNS3 のネットワークにローカルから接続できるようにしました。

GNS3 on GCP のメリット

  • GNS3 を動かすインスタンスをスケールアップ可能
  • GCP では Nested KVM をサポートしているので、vEOS や Nexus 9000v を動かすことができる

GCP の準備

プロジェクトの作成

新しくプロジェクトを作成(GNS3)し、その中で作業を進めます。リージョンは asia-northeast1 (東京) 、ゾーンは asia-northeast1-b を使います。

カスタムブートイメージの作成

Ubuntu 18.04 をベースに、Nested KVM を有効にしたカスタムブートイメージを作成します。作成のためには Cloud API を操作する必要があるので Cloud Shell を使用しました。

gcpuser1@cloudshell:~$ gcloud projects list
PROJECT_ID              NAME       PROJECT_NUMBER
gns3-2xxxx1             GNS3       328517071241
gcpuser1@cloudshell:~$ gcloud config set project gns3-2xxxx1 # 操作対象の Project を選択
Updated property [core/project].
gcpuser1@cloudshell:~ (gns3-2xxxx1)$
gcpuser1@cloudshell:~ (gns3-2xxxx1)$ gcloud compute disks create disk1 --image-project ubuntu-os-cloud --image-family ubuntu-1804-lts  --zone asia-northeast1-b
Created [https://www.googleapis.com/compute/v1/projects/gns3-2xxxx1/zones/asia-northeast1-b/disks/disk1].
NAME   ZONE               SIZE_GB  TYPE         STATUS
disk1  asia-northeast1-b  10       pd-standard  READY
gcpuser1@cloudshell:~ (gns3-2xxxx1)$
gcpuser1@cloudshell:~ (gns3-2xxxx1)$ gcloud compute images create nested-vm-image \
>   --source-disk disk1 --source-disk-zone asia-northeast1-b  \
>   --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"  # Nested KVM の有効化
Created [https://www.googleapis.com/compute/v1/projects/gns3-2xxxx1/global/images/nested-vm-image].
NAME             PROJECT      FAMILY  DEPRECATED  STATUS
nested-vm-image  gns3-2xxxx1                      READY
gcpuser1@cloudshell:~ (gns3-2xxxx1)$

Nested KVM を有効にしたイメージ nested-vm-image が作成されました。

インスタンス起動

作成したイメージからインスタンスを起動します。ブートディスクに作成したカスタムブートイメージを指定しています。マシンタイプは余裕をもって n1-standard-2 を選択していますが n1-standard-1 でも重いシミュレーションを動かさなければ十分動作しました。

インスタンスの起動が完了すると、エフェメラル IP が振られます。エフェメラル IP はインスタンスが停止すると変更される可能性があるので、常用の検証環境として起動・停止を繰り返す環境であれば、静的 IP を設定しておく必要があります。(参考:公式ドキュメント)今回はエフェメラル IP のまま進めます。

GNS3 と OpenVPN のインストール

起動したインスタンスに SSH ログインをして設定を行っていきます。公式レポジトリから GNS3 と Open VPN をインストールして再起動します。

root@gns3-server:~# apt-get update
root@gns3-server:~# apt-get -y upgrade
root@gns3-server:~# cd /tmp
root@gns3-server:/tmp# curl -s https://raw.githubusercontent.com/GNS3/gns3-server/master/scripts/remote-install.sh > gns3-remote-install.sh 
root@gns3-server:/tmp# bash gns3-remote-install.sh --with-openvpn --with-iou --with-i386-repository
root@gns3-server:~# reboot

GNS3 から外部に接続するための linux-bridge の設定します。

root@gns3vm:~# cd /etc/netplan/
root@gns3vm:/etc/netplan# vim 99-gns3br0.yaml
root@gns3vm:/etc/netplan# cat /etc/netplan/99-gns3br0.yaml 
network:
        version: 2
        renderer: networkd
        bridges:
                gns3br0:
                        addresses:
                                - 172.16.0.1/24
root@gns3vm:/etc/netplan# netplan apply

OpenVPN のインストールが完了すると、/root に OpenVPN のクライアント用設定ファイルが作成されます。ローカルから疎通性をもたせる GNS3 のネットワーク(gns3br0 : 172.16.0.0/24)へのルートを設定ファイルに追加します。

root@gns3vm:~# ls
client.ovpn
root@gns3vm:~# echo "route 172.16.0.0 255.255.255.0" >> client.ovpn 
root@gns3vm:~# 

OpenVPN の通信は UDP 1194 ポートを使用します。この通信を許可するファイアウォールルールを GCP VPC 追加します。

OpenVPN で GCP インスタンスに接続

OpenVPN Client ソフトウェアをローカルにインストールします。今回は MacOS で接続を行うので Tunnelblick を利用します。

tunnelblick.net

GCP インスタンスから設定ファイル(client.ovpn)をローカルにダウンロードし、Tunnelblick にインポートして VPN 接続します。ローカルPC から、GCPインスタンスの gns3br0 へ ping が通れば VPN 接続は完了です。

user1@local ~ % ping -c 1 172.16.0.1
PING 172.16.0.1 (172.16.0.1): 56 data bytes
64 bytes from 172.16.0.1: icmp_seq=0 ttl=64 time=28.248 ms

--- 172.16.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 28.248/28.248/28.248/0.000 ms
user1@local ~ %

GNS3 の設定

GNS3 Client をローカルで起動して、サーバーに GCP インスタンスを指定します。

GNS3 -> Preferences -> Server

動作確認

次のようなトポロジーを作成し、vEOS の Management1 にローカルからアクセス出来るようにします。 Cloud1 の Ethernet Interfaces の設定で、作成した gns3br0 を追加します。gns3br0 を追加するためには Show special Ethernet Interfaces にチェックを入れる必要があります。

vEOS のコンソールから、最低限の設定を行います。(Management interface 、デフォルトルート、admin ユーザー)

vEOS-1
localhost login: admin
localhost>
localhost>en
localhost#conf t
localhost(config)#hostname vEOS-1
vEOS-1(config)#int management 1
vEOS-1(config-if-Ma1)#ip address 172.16.0.101/24
vEOS-1(config-if-Ma1)#exit
vEOS-1(config)#ip route 0.0.0.0/0 172.16.0.1
vEOS-1(config)#
vEOS-1(config)#username admin secret password
vEOS-2
localhost login: admin
localhost>en
localhost#conf t
localhost(config)#hostname vEOS-2
vEOS-2(config)#int management 1
vEOS-2(config-if-Ma1)#ip address 172.16.0.102/24
vEOS-2(config-if-Ma1)#exit
vEOS-2(config)#ip route 0.0.0.0/0 172.16.0.1
vEOS-2(config)#
vEOS-2(config)#username admin secret password

ローカルPC から GCP で動いている GNS3上の仮想スイッチに対して直接アクセスする準備が整いました。ローカルから仮想スイッチに対して ssh 接続してみます。

ローカルPC -> vEOS-1
user1@local ~ % ssh admin@172.16.0.101
Password:
Last login: Sat Nov  2 05:04:29 2019 from 172.16.253.6
vEOS-1>en
vEOS-1#show ip int brief
Interface              IP Address         Status     Protocol         MTU
Management1            172.16.0.101/24    up         up              1500
vEOS-1#
ローカルPC -> vEOS-2
user1@local ~ % ssh admin@172.16.0.102
Password:
vEOS-2>en
vEOS-2#show ip int brief
Interface              IP Address         Status     Protocol         MTU
Management1            172.16.0.102/24    up         up              1500
vEOS-2#

ローカルPC から GNS3 on GCP の仮想ネットワークに直接アクセスできることを確認できました。