ウェブサイト検索

libvirtとKVMを使用してブリッジネットワーキングを使用する方法


Libvirtは、さまざまな仮想マシンの管理に関するAPIを提供する、無料のオープンソースソフトウェアです。Linuxでは、一般的にKVMおよびQemuと組み合わせて使用されます。libvirtは、仮想ネットワークの作成と管理にも使用されます。libvirtを使用したときに作成されるデフォルトのネットワークは「default」と呼ばれ、NAT(ネットワークアドレス変換)およびパケット転送を使用して、エミュレートされたシステムを「外部」世界(ホストシステムおよびインターネットの両方)に接続します。このチュートリアルでは、ブリッジネットワークを使用して異なるセットアップを作成する方法を見ていきます。

このチュートリアルでは、あなたが学ぶことができることは:

  • 仮想ブリッジの作り方
  • ブリッジに物理インターフェースを追加する方法
  • ブリッジ設定を永続的にする方法
  • 仮想マシンへのトラフィックを許可するためにファームウェアルールを変更する方法
  • 新しい仮想ネットワークを作成し、それを仮想マシンで使用する方法

libvirtとKVMを使用してブリッジネットワークを設定する方法

使用されるソフトウェア要件と規約

「デフォルト」ネットワーク

libvirtが使用されていて、libvirtdデーモンが実行されていると、デフォルトのネットワークが作成されます。このネットワークが存在することを確認するために、ほとんどのLinuxディストリビューションに通常付属しているlibvirt-clientパッケージのvirshユーティリティを使用することができます。すべての利用可能な仮想ネットワークを表示するようにユーティリティを呼び出すためには、net-listサブコマンドを含める必要があります。

sudo virsh net-list --all

上記の例では、--allオプションを使用して、非アクティブネットワークも結果に含まれるようにしました。これは通常、以下に表示されるものに対応するはずです。

Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes

ネットワークに関する詳細情報を取得し、最終的にそれを変更するために、ネットワーク名を引数として指定して、代わりに edit サブコマンドを使って virsh を呼び出すことができます:

sudo virsh net-edit default

一時ファイルにxmlネットワーク定義が含まれており、お気に入りのテキストエディタで開かれます。この場合、結果は次の通りです:

<network>
  <name>default</name>
  <uuid>168f6909-715c-4333-a34b-f74584d26328</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:48:3f:0c'/>
  <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>

ご覧のように、デフォルトネットワークは virbr0 仮想ブリッジの使用に基づいており、NAT ベースの接続を使用して、ネットワークの一部である仮想マシンを外部世界に接続します。このブリッジが存在することは、ip コマンドを使用して確認できます:

ip link show type bridge

私たちのケースでは、上記のコマンドは以下の出力を返します:

5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff

ブリッジの一部であるインターフェースを表示するために、ip コマンドを使用して、virbr0 ブリッジをマスターとするインターフェースのみをクエリすることができます:

ip link show master virbr0

コマンドを実行した結果は次のとおりです:

6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff

ご覧のように、現在ブリッジに接続されているインターフェースは1つだけで、virbr0-nicです。virbr0-nicインターフェースは仮想イーサネットインターフェースであり、自動的に作成されブリッジに追加されます。その目的は、ブリッジに安定したMACアドレス(この場合は52:54:00:48:3f:0c)を提供することです。

仮想マシンを作成して起動すると、他の仮想インターフェースがブリッジに追加されます。このチュートリアルのために、私はDebian(Buster)仮想マシンを作成して起動しました。上記のコマンドを再実行してブリッジスレーブインターフェースを表示すると、新しいインターフェースvnet0が追加されたことがわかります。

ip link show master virbr0
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
7: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master virbr0 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether fe:54:00:e2:fe:7b brd ff:ff:ff:ff:ff:ff

物理インターフェイスは決して virbr0 ブリッジに追加してはいけません。なぜなら、それは接続性を提供するために NAT を使用するからです。

仮想マシンにはブリッジネットワーキングを使用します

デフォルトネットワークは、仮想マシンを作成する際に接続を達成する非常に簡単な方法を提供します:すべてが「準備完了」で、すぐに動作します。しかし時には、ゲストデバイスがホストのLANに接続される完全なブリッジ接続を実現したい場合があります。NATを使用せずに、新しいブリッジを作成し、ホストの物理イーサネットインターフェースの1つを共有する必要があります。これを段階的に見ていきましょう。

新しい橋を作る

新しいブリッジを作成するために、私たちはまだipコマンドを使用することができます。このブリッジにbr0という名前を付けたいとしましょう。次のコマンドを実行します:

sudo ip link add br0 type bridge

橋が作成されたことを確認するために、前と同様に行います。

sudo ip link show type bridge
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
8: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 26:d2:80:7c:55:dd brd ff:ff:ff:ff:ff:ff

予想通り、新しいブリッジであるbr0が作成され、上記のコマンドの出力に含まれるようになりました。新しいブリッジが作成されたので、物理インターフェースをそれに追加することができます。

ブリッジに物理イーサネットインターフェースを追加する

このステップでは、ブリッジにホストの物理インターフェースを追加します。この場合、メインのイーサネットインターフェースを使用できないことに注意してください。なぜなら、ブリッジに追加してしまうと接続が失われ、そのIPアドレスを失うからです。この場合、enp0s29u1u1という追加のインターフェースを使用します。これは、私のマシンに接続されたイーサネットからUSBへのアダプタによって提供されるインターフェースです。

まず、インターフェースの状態がUPであることを確認します。

sudo ip link set enp0s29u1u1 up

インターフェースをブリッジに追加するには、実行するコマンドは次のとおりです:

sudo ip link set enp0s29u1u1 master br0

インターフェースがブリッジに追加されたことを確認するために、代わりに:

sudo ip link show master br0
3: enp0s29u1u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 18:a6:f7:0e:06:64 brd ff:ff:ff:ff:ff:ff

ブリッジに静的IPアドレスを割り当てる

この時点で、ブリッジに静的IPアドレスを割り当てることができます。たとえば、192.168.0.90/24を使用したい場合、以下のコマンドを実行します:

sudo ip address add dev br0 192.168.0.90/24

インターフェースにアドレスが追加されたことを確認するために、私たちは以下を実行します:

ip addr show br0
9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 26:d2:80:7c:55:dd brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.90/24 scope global br0
       valid_lft forever preferred_lft forever
   [...]

構成を永続的にする

私たちのブリッジ構成は準備ができていますが、このままではマシンの再起動後に維持されません。私たちの構成を持続可能にするために、使用するディストリビューションによっていくつかの設定ファイルを編集する必要があります。

Debianおよびその派生版

Debian系のディストリビューションでは、bridge-utilsパッケージがインストールされていることを確認する必要があります:

sudo apt-get install bridge-utils

パッケージがインストールされたら、/etc/network/interfaces ファイルの内容を変更する必要があります:

This file describes the network interfaces available on your system
and how to activate them. For more information, see interfaces(5).

The loopback network interface
auto lo
iface lo inet loopback

Specify that the physical interface that should be connected to the bridge
should be configured manually, to avoid conflicts with NetworkManager
iface enp0s29u1u1 inet manual

The br0 bridge settings
auto br0
iface br0 inet static
    bridge_ports enp0s29u1u1
        address 192.168.0.90
        broadcast 192.168.0.255
        netmask 255.255.255.0
        gateway 192.168.0.1

Red Hat系のディストリビューション

Red Hat 系のディストリビューション、Fedora を含むでは、/etc/sysconfig/network-scripts ディレクトリ内のネットワークスクリプトを操作する必要があります。ブリッジが NetworkManager に管理されないようにしたい場合、またはネットワークスイッチを管理できない古いバージョンの NetworkManager を使用している場合は、network-scripts パッケージをインストールする必要があります。

sudo dnf install network-scripts

パッケージがインストールされたら、br0 ブリッジを設定するファイル /etc/sysconfig/network-scripts/ifcfg-br0 を作成する必要があります。ファイルの中に以下の内容を配置します:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.0.90
GATEWAY=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
DELAY=0
NM_CONTROLLED=0

次に、ブリッジに接続する物理インターフェースを構成するために使用されるファイルを修正または作成します。この場合、/etc/sysconfig/network-scripts/ifcfg-enp0s29u1u1です:

TYPE=ethernet
BOOTPROTO=none
NAME=enp0s29u1u1
DEVICE=enp0s29u1u1
ONBOOT=yes
BRIDGE=br0
DELAY=0
NM_CONTROLLED=0

設定が整ったので、networkサービスを開始し、ブート時に有効にすることができます:

sudo systemctl enable --now network

ブリッジのためにネットフィルタを無効にする

全てのトラフィックがブリッジに転送され、そこに接続されている仮想マシンに届けられるようにするために、netfilterを無効にする必要があります。これは、ブリッジに接続されたゲストマシンでDNS解決が機能するために必要です。このために、/etc/sysctl.dディレクトリ内に.conf拡張子のファイルを作成し、99-netfilter-bridge.confと名付けましょう。その中に以下の内容を書き込みます:

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

ファイルに書かれた設定を読み込むために、まずbr_netfilterモジュールが読み込まれていることを確認します。

sudo modprobe br_netfilter

ブート時にモジュールを自動的にロードするには、/etc/modules-load.d/br_netfilter.conf ファイルを作成しましょう。このファイルにはモジュール名のみが含まれるべきです。

br_netfilter

モジュールが読み込まれたら、99-netfilter-bridge.confファイルに保存した設定を読み込むために、次のコマンドを実行できます:

sudo sysctl -p /etc/sysctl.d/99-netfilter-bridge.conf

新しい仮想ネットワークを作成する

この時点で、私たちは仮想マシンが使用する新しい「ネットワーク」を定義する必要があります。お気に入りのエディタでファイルを開き、以下の内容をコピーして貼り付け、bridged-network.xmlとして保存します。

<network>
    <name>bridged-network</name>
    <forward mode="bridge" />
    <bridge name="br0" />
</network>

ファイルが準備でき次第、その位置を引数としてnet-define virsh サブコマンドに渡します:

sudo virsh net-define bridged-network.xml

新しいネットワークを有効にし、自動で起動するようにするには、次のコマンドを実行する必要があります。

sudo virsh net-start bridged-network
sudo virsh net-autostart bridged-network

ネットワークが有効化されたことを確認するために、再度 virsh net-list
コマンドを実行できます。

sudo virsh net-list
Name              State    Autostart   Persistent
----------------------------------------------------
bridged-network   active   yes         yes
default           active   yes         yes

今では、--networkオプションを使うときに名前でネットワークを選択できます:

sudo virt-install \
  --vcpus=1 \
  --memory=1024 \
  --cdrom=debian-10.8.0-amd64-DVD-1.iso \
  --disk size=7 \
  --os-variant=debian10 \
  --network network=bridged-network

「virt-manager」グラフィカルインターフェイスを使用する場合、新しい仮想マシンを作成する際にネットワークを選択することができます。

結論

このチュートリアルでは、Linux上で仮想ブリッジを作成し、物理的なイーサネットインターフェースをそれに接続して、libvirtで管理される仮想マシン用の新しい「ネットワーク」を作成する方法を見ました。後者を使用する際には、利便性のためにデフォルトのネットワークが提供されます。それはNATを使用して接続性を提供します。このチュートリアルで設定するようなブリッジネットワークを使用すると、パフォーマンスが向上し、仮想マシンがホストの同じサブネットの一部になります。

関連記事: