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


前の記事

KVM をインストールする
http://qiita.com/TsutomuNakamura/items/bb5cd1bcbf1b998941ed

デフォルトネットワークについて

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

# 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

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

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

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

bridge ネットワークの作成

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

ネットワーク設定のバックアップ

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

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

ネットワーク設定

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

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" というインタフェース名ではうまく動かなかったため、そのようにしています・・・

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の場合)・ここまで ~~~

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

Fedora
# service network restart
Ubuntu
$ sudo ifdown eth0 && sudo ifup eth0
$ sudo ifup br0
※うまくいかない場合はOS ごと再起動

bridge トラフィックのNetfilter を無効化する

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

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

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

# 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 に英文で記載あり。

http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatkvmsecnetfilter.htm?lang=ja
抜粋
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 コマンドを使用してネットワークインタフェースを確認します。
br0eth0 がありますが、br0 はeth0 として動くようになります。

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 コマンドを実行すると次のように表示されます。

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

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