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