はじめに
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