Ubuntu 26.04 の KVM ホストで、VM をどのネットワークへ接続するかを整理します。KVM の bridge 設定は、単に VM を外へ出すための設定ではなく、管理ネットワーク、サービスネットワーク、VLAN、仮想ネットワークの境界をどう切るかという設計そのものです。
一般的な KVM では libvirt の default network や Linux bridge で十分なことが多いです。一方で、この環境では KVM ホストを仮想ネットワーク基盤として扱うため、Open vSwitch と OVN localnet まで含めて整理します。
書籍
作って理解する仮想化技術 ── ハイパーバイザを実装しながら仕組みを学ぶ
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
KVM のネットワーク方式を分けて考える
KVM のネットワークは、まず用途別に分けて考えると整理しやすくなります。どの方式が正解というより、VM をどこへ接続したいかで選択が変わります。
libvirt default network: 手元の検証 VM を NAT で外へ出すだけなら簡単Linux bridge: VM を物理 LAN と同じ L2 に参加させたい場合に分かりやすいOpen vSwitch: VLAN trunk、複数 bridge、仮想 NIC の制御を明示したい場合に向いているOVN: logical switch、localnet、複数ホスト拡張を見据える場合の仮想ネットワーク層
現在の NIC と bridge を確認する
作業前に、管理用 NIC と VM 接続用 NIC を必ず分けて確認します。SSH 接続に使っている NIC を bridge や OVS に収容すると、設定ミスで管理接続を失う可能性があります。
ip -br link
ip -br addr
ip route
bridge link
virsh net-list --all
sudo ovs-vsctl showこの環境の設計では、管理側の NIC と provider network 側の NIC を分けています。例として、管理通信は別 NIC、VM を物理 VLAN へ出すための provider port は enp3s0 のように役割を分離します。
libvirt default network は検証向け
libvirt の default network は NAT 型の仮想ネットワークです。VM から外へ通信するだけなら便利ですが、VM を物理 LAN 側から直接到達させたい場合や、VLAN を含むネットワーク設計には向きません。
virsh net-list --all
virsh net-info default
virsh net-dumpxml default検証用 VM であれば default network から始めても問題ありません。ただし、サーバーとして VM を運用する場合は、どのネットワークに VM を収容するかを明示した bridge 設計へ移る方が管理しやすくなります。
Netplan で Linux bridge を作成する
Linux bridge は、KVM で最も素直に理解しやすい方式です。物理 NIC を bridge に収容し、VM の仮想 NIC を同じ bridge へ接続することで、VM を物理ネットワークと同じ L2 に参加させます。
sudo tee /etc/netplan/60-kvm-bridge.yaml <<'EOF'
network:
version: 2
ethernets:
enp3s0:
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces:
- enp3s0
dhcp4: false
dhcp6: false
mtu: 1500
parameters:
stp: false
forward-delay: 0
EOF
sudo netplan generate
sudo netplan try
sudo netplan applyこの例では bridge 側に IP アドレスを設定していません。VM 接続用の bridge として使う場合、ホスト自身がそのネットワークで通信する必要があるかどうかを先に決めます。ホストにも IP を持たせる場合は、物理 NIC ではなく bridge 側に IP を設定します。
VM 作成時に bridge を指定する
Linux bridge を使う場合、VM 作成時には bridge 名を指定します。virt-install なら --network bridge=br0 のように指定できます。
virt-install \
--name ubuntu-test \
--memory 4096 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/ubuntu-test.qcow2,size=40,bus=virtio \
--cdrom /var/lib/libvirt/images/iso/ubuntu-26.04-live-server.iso \
--os-variant ubuntu26.04 \
--network bridge=br0,model=virtio \
--graphics none \
--console pty,target_type=serialVM 側から見ると virtio NIC が 1 本見えるだけですが、ホスト側ではその tap interface が bridge に接続されます。通信できない場合は、VM 内の IP 設定だけでなく、bridge、物理 NIC、上位スイッチの VLAN 設定も確認します。
VLAN を扱う場合
Linux bridge で VLAN を扱うこともできますが、VLAN 数が増えたり、VM ごとに接続先を変えたりする場合は設計が複雑になります。VLAN trunk を前提にするなら、Open vSwitch を使う方が意図を表現しやすい場面があります。
bridge vlan show
ip -d link show br0VLAN をどこで剥がすのか、VM へ tagged のまま渡すのか、ホスト側 bridge で untagged にするのかを曖昧にしないことが重要です。ここが曖昧だと、疎通確認で原因を追いにくくなります。
Open vSwitch を使う場合
Open vSwitch を使うと、provider bridge、port、trunk VLAN、MTU などを明示的に扱えます。この環境では brphys0 を provider bridge とし、物理 NIC を trunk port として収容する設計にしています。
sudo ovs-vsctl --may-exist add-br brphys0
sudo ovs-vsctl --may-exist add-port brphys0 enp3s0
sudo ovs-vsctl set Interface brphys0 mtu_request=9000
sudo ovs-vsctl set Interface enp3s0 mtu_request=9000
sudo ovs-vsctl set Port enp3s0 trunks=2001,2256
sudo ovs-vsctl showOVS は一般的な KVM 利用では必須ではありません。単純な VM 接続であれば Linux bridge の方が分かりやすいです。OVS は、VLAN trunk、provider network、将来的な OVN 連携まで含めて管理したい場合に選ぶものです。
OVN localnet を使う場合
OVN を使う場合、VM は logical switch に接続し、物理ネットワークへ出す部分は localnet port と bridge mapping で接続します。以下は VLAN 2001 を phys0 という provider network に対応させる例です。
sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-bridge-mappings=phys0:brphys0
sudo ovn-nbctl --may-exist ls-add ls2001
sudo ovn-nbctl --may-exist lsp-add ls2001 ln2001
sudo ovn-nbctl lsp-set-type ln2001 localnet
sudo ovn-nbctl lsp-set-options ln2001 network_name=phys0
sudo ovn-nbctl set Logical_Switch_Port ln2001 tag=2001
sudo ovn-nbctl lsp-set-addresses ln2001 unknown
sudo ovn-nbctl showこの方式は、通常の KVM 入門としてはかなり重い構成です。ただし、複数の logical switch、provider VLAN、将来的な複数ホスト構成を見据える場合、VM の接続先を抽象化しやすくなります。
VM interface と logical switch を対応させる
OVN を使う場合、VM の interface には logical switch 側の識別子を対応させます。libvirt XML や管理ツール側で interface ID を持たせることで、VM の仮想 NIC と OVN logical port の対応関係を追えるようにします。
virsh dumpxml ubuntu-test | sed -n '/<interface/,/<\/interface>/p'
sudo ovn-nbctl show
sudo ovs-vsctl showこの対応関係が曖昧だと、VM は起動しているのに論理ネットワークへ接続されていない、という状態になります。VM、libvirt、OVS、OVN のどこで接続が切れているかを順番に確認します。
確認ポイント
- KVM だけを使うなら、まず default network や Linux bridge で十分かを判断する
- 物理 LAN に VM を直接参加させるなら Linux bridge が分かりやすい
- VLAN trunk や provider network を明示したい場合は OVS を検討する
- OVN は logical switch や localnet を使うため、通常の bridge より設計要素が増える
- 管理 NIC と VM 接続用 NIC を分け、設定ミスで SSH を失わないようにする
- 疎通確認では VM 内、libvirt、bridge / OVS、上位スイッチの順に見る
まとめ
Ubuntu 26.04 の KVM bridge 設定は、VM を外へ出すための単純な作業ではなく、VM をどのネットワーク境界へ置くかを決める設計です。一般的には Linux bridge で十分な場面が多く、OVS / OVN はより大きな仮想ネットワーク設計を扱う場合の選択肢です。
次は、KVM ホスト上で VM を複製しやすくするために、VM テンプレートの作成へ進みます。
関連記事
- Ubuntu 26.04 KVM の基本構築 – libvirt / OVS / OVN の土台を作る
- Ubuntu 26.04 KVM VM テンプレートの作成
- Ubuntu 26.04 KVM VM の作成
- Ubuntu 26.04 KVM VM の ACL
- Ubuntu 26.04 KVM HugePages の基本
- Ubuntu 26.04 仮想マシンの性能確認
- VM パフォーマンス Day5 – virtio-net の構造と仮想 NIC の性能特性
- VM パフォーマンス Day8 – DPDK による高速 dataplane と NFV の基本



