えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

GNS3とlibvirtの仮想ネットワークをブリッジ接続する

お伝えしたいこと

GNS3上に追加した仮想マシンlibvirtの仮想ネットワークに接続する方法を紹介します。

仮想マシンは、必ずしもQEMU上で動作している必要はありません。
例えば、VPCSのような仮想マシンではないノードも含めてlibvirtの仮想ネットワークに接続し、DHCPIPアドレスを付与したり、ホストマシンと通信させることが可能です。

libvirtネットワークに接続することで、ホストマシンからVMへのSSHや、VMからインターネットへのアクセスが可能となります。

前提条件

本記事の手順は、GNS3とlibvirtベースのKVM環境のセットアップが完了していることを前提としています。
セットアップがこれからの方は、それぞれ以下のリンクを参照してください。

KVM環境について補足すると、仮想ネットワークが作成済みであることが一番重要です。
仮想ネットワークの構成については、以下のコマンドで確認できます。

仮想ネットワークが作成済みで、NATやDHCPIPアドレス範囲が適切に設定されていることをご確認ください。

virsh net-list
#  Name        State    Autostart   Persistent
# ----------------------------------------------
#  default     active   yes         yes

virsh net-dumpxml default
# <network>
#   <name>default</name>
#   <uuid>b130cf72-a5eb-4414-9fd8-7d1182f2b50b</uuid>
#   <forward mode='nat'>
#     <nat>
#       <port start='1024' end='65535'/>
#     </nat>
#   </forward>
#   <bridge name='virbr0' stp='on' delay='0'/>
#   <mac address='52:54:00:96:e6:67'/>
#   <ip address='192.168.122.1' netmask='255.255.255.0'>
#     <dhcp>
#       <range start='192.168.122.101' end='192.168.122.254'/>
#     </dhcp>
#   </ip>
# </network>

(参考) 前提知識

本ブログで実施する手順について、前提知識となる情報をこちらのセクションで紹介します。
既にご存知の方は読み飛ばしても結構です。

libvirtの仮想ネットワーク

libvirtの仮想ネットワークは、VirtualBoxでいうところのホストオンリーとNAT相当の機能を持ちます。

libvirtの仮想ネットワークとVMを接続することで、VMから以下の通信ができるようになります。

  • ホストマシンとの通信 (SSH, HTTPS, SCP, ...)
  • libvirt組み込みのDHCP/DNSサーバの利用
  • ホストマシン外部への通信 (インターネット通信など)
  • 仮想ネットワークを介した他VMとの通信

GNS3のCloud node

今回は、GNS3のCloud nodeを使ってlibvirtネットワークとの接続を行います。

Cloud Nodeとは、いわゆるブリッジ接続を提供する機能のことです。
GNS3上で以下のようにCloud Nodeを追加して配線することで、ホストマシン上のNICとブリッジ接続できます。

gns3_cloud

Cloudと聞くと「AWSなどのクラウドサービスと接続する機能?」と思われるかもしれませんが、実際には単なるブリッジ接続のことです。
ブリッジ接続とは、「ホストマシンのNICとL2スイッチ越しに接続された状況」を仮想的に実現する機能です。
もちろん、ホストマシンのNICが複数存在する場合は「どのNICとブリッジ接続するか」を設定することができます。

仮にCloud nodeがホストマシンのEth0とブリッジ接続するよう構成したと仮定します。
この時、論理的には以下のような構成になります。

bridge_nw_diagram

手順

本セクションで、GNS3上で動作しているVMlibvirtの仮想ネットワークと接続するための手順を紹介します。
前述の通り、GNS3のCloud nodeを使用します。

virbrインターフェース番号を調べる

libvirtの仮想ネットワークは、ホストマシン上ではvirbrX (※Xには0以上の数字が入る) というインターフェース名で表現されます。
Cloud nodeでブリッジ設定を行うために、まずはこのインターフェース名を調べておく必要があります。

まず、目的の仮想ネットワーク名を調べます。
今回はdefaultという仮想ネットワーク名が対象だったとします。
(※) gns3という名前で、GNS3検証環境用の仮想ネットワークを作るのも良いと思います。それにより、既存のKVM仮想マシンが持つIPアドレスとの重複を気にせず、より自由にIPアドレスを割り当てられるようになります

virsh net-list

#  Name        State    Autostart   Persistent
# ----------------------------------------------
#  default     active   yes         yes

続いて、defaultに対応するインターフェース名を確認します。
以下の情報より、virbr0であることがわかりました。

以降のセクションでvirbr0に対するブリッジを設定します。
インターフェース番号が異なる方は読み替えてください。

virsh net-info default

# Name:           default
# UUID:           b130cf72-a5eb-4414-9fd8-7d1182f2b50b
# Active:         yes
# Persistent:     yes
# Autostart:      yes
# Bridge:         virbr0

(参考) GNS3上でCloud Nodeを使用する

GNS3の初期設定なしでCloud nodeを使うための手順を紹介します。
初期設定したほうが便利なので、こちらの手順は参考程度にご覧ください。

まず、GNS3を起動します。
そして、End devicesセクションからCloud nodeを追加します。
また、Cloud nodeと接続するための仮想マシンももう一台追加しておきます。

use_default_cloud1

cloudをダブルクリックして、設定画面を開きます。
Show special Ethernet interfacesにチェックを入れて、ドロップダウンリストからvirbr0を選択してAddから追加します。
OKを選択して設定画面を閉じます。

use_default_cloud2

VMからcloudのvirbr0に対して配線します。
これでVMvirbr0にブリッジ接続したことになります。

use_default_cloud3

ここで設定としては一旦完了です。
以下で正しくネットワークが構成されていることを確認します。

今回の環境では、virbr0は以下の構成になっているとします。
(※) 仮想ネットワークの定義は、#前提条件に記載したvirsh net-dumpxmlを参照してください

  • NAT有効 (インターネット接続性あり)
  • NWアドレスは192.168.122.0/24
  • DHCP有効 (192.168.122.101-254)

VMを起動してIPアドレス設定や疎通性を確認します。
VMではDHCPが有効化されているため、仮想ネットワークからIPアドレスが割り振られました。
また、インターネット通信が可能であることも確認できました。
curlのオプションは、HTTP応答ステータスコードのみを表示するよう出力を整形するためのものです。

ip address show ens3

# 2: ens3
#     inet 192.168.122.250/24
# (一部のみ抜粋)

curl -so /dev/null -w '%{http_code}\n' https://www.google.co.jp

# 200

以降のセクションでは、Cloud nodeの設定を保存して使いまわすための手順を紹介します。

Cloud Nodeの登録

まず、GNS3の設定画面を開きます。
(※) Edit > Preferences、またはCtrl+Shift+P

Cloud nodesの画面でNewを選択してCloud nodeを追加します。

add_cloud1

作成するノードの名前を聞かれるので、わかりやすい名前を設定しましょう。
今回はホストからのログインやインターネット通信に使う「管理用ネットワーク」という意味を込めてManagement networkとしました。

add_cloud2

Cloud Nodeの編集

作成したCloud nodeを更に編集します。
以下の画面のようにEditを選択し、更に編集しましょう。

edit_cloud1

Ethernet interfaces

Ethernet interfacesでは、virbr0のみをブリッジ先として登録しておきます。
他のインターフェースは配線の際に邪魔になるので、除外しておきましょう。

操作方法としては以下のようになります。

  • Show special Ethernet interfacesにチェックを入れる
  • ドロップダウンリストからvirbrXを選択する
  • Addを選択する

edit_cloud2

Misc.

Misc.タブでは、お好みに合わせて枠で囲んだ箇所を中心に設定します。

ネットワーク名はmgmt_NW{0}という名前をつけました。

アイコンはAffinity Circle Greencloudに変更しました。
他のアイコンと区別しやすいように、管理用ネットワークのアイコンや配線を緑色に統一しようという思想です。

edit_cloud3

こちらで設定は完了です。
OKを選択して設定画面を閉じてください。

登録したNodeを使う

登録したCloud nodeをドラッグ&ドロップして追加すれば、保存した設定のCloud nodeを直ちに使うことができます。
アイコンがわかりやすくて便利だと思います。

Cloud nodeの便利な使い方

Cloud nodeの使い方について、便利なテクニックをいくつか補足します。

L2スイッチに接続して使う

GNS3上で、Cloud nodeには1本しか配線できません。
したがって、複数のVMと配線したい時は間に組み込みのL2スイッチを配置するのが定石です。

私の環境では、前述の通りに作成したCloud nodeとセットで使うためのL2スイッチをカスタマイズして作成しました。
動作はデフォルトのcloudと全く同じなのですが、見やすさのためにノード名とアイコンのみカスタマイズしました。
これも管理ネットワークを緑色に統一するためです。

L2スイッチを追加するには、GNS3の設定画面のBuilt-in > Ethernet switchesから設定してください。

設定内容を以下に示します。
Default name formatSymbolのみ編集しました。
SymbolはAffinity Circle Greenswitchです。

edit_l2_switch

配線の色も変更する

GNS3上でケーブルを右クリックすると、ケーブルの色や太さを変更することができます。
ケーブル本数が増えるとどうしても見づらくなってしまうので、管理用途とサービス用途でケーブルの色を変えることで対策できると便利です。
下図に例を示します。

green_cables

複数のCloud nodeを追加しても良い

Cloud nodeに接続するホストが増えてくると、だんだんと配線がつらくなってくると思います。
例えば上記の構成図において、更に上にもう一台L3SW2が増えた場合はどうでしょうか?
一番下のmgmt_SW1から配線しようとすると、ケーブルが重なって見づらくなってしまいます。

そんなときは、同じCloud nodeをもう一つ追加して配線しちゃいましょう。
こういった配線でも、全てのL3SWとServerは問題なく管理ネットワークと接続できます。

multiple_clouds

まとめ

GNS3のCloud nodeを使って、libvirtの仮想ネットワークとVMを接続する手順を紹介しました。

今回の手順により、VMへの管理アクセス、VMからのインターネット接続、そしてVM間通信が全て可能となります。
しかしあれこれ繋いでしまうと広大なL2ネットワークになってしまうので、ほどほどに。
virbrとのブリッジ接続は、主に管理用のネットワークに使うと良いと思います。

もちろん、物理ネットワーク機器とGNS3上のVMをブリッジ接続するためにCloud nodeを利用するのも良い使い方です。
その場合は、eth0などの物理NICとブリッジ接続するようCloud nodeを設定します。
これが一番王道的なブリッジ接続の使い方ですね。