仮想ネットワークの全体像
今回はKVMの仮想ネットワークについて解説します。KVMではホストLinuxの仮想ブリッジ機能を利用して仮想ネットワークを構成します。仮想ブリッジは,ホストLinux上に仮想的なL2スイッチを構成する機能です。複数の仮想ブリッジを構成することも可能です。
図1は,仮想NICと仮想ブリッジの接続を表します。
図1 KVM仮想ネットワークの構成

仮想NICは,ホストLinux内部のTAPデバイスを経由して仮想ブリッジに接続されます。TAPデバイスは,Linuxがユーザプロセスと通信するための仮想的なNICを提供する機能です。KVMの環境では,ホストLinuxと仮想マシン・プロセスが通信するためのインターフェースとして機能します。ゲストOSが仮想NICで送受信するパケットは,ホストLinux側のTAPデバイスから送受信されることになります。同じ仮想ブリッジに接続された仮想マシンどうしは,仮想ブリッジを経由して通信することが可能です。
仮想ブリッジの状態を確認する際は,brctlコマンドを利用するのが一般的です。仮想ブリッジに接続された仮想マシンを確認するツールも公開されています。
- Linux at IBM - KVMの仮想ネットワーク接続状態を表示するスクリプト
- http://www.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-00314E5B
仮想マシンを外部ネットワークに接続するには,2種類の方法があります。1つは,ホストLinuxの物理NICを仮想ブリッジに接続する方法です(図1の①)。これは,L2スイッチを経由して仮想マシンを外部ネットワークに接続することと同じです。仮想マシンには,外部ネットワークと同じサブネットのIPアドレスをアサインする必要があります。
もう1つは,iptablesのNAT(IPマスカレード)機能を利用する方法です。この場合は,仮想ブリッジに対してIPアドレスをアサインして,仮想マシンのゲストOSでは,これをデフォルトゲートウェイに指定します。このゲートウェイに到達したパケットについては,送信元IPアドレスを物理NICのIPアドレスに変換して外部ネットワークに送出します(図1の②)。仮想ブリッジに接続された仮想マシン全体は,外部のネットワークとは独立したプライベート・ネットワークを構成します。仮想マシンから外部のサーバに接続することは可能ですが,仮想マシン上のサーバ・アプリケーションに外部から接続することはできません。
①と②では仮想ブリッジの構成手順が異なります。
libvirtdサービスによる仮想ネットワーク構成
KVMを導入した環境では,サーバ起動時に自動的にlibvirtdサービスが起動するように設定されます。②の仮想ブリッジはlibvirtdサービスが管理しており,virt-managerから追加/削除などの管理作業が行えます。デフォルトでは,仮想ブリッジvirbr0を持った「default」という名称の仮想ネットワークが構成されます。
virt-managerで「ホスト詳細」のウィンドウを開いて[仮想ネットワーク]のタブを選択すると,図2のような仮想ネットワークの管理画面が表示されます。
図2 virt-managerの仮想ネットワーク管理画面

新規の仮想ネットワークを追加するには,画面左下の「+」マークのボタンをクリックします。また,既存の仮想ネットワークを選択して「×」マークのボタンをクリックすると,仮想ネットワークが停止します。この時「ゴミ箱」マークのボタンがクリックできるようになり,これをクリックすると,仮想ネットワークの定義が削除されます。
この方法で作成した仮想ネットワークについては,ホストLinux上で稼働するdnsmasqプロセスにより,DHCPサーバとDNSサーバの機能が提供されます。ゲストOSのIPアドレスをDHCPで自動設定することが可能です。また,外部ネットワークとの接続に必要なiptablesの設定は,libvirtdサービスが起動したタイミングで自動的に行われます。
物理NICを仮想ブリッジに接続する構成
①の仮想ブリッジを構成する際は,ホストLinuxのネットワーク設定ファイルを直接に編集する必要があります。次は仮想ブリッジbr0を作成して,物理NICのeth0を接続する設定例です。
/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
NM_CONTROLLED=no
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
HWADDR=00:14:5E:16:1A:E4
BOOTPROTO=none
BRIDGE=br0
NM_CONTROLLED=no
ホストLinuxは,ネットワーク・アドレスが192.168.1.0/24の外部ネットワークに接続されており,IPアドレス192.168.1.10を使用する前提です。MACアドレス(HWADDR)は環境に応じて書き換えて下さい。ifcfg-br0では,仮想ブリッジbr0を作成してIPアドレスをアサインしています。ifcfg-eth0では,eth0をbr0に接続する指定を行います。Red Hat Enterprise Linux 6.0ではデフォルトでNetworkManagerサービスが起動していますが,仮想ブリッジはNetworkManagerで管理することができません。NW_CONTROLLED=noは,NetworkManagerの管理外にするという指定です。
サーバを再起動すると,仮想ブリッジbr0が構成されて物理NICのeth0が接続されます。
仮想マシンの仮想ネットワーク接続
最後に,作成した仮想ネットワークに仮想マシンを接続する方法を説明します。virt-managerで新規の仮想マシンを作成する時は,仮想マシンに対して,仮想NICが1つだけアサインされます。これを接続する仮想ネットワークをウィザード画面で選択します。複数の仮想NICが必要な場合は,仮想マシンの作成が完了した後に,virt-managerから新規の仮想NICの追加を行います。仮想NICを接続する仮想ネットワークを選択するウィザード画面では,「仮想ネットワーク」と「共有物理装置」のどちらかを選択します。それぞれ,②の仮想ネットワークと①の仮想ネットワークに対応しています。
今回は,KVMの仮想ネットワーク構成についてやや駆け足で説明しました。KVMの仮想ネットワークについては,技術評論社より発行の書籍『プロのためのLinuxシステム・ネットワーク管理技術(中井悦司・著)』でも徹底的に解説しています。ぜひ参考にしてください。