KVM環境で仮想マシンを外部ネットワークと接続する


はじめに

KVM環境で仮想マシンを外部ネットワークと接続する方法を記述します。

iptablesのNAT(IPマスカレード)機能を利用する方法と物理NICを仮想ブリッジに
接続する方法があります。

環境

  • CentOS 6.4
  • qemu-kvm 0.12.1.2

iptablesのNAT(IPマスカレード)機能を利用する方法

仮想マシンから外部のサーバに接続することはできますが、外部のサーバから
仮想マシンへは接続できません。

外部のサーバから仮想マシンへ接続する必要がある場合は、物理NICを仮想ブリッジに
接続する方法を使用します。

  • 仮想ネットワークの一覧を表示
# virsh net-list --all
Name                 State      Autostart     Persistent
--------------------------------------------------
default              active     no            yes
  • ブリッジインタフェースの表示
# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          XXXX.XXXXXXXXXXXX       yes             virbr0-nic
  • 仮想マシンを作成する
# virt-install                                                 \
  --name srv001                                                \
  --hvm                                                        \
  --os-type=Linux                                              \
  --os-variant=rhel6                                           \
  --ram 1024                                                   \
  --vcpu=1                                                     \
  --graphics none                                              \
  --disk=/var/lib/libvirt/images/srv001,format=qcow2,size=8    \
  --network bridge=virbr0                                      \
  --location http://ftp.riken.jp/Linux/centos/6/os/x86_64/     \
  --extra-args='console=tty0 console=ttyS0,115200n8'           

--network bridge=${source bridge} で、libvirtdが管理する
仮想ネットワークを指定します。

iptablesのNAT(IPマスカレード)機能により外部ネットワークと接続するため
ホストOS側でiptablesが有効となっており、マスカレードの設定が
行われている必要があります。

物理NICを仮想ブリッジに接続する方法

外部のサーバから仮想マシンに接続する必要がある場合は、こちらの方法を使用します。

  • bridge-utilsパッケージをインストールする
# yum install bridge-utils
  • 仮想ブリッジを作成する
# brctl addbr br0
# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
virbr0          8000.525400b745d4       yes             virbr0-nic
                                                        vnet0
  • 仮想ブリッジに物理NICを接続する
# brctl addif br0 eth0
# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.001f2966513c       no              eth0
virbr0          8000.525400b745d4       yes             virbr0-nic
                                                        vnet0

ネットワーク設定を修正する

/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=XXX.XXX.XXX.XXX
NETMASK=XXX.XXX.XXX.XXX
TYPE="Bridge"

/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="XX:XX:XX:XX:XX:XX"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
  • networkを再起動して設定を反映する
# /etc/init.d/network restart
  • 仮想ブリッジの確認
# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.001f2966513c       no              eth0
virbr0          8000.525400b745d4       yes             virbr0-nic
                                                        vnet0
  • 仮想マシンを作成する
# virt-install                                                 \
  --name srv011                                                \
  --hvm                                                        \
  --os-type=Linux                                              \
  --os-variant=rhel6                                           \
  --ram 1024                                                   \
  --vcpu=1                                                     \
  --graphics none                                              \
  --disk=/var/lib/libvirt/images/srv001,format=qcow2,size=8    \
  --network bridge=br1                                         \
  --location http://ftp.riken.jp/Linux/centos/6/os/x86_64/     \
  --extra-args='console=tty0 console=ttyS0,115200n8'           

--network bridge=${source bridge} で物理NICが接続された仮想ブリッジを指定します。

おまけ

  • 仮想ネットワークの定義ファイル
/usr/share/libvirt/networks/default.xml
<network>
  <name>default</name>
  <bridge name="virbr0" />
  <forward/>
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.122.2" end="192.168.122.254" />
    </dhcp>
  </ip>
</network>
  • 仮想ネットワークを追加する
/usr/share/libvirt/networks/internal.xml
<network>
  <name>internal</name>
  <bridge name="virbr1" />
  <forward/>
  <ip address="192.168.123.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.123.2" end="192.168.123.254" />
    </dhcp>
  </ip>
</network>
# virsh net-define /usr/share/libvirt/networks/internal.xml
# virsh net-start internal
# virsh net-list --all
Name                 State      Autostart     Persistent
--------------------------------------------------
default              active     no            yes
internal             active     no            yes

# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.525400b745d4       yes             virbr0-nic
virbr1          8000.5254008f6eda       yes             virbr1-nic
  • 仮想マシンにNICを追加する

仮想マシンの設定を変更します。

# virsh edit srv001
    <interface type='bridge'>
      <mac address='XX:XX:XX:XX:XX:XX'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <!-- 追加箇所 -->
    <interface type='bridge'>
      <source bridge='virbr1'/>
      <model type='virtio'/>
    </interface>
    <!-- 追加箇所 -->

変更を反映させるため、仮想マシンを停止・起動します。

# virsh shutdown srv001
# virsh start srv001
  • 仮想ネットワークの削除
# virsh net-destroy default
# virsh net-undefine default
  • 仮想ブリッジの削除
# brctl delif br0 eth0
# brctl delbr br0

参考