GNS3 on GCP を構築してGNS3のネットワークにローカルPCからアクセスする
構築した環境
GCP Compute Engine に GNS3 と OpenVPN をデプロイして、GNS3 のネットワークにローカルから接続できるようにしました。
GNS3 on GCP のメリット
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 を利用します。
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 の仮想ネットワークに直接アクセスできることを確認できました。