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


## はじめに

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

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

## 環境

* CentOS 6.4
* qemu-kvm 0.12.1.2

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


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

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


* 仮想ネットワークの一覧を表示

```shell
# virsh net-list --all
Name                 State      Autostart     Persistent
--------------------------------------------------
default              active     no            yes
```

* ブリッジインタフェースの表示

```shell
# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          XXXX.XXXXXXXXXXXX       yes             virbr0-nic
```

* 仮想マシンを作成する

```shell
# 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パッケージをインストールする

```shell
# yum install bridge-utils
```

* 仮想ブリッジを作成する

```shell
# brctl addbr br0
# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
virbr0          8000.525400b745d4       yes             virbr0-nic
                                                        vnet0
```

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

```shell
# 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
```

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

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

```

```shell:/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を再起動して設定を反映する

```shell
# /etc/init.d/network restart
```

* 仮想ブリッジの確認

```shell
# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.001f2966513c       no              eth0
virbr0          8000.525400b745d4       yes             virbr0-nic
                                                        vnet0
```

* 仮想マシンを作成する

```shell
# 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が接続された仮想ブリッジを指定します。


## おまけ

* 仮想ネットワークの定義ファイル

```xml:/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>
```

* 仮想ネットワークを追加する

```xml:/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>
```

```shell
# 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を追加する

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

```shell
# virsh edit srv001
```

```xml:
    <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>
    <!-- 追加箇所 -->
```

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

```shell
# virsh shutdown srv001
# virsh start srv001
```

* 仮想ネットワークの削除

```shell
# virsh net-destroy default
# virsh net-undefine default
```

* 仮想ブリッジの削除

```shell
# brctl delif br0 eth0
# brctl delbr br0
```

## 参考

* [Linux KVM環境で物理NICに仮想ブリッジを接続する方法](http://www.checksite.jp/kvm-br-conf/)

* [第3回　KVMのネットワーク構成](http://gihyo.jp/admin/serial/01/ibm_kvm/0003)

* [CentOS 6.4 でブリッジインターフェースを設定](http://uehatsu.info/tech/archives/2013/06/how-to-setup-bridge-ethernet-interface-on-centos-6.4.html)

* [第11章 ネットワークの設定](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/chap-Virtualization_Host_Configuration_and_Guest_Installation_Guide-Network_Configuration.html)