KVMブリッジネットワークの設定

# 前の記事
KVM をインストールする
http://qiita.com/TsutomuNakamura/items/bb5cd1bcbf1b998941ed

# デフォルトネットワークについて 
KVM がインストールされると、デフォルトで、`virbr0` という仮想インタフェースが作成されています。
この仮想インタフェースは、デフォルトでゲストOS からのアウトバウンド通信のみ許可する設定になっています。

```text
# ifconfig virbr0
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether a2:37:db:38:ac:89  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```



このデフォルト状態の仮想インタフェースは、次のような条件で使用する場合はそのまま使用することができます。

```text
* KVM ホストOS からゲストOS へのみアクセスする場合
* KVM ゲストOS からインターネットへアクセスする場合
```

上記の要件以外に、外部のホストからゲストOS へのアクセスを許可したり、ゲストOS のIP アドレスを外部に公開するには、ブリッジネットワークの作成を行ってください。

# bridge ネットワークの作成 
(注)bridge ネットワークの設定はwireless ネットワークでは使用することができません。

## ネットワーク設定のバックアップ 
bridge ネットワークを作成する前に、ネットワーク設定のバックアップを取得します。

```text:Fedora
# #※ ファイル名(インタフェース名)は任意
# cp /etc/sysconfig/network-scripts/ifcfg-eno16777736 /root
```



```text:Ubuntu
$ sudo cp /etc/network/interfaces /root
```


## ネットワーク設定 
bridge ネットワークを設定します。

```text:Fedoraの場合
# cp /etc/sysconfig/network-scripts/ifcfg-eno16777736 /etc/sysconfig/network-scripts/ifcfg-br0
# mv /etc/sysconfig/network-scripts/ifcfg-eno16777736 /etc/sysconfig/network-scripts/ifcfg-eth0
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
～～～ 設定・ここから ～～～
DEVICE="ifcfg-eth0"
TYPE="Ethernet"
HWADDR="00:0C:29:40:A7:3F"
ONBOOT="yes"
NW_CONTROLLED="no"
BRIDGE="br0"
～～～ 設定・ここまで ～～～

# vim /etc/sysconfig/network-scripts/ifcfg-br0
～～～ 設定・ここから ～～～
DEVICE="br0"
TYPE="Bridge"
NM_CONTROLLED="no"
BOOTPROTO="static"
IPADDR="192.168.1.21"
NETMASK="255.255.255.0"
GATEWAY="192.168.1.1"
ONBOOT="yes"
～～～ 設定・ここまで ～～～
～～～ 設定(DHCPの場合)・ここから ～～～
DEVICE="br0"
TYPE="Bridge"
NM_CONTROLLED="no"
BOOTPROTO="dhcp"
ONBOOT="yes"
～～～ 設定(DHCPの場合)・ここまで ～～～
```

※上記サンプルでは、eth0 という名前でインタフェースを作り直していますが、これは"ifcfg-eno16777736" というインタフェース名ではうまく動かなかったため、そのようにしています・・・


```text:Ubuntuの場合
# sudo cp /etc/network/interfaces /root/
# vim /etc/network/interfaces
～～～ 設定・ここから ～～～
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

iface br0 inet static
address 192.168.1.104
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1 8.8.8.8
bridge_ports eth0
bridge_stp off
auto br0
～～～ 設定・ここまで ～～～
～～～ 設定(DHCPの場合)・ここから ～～～
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
auto br0
～～～ 設定(DHCPの場合)・ここまで ～～～
```


ネットワークを再起動します。

```text:Fedora
# service network restart
```


```text:Ubuntu
$ sudo ifdown eth0 && sudo ifup eth0
$ sudo ifup br0
※うまくいかない場合はOS ごと再起動
```

## bridge トラフィックのNetfilter を無効化する 
bridge トラフィックのNetfilter 機能を無効化するために`/etc/sysctl.conf` ファイルに次の定義を追加します。

```text
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
```


ファイルに記述したら、設定を反映します。

```text
# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
```


### bridge トラフィックを無効化する理由について 
下記URL に英文で記載あり。

```text
http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatkvmsecnetfilter.htm?lang=ja
```

```text:抜粋
Bridged networking and Netfilter
It is important to note that, by default, Linux enables Netfilter processing even in bridged traffic.

Netfilter, although allowing the use of iptables to create layer 3 filtering rules, is also seen as a security risk for guest isolation because Netfilter processing sometimes occurs on a global context (without distinction of a source layer 2 port).
In practice, with Netfilter processing enabled, an attacker in a compromised guest might mix malicious IP traffic with legitimate ones from other guests.
This processing can also result in a minor performance impact.
Therefore it is recommended that Netfilter processing is disabled.
```


## ネットワークコンフィグの確認 
`ifconfig` コマンドを使用してネットワークインタフェースを確認します。
`br0` と`eth0` がありますが、br0 はeth0 として動くようになります。

```text
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.21  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe40:a73f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:40:a7:3f  txqueuelen 0  (Ethernet)
        RX packets 2155  bytes 484270 (472.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 720  bytes 133865 (130.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::20c:29ff:fe40:a73f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:40:a7:3f  txqueuelen 1000  (Ethernet)
        RX packets 148888  bytes 104945553 (100.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 755  bytes 175031 (170.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
～～～
```


`brctl show` コマンドを実行すると次のように表示されます。

```text
# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29dc2afe	no		eth0
virbr0		8000.000000000000	yes
```


これで、ブリッジネットワークの使用準備ができました。