お伝えしたいこと
GNS3上に追加した仮想マシンをlibvirtの仮想ネットワークに接続する方法を紹介します。
仮想マシンは、必ずしもQEMU上で動作している必要はありません。
例えば、VPCSのような仮想マシンではないノードも含めてlibvirtの仮想ネットワークに接続し、DHCPでIPアドレスを付与したり、ホストマシンと通信させることが可能です。
libvirtネットワークに接続することで、ホストマシンからVMへのSSHや、VMからインターネットへのアクセスが可能となります。
前提条件
本記事の手順は、GNS3とlibvirtベースのKVM環境のセットアップが完了していることを前提としています。
セットアップがこれからの方は、それぞれ以下のリンクを参照してください。
- KVMの初期設定、及びvirsh, virt-installによるVM作成
- 特に(参考) 仮想NICの設定変更を参照
- GNS3のインストール手順
KVM環境について補足すると、仮想ネットワークが作成済みであることが一番重要です。
仮想ネットワークの構成については、以下のコマンドで確認できます。
仮想ネットワークが作成済みで、NATやDHCP、IPアドレス範囲が適切に設定されていることをご確認ください。
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とブリッジ接続できます。

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

手順
本セクションで、GNS3上で動作しているVMをlibvirtの仮想ネットワークと接続するための手順を紹介します。
前述の通り、GNS3のCloud nodeを使用します。
virbrインターフェース番号を調べる
libvirtの仮想ネットワークは、ホストマシン上ではvirbrX (※Xには0以上の数字が入る) というインターフェース名で表現されます。
Cloud nodeでブリッジ設定を行うために、まずはこのインターフェース名を調べておく必要があります。
まず、目的の仮想ネットワーク名を調べます。
今回はdefaultという仮想ネットワーク名が対象だったとします。
(※) gns3という名前で、GNS3検証環境用の仮想ネットワークを作るのも良いと思います。それにより、既存のKVM仮想マシンが持つIPアドレスとの重複を気にせず、より自由にIPアドレスを割り当てられるようになります
virsh net-list # Name State Autostart Persistent # --------------------------------<a href="https://f.hatena.ne.jp/stopendy/20250321004229"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/stopendy/20250321/20250321004229.png" alt="multiple_clouds2"></a> -------------- # 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と接続するための仮想マシンももう一台追加しておきます。

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

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

ここで設定としては一旦完了です。
以下で正しくネットワークが構成されていることを確認します。
今回の環境では、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を追加します。

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

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

Ethernet interfaces
Ethernet interfacesでは、virbr0のみをブリッジ先として登録しておきます。
他のインターフェースは配線の際に邪魔になるので、除外しておきましょう。
操作方法としては以下のようになります。
Show special Ethernet interfacesにチェックを入れる- ドロップダウンリストから
virbrXを選択する Addを選択する

Misc.
Misc.タブでは、お好みに合わせて枠で囲んだ箇所を中心に設定します。
ネットワーク名はmgmt_NW{0}という名前をつけました。
アイコンはAffinity Circle Greenのcloudに変更しました。
他のアイコンと区別しやすいように、管理用ネットワークのアイコンや配線を緑色に統一しようという思想です。

こちらで設定は完了です。
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 formatとSymbolのみ編集しました。
SymbolはAffinity Circle Greenのswitchです。

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

複数のCloud nodeを追加しても良い
Cloud nodeに接続するホストが増えてくると、だんだんと配線がつらくなってくると思います。
例えば上記の構成図において、更に上にもう一台L3SW2が増えた場合はどうでしょうか?
一番下のmgmt_SW1から配線しようとすると、ケーブルが重なって見づらくなってしまいます。
そんなときは、同じCloud nodeをもう一つ追加して配線しちゃいましょう。
こういった配線でも、全てのL3SWとServerは問題なく管理ネットワークと接続できます。

個人的には以下の配線が一番好きです。
最も配線がスッキリしていて、快適に操作できます。
余計な仮想スイッチが挟まらないので、おそらくですが通信速度もいくらか改善することが期待されます。
ただ直感的には論理構成を理解しづらいのは否定できないので、この構成にあまり慣れていない方向けに説明するときには管理L2SWを使った構成を敢えて組むかもしれません。
ケースバイケースですね。

まとめ
GNS3のCloud nodeを使って、libvirtの仮想ネットワークとVMを接続する手順を紹介しました。
今回の手順により、VMへの管理アクセス、VMからのインターネット接続、そしてVM間通信が全て可能となります。
しかしあれこれ繋いでしまうと広大なL2ネットワークになってしまうので、ほどほどに。
virbrとのブリッジ接続は、主に管理用のネットワークに使うと良いと思います。
もちろん、物理ネットワーク機器とGNS3上のVMをブリッジ接続するためにCloud nodeを利用するのも良い使い方です。
その場合は、eth0などの物理NICとブリッジ接続するようCloud nodeを設定します。
これが一番王道的なブリッジ接続の使い方ですね。