CentOS
環境構築
docker
GNS3

GNS3 でバックエンド開発を便利に(前編)

後編はこちら

はじめに

Qiita 読者の多くはインフラ関連には興味が無いかと思います。
GNS3 の紹介記事の多くはネットワークの勉強を目的としたもので、自分には関係無いと感じているかと思います。
そこで、本記事ではGNS3 をうまく活用すればバックエンド開発に役に立つということを紹介していきます。

例をお見せします。
下の画像は私が使っているGNS3 の画面キャプチャーで、Linux マシーンとルーターが動作しています。
GNS3.png
機能の説明は後述しますが、雲のアイコンがGNS3 サーバーの外部との接続点です。
白抜きの四角の部分に私が開発を担当するシステムの現物の開発マシーンがあり、つながっています。
GNS3 で構築した部分は何かというと、他部署が担当するシステムの要所部分を再現したものです。
これでシステム連携試験も含めた開発を気軽に行えるというわけです。

これだけのマシーンを現物で揃えようとするといったいいくら時間とお金と場所がかかるのでしょうか。
配線を変えたくなったら現地に足を運ぶ必要もでてきます。
GNS3 なら自席から動くこと無く配線はもちろん、マシーンの増減、入れ替え、電源OFF/ON を行えます。
便利すぎて、今や私はGNS3 無しでは開発できないくらいです。

また、気になるミドルウェアを導入したシステムのPoC をGNS3 上で行い、うまくいきそうなら本格的に開発環境を構築していく、という使い方もあります。

難があるとすれば、高いマシーンスペックが要求されるということです。
本記事のような使い方だとGNS3 インストールマシーンがノートPC の場合ほぼ動きません。

前編ではCentOS7 へのGNS3 のインストール手順、後編ではLinux 仮想マシーンとcisco CSR1000v とDocker コンテナのGNS3 への取り込みと使い方を説明します。
Ubuntu やLinux Mint ならapt-get 一発で苦もなくインストールできますが、CentOS ではソースからインストールするしかありません。手間のかかるソースからのインストール方法を日本語ドキュメントでは見たことが無いのでここではそれを書きます。
また、複数人で同時に使うための運用方法も載せます。

1. 構成

system-structure.png
物理マシーンにKVM をインストールし、そこにGNS3 用の仮想マシーンを立て、物理マシーンで作成した他の仮想マシーンやGNS3 マシーン内のDocker コンテナを取り込む。もちろん、物理マシーンに直接GNS3 をインストールして仮想化1階構成にしても構わない。

ユーザーはGNS3 マシーンにリモートデスクトップして利用する。

GNS3 マシーンに必要なスペックは、今まで使ってきた経験からして以下の通り。
もちろん、使い方によってはもっと必要になることもあるが、だいたいこれくらいあれば最初のうちは足りる。
HDD はあまり消費しない。

CPU Memory HDD
同時利用ユーザー
1人あたり
同時利用ユーザー
1人あたり
ユーザー何人でも
12 24GB 50GB くらい

以降、GNS3 マシーンのホスト名をCentOS7-GNS3-01 とする。
[マシーン名] と書いてあったらそのマシーンで作業するという意味。

2. 準備

2-1. 物理マシーン

CentOS7 を最小構成でインストールする。
GUI は必要無い。

2-1-1. nested を有効に

[物理マシーン]
仮想マシーンとして立てたGNS3 マシーンの中で仮想マシーンを動かす、つまり、仮想化2階建てになるので物理マシーンのCPU の仮想化技術を仮想化1階部分のCPU にも使わせる必要がある。
それを有効にする設定をする。

nested を有効にするためのmodprobe ファイルを新規作成。

/etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1

設定を有効にする。

sudo modprobe -r kvm_intel 
sudo modprobe kvm_intel

確認。
Y とでれば良い。

cat /sys/module/kvm_intel/parameters/nested
Y

2-1-2. KVM のインストール

[物理マシーン]

sudo yum -y update
sudo yum -y groupinstall "Virtualization Host"
sudo yum -y install virt-install virt-top virt-clone
sudo systemctl start libvirtd
sudo systemctl enable libvirtd

vlan とbridge の作成。bond0 の部分は自分の環境に合わせて読み替える。
アドレス部分は自分の環境に合わせる。

sudo nmcli c add type bridge ifname br205 con-name br205
sudo nmcli c mod br205 bridge.stp no
sudo nmcli c mod br205 ipv4.method manual ipv4.address "192.168.205.201/24" ipv4.gateway 192.168.205.254 ipv4.dns 8.8.8.8 ipv6.method ignore
sudo nmcli c add type vlan ifname vlan205 con-name vlan205 dev bond0 id 205
sudo nmcli c mod vlan205 connection.master br205 connection.slave-type bridge

2-1-3. CentOS7 のインストールDVD のダウンロード

CentOS-7-x86_64-DVD-1804.iso をダウンロードして/opt/Linux に保存しておく。

2-2. GNS3 マシーンの作成

2-2-1. 作成

[物理マシーン]
ks ファイルの作成。

CentOS7-GNS3-01.ks
cmdline
install
lang ja_JP.UTF-8
keyboard jp106

network --device eth0 --onboot yes --bootproto=static --ip=192.168.205.230 --netmask=255.255.255.0 --gateway=192.168.205.254 --nameserver=8.8.8.8 --noipv6
network --hostname=CentOS7-GNS3-01

zerombr
bootloader --location=mbr --append="crashkernel=auto biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8"

clearpart --linux --drives=vda
part /boot --fstype xfs --size=1024 --ondisk=vda
part pv.1 --size=1024 --grow --ondisk=vda
volgroup centos pv.1
logvol / --fstype xfs --name=root --vgname=centos --size=1024 --grow

rootpw --plaintext rootpassword
user --groups=wheel --name=user-01 --password=user-01password --plaintext
authconfig --enableshadow --passalgo=sha512
selinux --disabled
firstboot --disabled
timezone --utc Asia/Tokyo
reboot

%packages --nobase
%end

ディスクイメージファイルの作成。

sudo qemu-img create -f qcow2 /var/lib/libvirt/images/CentOS7-GNS3-01.qcow2 64G

仮想マシーンの作成。

sudo virt-install --connect=qemu:///system \
--name=CentOS7-GNS3-01 \
--cpu host \
--vcpus=12 \
--ram=24576 \
--accelerate \
--hvm \
--disk /var/lib/libvirt/images/CentOS7-GNS3-01.qcow2,size=64,format=qcow2,bus=virtio \
--location='/opt/Linux/CentOS-7-x86_64-DVD-1804.iso' \
--network bridge=br205,model=virtio \
--nographics \
--initrd-inject=./CentOS7-GNS3-01.ks \
--extra-args='ks=file:/CentOS7-GNS3-01.ks biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8' \
--os-type=linux \
--os-variant=centos7.0 \
--arch=x86_64

2-2-2. 基本セットアップ

[CentOS7-GNS3-01]
yum update & reboot

sudo yum -y update
sudo reboot

EPEL リポジトリの追加とデフォルトで無効設定。

sudo yum -y install epel-release
/etc/yum.repos.d/epel.repo
[epel]
enabled=0

リモートデスクトップ用のfirewalld のサービス定義を新規作成。

/etc/firewalld/services/RDP.xml
<?xml version="1.0" encoding="utf-8"?> 
<service>
 <short>RDP</short>
 <description>RDP</description>
 <port protocol="tcp" port="3389"/>
</service>
sudo chmod 640 /etc/firewalld/services/RDP.xml

firewalld の設定。

sudo nmcli c mod eth0 connection.zone internal
sudo firewall-cmd --set-default-zone=internal
sudo firewall-cmd --zone=internal --add-service=RDP --permanent
sudo firewall-cmd --zone=internal --remove-service=mdns --permanent
sudo firewall-cmd --zone=internal --remove-service=samba-client --permanent
sudo firewall-cmd --zone=internal --remove-service=dhcpv6-client --permanent
sudo firewall-cmd --reload

2-2-3. GUI 環境のインストールと設定

[CentOS7-GNS3-01]
GNOME Desktop のインストールと起動設定。

sudo yum -y groupinstall "GNOME Desktop"
sudo systemctl set-default graphical.target

これは好みだが、vi で自動でコメントアウトが入らないようにする設定を追記する。

/etc/vimrc
" auto comment off
augroup auto_comment_off
autocmd!
autocmd BufEnter * setlocal formatoptions-=r
autocmd BufEnter * setlocal formatoptions-=o
augroup END

RDP のインストールとキーマップファイルの入れ替え。

sudo yum -y --enablerepo=epel install xrdp tigervnc-server
cd /etc/xrdp
sudo wget http://www.mail-archive.com/xrdp-devel@lists.sourceforge.net/msg00263/km-e0010411.ini
sudo cp km-e0010411.ini km-0411.ini
sudo cp km-e0010411.ini km-e0200411.ini
sudo cp km-e0010411.ini km-e0210411.ini

色深度を24ビットに変更。

/etc/xrdp/xrdp.ini
max_bpp=24

以下2つは、リモートデスクトップしたときに色々警告のポップアップが出ないようにするための設定。
それぞれ、追記と新規作成。

/etc/xdg/autostart/gnome-software-service.desktop
X-GNOME-Autostart-enabled=false
/etc/polkit-1/localauthority/50-local.d/allow-colord.pkla
[Allow colord for all users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=yes
ResualtInactive=auth_admin
ResultActive=yes

リモートデスクトップサービスの自動起動設定。

sudo systemctl enable xrdp.service

reboot してリモートデスクトップできるか確認してみる。

sudo reboot

ここまでできたら一度シャットダウンしてディスクイメージファイルをバックアップしておくことを推奨する。
次の項からGNS3 をインストールするわけだが、ソースから色々入れるので問題が発生したときに後戻りし難い。そういうときはバックアップしたディスクイメージファイルで上書いてやり直す。

3. GNS3 に必要なモジュールのインストール

gns3-gui releases でどのバージョンのGNS3 を入れるか決める。
ここでは執筆時点(2018/10/17) での最新版2.1.11 を入れることにする。

ソースから入れるものはその時点での最新バージョンに読み替えて手順を実行する。
どうしてもエラーが出る場合は少し古いバージョンで試す。
もちろん、依存関係のエラーなら足りないモジュールを先に入れる。

[CentOS7-GNS3-01]
作業用ディレクトリの作成。

mkdir ~/Downloads

必要パッケージのインストール。

sudo yum -y install gcc gcc-c++ zlib-devel openssl-devel sqlite-devel bzip2-devel telnet git

python3 のインストール。

cd ~/Downloads
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz
xz -d Python-3.6.6.tar.xz
tar xvf Python-3.6.6.tar
cd Python-3.6.6
./configure
make
make test
sudo make install
sudo ln -s /usr/local/bin/python3.6 /usr/bin/python3

setuptools のインストール。

cd ~/Downloads
wget https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz
tar zxvf six-1.11.0.tar.gz
cd six-1.11.0/
sudo python3 setup.py install

cd ~/Downloads
wget https://files.pythonhosted.org/packages/cf/50/1f10d2626df0aa97ce6b62cf6ebe14f605f4e101234f7748b8da4138a8ed/packaging-18.0.tar.gz
tar zxvf packaging-18.0.tar.gz
cd packaging-18.0
sudo python3 setup.py install

cd ~/Downloads
wget https://files.pythonhosted.org/packages/48/69/d87c60746b393309ca30761f8e2b49473d43450b150cb08f3c6df5c11be5/appdirs-1.4.3.tar.gz
tar zxvf appdirs-1.4.3.tar.gz
cd appdirs-1.4.3
sudo python3 setup.py install

cd ~/Downloads
wget https://files.pythonhosted.org/packages/6e/9c/6a003320b00ef237f94aa74e4ad66c57a7618f6c79d67527136e2544b728/setuptools-40.4.3.zip
unzip setuptools-40.4.3.zip
cd setuptools-40.4.3
sudo python3 setup.py install

ws4py のインストール。

cd ~/Downloads
git clone https://github.com/Lawouach/WebSocket-for-Python
cd WebSocket-for-Python
sudo python3 setup.py install

Qt5 のインストール。

sudo yum -y install qt5*
sudo ln -s /usr/bin/qmake-qt5 /usr/bin/qmake

sip のインストール。

cd ~/Downloads
wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.19.13/sip-4.19.13.tar.gz
tar zxvf sip-4.19.13.tar.gz
cd sip-4.19.13
python3 ./configure.py
make
sudo make install

PyQt5 のインストール。
最新のPyQt5 ではGNS3 が対応していない場合があるのでgns3-gui releases を読んでどのバージョンのPyQt5 を入れれば良いか確認する。GNS3 2.1.11 では

Downgrade to Qt 5.9. Fixes #2592.

とあるので5.9 の中の最新版を使うことにする。
また、make に30分以上かかるので昼休憩や会議の直前などに実行すると良い。

cd ~/Downloads
wget https://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.9.2/PyQt5_gpl-5.9.2.tar.gz
tar zxvf PyQt5_gpl-5.9.2.tar.gz
cd PyQt5_gpl-5.9.2
python3 ./configure.py 
   type: "yes" to accept the license
make
sudo make install

netifaces のインストール。

cd ~/Downloads
wget https://files.pythonhosted.org/packages/81/39/4e9a026265ba944ddf1fea176dbb29e0fe50c43717ba4fcf3646d099fe38/netifaces-0.10.7.tar.gz
tar zxvf netifaces-0.10.7.tar.gz
cd netifaces-0.10.7
sudo python3 setup.py install

Dynamips の必要モジュールのインストール。

sudo yum -y install cmake elfutils-libelf-devel libpcap-devel libuuid-devel

IOU に必要なモジュールのインストール。

sudo yum -y install openssl-libs.i686
sudo ln -s /usr/lib/libcrypto.so.10 /usr/lib/libcrypto.so.4

cd ~/Downloads
wget http://ndevilla.free.fr/iniparser/iniparser-3.1.tar.gz
tar zxf iniparser-3.1.tar.gz
cd iniparser
make
sudo cp libiniparser* /usr/lib
sudo cp src/*.h /usr/include

4. GNS3 のインストール

[CentOS7-GNS3-01]
GNS3 のダウンロード。

cd ~/Downloads
wget https://github.com/GNS3/gns3-gui/releases/download/v2.1.11/GNS3-2.1.11.source.zip
unzip GNS3-2.1.11.source.zip

gns3-server のインストール。

unzip gns3-server-2.1.11.zip
cd gns3-server-2.1.11
sudo python3 setup.py install

gns3-gui のインストール。

cd ~/Downloads
unzip gns3-gui-2.1.11.zip
cd gns3-gui-2.1.11
sudo python3 setup.py install

ubridge のインストール。

cd ~/Downloads
unzip ubridge-0.9.14.zip
cd ubridge-0.9.14/
make
sudo make install

Dynamips のインストール。

cd ~/Downloads
unzip dynamips-0.2.17
cd dynamips-0.2.17
mkdir build
cd build
cmake ..
make
sudo make install
sudo setcap cap_net_admin,cap_net_raw=ep /usr/local/bin/dynamips

IOU network support のインストール。

sudo yum -y install bison flex

VPCS のインストール。

sudo yum -y install glibc-static

cd ~/Downloads
unzip vpcs-0.6.1.zip
cd vpcs-0.6.1/src/
./mk.sh
sudo cp vpcs /usr/local/bin/

cpulimit のインストール。

cd ~/Downloads
wget http://sourceforge.net/projects/cpulimit/files/cpulimit/cpulimit/cpulimit-1.1.tar.gz
tar zxvf cpulimit-1.1.tar.gz
cd cpulimit-1.1
make
sudo cp cpulimit /usr/local/bin

QEMU のインストール。

sudo yum -y --enablerepo=epel install qemu-system-x86

wireshark のインストール。

sudo yum -y install wireshark-gnome

5. Docker のインストール

[CentOS7-GNS3-01]

Docker のインストールとグループの作成と起動。

sudo yum -y install docker
sudo groupadd -g 2000 docker
sudo gpasswd -a <user> docker

sudo systemctl enable docker
sudo systemctl start docker

以降、ユーザーを追加したらdocker グループを割り当てる。

6. 基本設定

6-1. 共通設定

[CentOS7-GNS3-01]
リモートデスクトップ接続する。

アプリケーション → お気に入り → 端末
からgns3 コマンドで起動。
start-gns3.png

wizard が始まろうとするが必要無いのでcancel.
skip-wizard.png

Edit → Preferences
gns3-preferences.png

General → Cosole applications → Edit
gns3-console-application-edit.png

Gnome Terminal を選択し、-t オプションを削除する。
gns3-custom-gnome-terminal.png

以上の設定は全ユーザー行う。

6-2. ポート設定

[CentOS7-GNS3-01]
GNS3 で使うポートが全ユーザー同じになっているので、一定のルールで分ける必要がある。
以下のスクリプトでユーザー毎に使うポートを決められる。
ユーザーID から割り出しており、ユーザーID が1000 から連番で割り当てらていることが前提である。
この割り振りなら100人までGNS3 を利用できる。
尚、20000台と30000台のポートはGNS3 Server が使っているようなのでユーザーでは使えない。

get_gns3_parameter.pl
#!/usr/bin/perl
# 説明   : ユーザーID からGNS3 の設定で必要なポート番号を割り出す。
# 作成日 : 
# 作成者 : 

use strict;
use warnings;

my $uid = $>;

my $user_id = $uid - 1000;
my $local_server_port = 8000 + $user_id;
my $console_port_from = 40000 + 100 * $user_id;
my $console_port_to   = 40099 + 100 * $user_id;
my $udp_tunnel_port_from = 10000 + 100 * $user_id;
my $udp_tunnel_port_to   = 10099 + 100 * $user_id;

if($user_id == 100){
 $console_port_from = 50000;
 $console_port_to   = 51000;
 $udp_tunnel_port_from = 8101;
 $udp_tunnel_port_to   = 9999;
}
elsif($user_id > 100){
 print 'GNS3 を利用できません。' . "\n";
 exit(0);
}

print '[GNS3 ユーザーID]' . "\n";
print $user_id . "\n\n";

print '[GNS3 => Edit => Preferences => Server の設定]' . "\n";
print ' General settings' . "\n";
print '  Port: ' . $local_server_port . ' TCP' . "\n\n";

print ' Console port range'. "\n";
print '  ' . $console_port_from . ' TCP to '. $console_port_to . ' TCP' . "\n\n";

print ' UDP tunneling port range'. "\n";
print '  ' . $udp_tunnel_port_from . ' UDP to ' . $udp_tunnel_port_to . ' UDP' . "\n\n";

適当なディレクトリに置きalias 登録をして簡単なコマンドで実行できるようにする。
下記例ではget-gns3-parameterというコマンドでこのスクリプトを実行できるようにしている。

sudo mv ~/get_gns3_parameter.pl /usr/local/bin
sudo chown root:root /usr/local/bin/get_gns3_parameter.pl
/etc/bashrc
alias get-gns3-parameter="perl /usr/local/bin/get_gns3_parameter.pl"

ログインし直しget-gns3-parameterで確認したポートを設定する。
Edit → Preferences

Server → Main server

gns3-port-settings.png

全ユーザー必ずこの設定を行う。

6-3. CPU とメモリーの追加

運用中CPU やメモリーが足りなくなったら、シャットダウンしてから以下のようにして割り当てを変更する。
[物理マシーン]
CPU : 16
メモリー : 32GB
に増加させる場合。

sudo virsh setvcpus CentOS7-GNS3-01 16 --config --maximum
sudo virsh setvcpus CentOS7-GNS3-01 16 --config
sudo virsh setmaxmem CentOS7-GNS3-01 32G
sudo virsh setmem CentOS7-GNS3-01 32G --config

7. 疎通確認

GNS3 内部から外部に疎通できるか確認する。
File → New blank project
でプロジェクトを新規作成する。
gns3-new-project.png

Cloud とVPCS を配置して結線する。
動作開始させて配置したVPCS のアイコンをダブルクリックか右クリック → Console でコンソールを開く。
vpcs-map.png
ip <ip address> <subnetmask> <default gateway>でアドレスを設定してsaveで保存する。
外に対してping を実行して疎通できるか確認する。
vpcs-ping.png
このVPCS は疎通確認用のノードとして色々使える。
?で他のコマンドの一覧を参照できるので活用してみる。

まとめ

GNS3 をソースからインストールし複数人で使うための設定まで行った。
後編では仮想マシーンを取り込んで動かしていく。

後編はこちら