この記事では、Ubuntu 26.04 の KVM / OVS / OVN 環境で、VM の通信を OVN ACL で制御する考え方を整理します。VM 内の firewall ではなく、OVN の logical switch / logical switch port 側で通信を制御する構成です。
この方式では、VM の NIC に対応する logical switch port を対象にし、inport、direction、priority、match、action を組み合わせて ACL を定義します。VM 作成時に使った interfaceid が、ここでも通信制御の境界になります。
- OVN ACL を VM 内 firewall とは別の層として扱う考え方
- logical switch port と
inportを使った VM 単位の通信制御 direction、priority、match、actionの整理- ruleset として ACL を再現可能に管理する考え方
| 対象 OS | Ubuntu 26.04 Server |
|---|---|
| 仮想化基盤 | KVM / QEMU / libvirt |
| 仮想ネットワーク | Open vSwitch / OVN |
| 制御対象 | OVN logical switch port |
| 確認コマンド | ovn-nbctl、virsh |
- VM の logical switch port を確認する
- ACL の direction / priority / match / action を整理する
- 許可 rule と最後の drop rule を分ける
- interface 単位で既存 ACL を入れ替える
- 適用後に OVN northbound DB と疎通を確認する
書籍
マスタリング TCP/IP ルーティング編
VM の ACL や OVN を扱う場合でも、最終的には IP、経路、疎通制御の理解が重要になります。ルーティングやネットワーク設計を確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
KVM VM の ACL で何を制御するのか
| 対象 | 意味 |
|---|---|
| logical switch | VM が接続される OVN 上の L2 network |
| logical switch port | VM の NIC に対応する OVN port |
| ACL | logical switch に紐づく通信制御 rule |
inport | 特定 VM port から出る通信を対象にする条件 |
from-lport | logical port から出る方向の通信 |
to-lport | logical port に入る方向の通信 |
ここで扱う ACL は、OS 内部の nftables や ufw とは別の層です。VM の中に入らなくても、仮想ネットワーク側で VM ごとの通信範囲を制御できます。
対象の logical switch port を確認する
まず、VM の interface に対応する logical switch port を確認します。libvirt XML の interfaceid と OVN の logical switch port が対応します。
virsh --connect qemu:///system dumpxml vm-example
virsh --connect qemu:///system domiflist vm-example
ovn-nbctl show
ovn-nbctl list Logical_Switch_Portinterfaceid を基準にして確認します。ACL の基本構造
OVN ACL は、方向、優先度、match 条件、action の組み合わせです。priority は大きい方が優先されます。最後に drop rule を置く場合は、許可 rule の priority を高くします。
| 項目 | 例 | 意味 |
|---|---|---|
direction | from-lport | VM から出る通信 |
priority | 4900 | rule の優先度 |
match | inport == "..." && ip4 && icmp4 | 対象通信の条件 |
action | allow-related | 戻り通信も含めて許可する |
action | drop | 条件に合う通信を破棄する |
ruleset として定義する
ACL は単発のコマンドとしてではなく、ruleset として管理する方が安定します。VM interface に対して outbound-internal-any のような ruleset を割り当て、そこに複数の rule をまとめます。
rulesets:
outbound-internal-any:
rules:
- id: allow-dhcpv4
direction: from-lport
priority: 5000
match: ip4 && udp && udp.src == 68 && udp.dst == 67
action: allow
- id: allow-internal-ipv4
direction: from-lport
priority: 3000
match: ip4 && ip4.dst == 10.0.0.0/8
action: allow-related
- id: drop
direction: from-lport
priority: 1000
match: ip4 || ip6
action: drop
options:
- --log
- --severity=infoこの例では、DHCP を明示的に許可し、内部 IPv4 宛てを許可し、最後に IPv4 / IPv6 を drop しています。実際には IPv6、DNS、NTP、proxy、mail、Ceph、Kubernetes API、BGP など、VM の役割に応じて許可 rule を分けます。
OVN ACL を作成する
手動で確認する場合は、ovn-nbctl acl-add を使って ACL を追加できます。match 条件には inport を含め、対象の logical switch port を明示します。
ovn-nbctl acl-add ls-int from-lport 4900 'inport == "11111111-2222-3333-4444-555555555555" && ip4 && icmp4' allow-related
ovn-nbctl acl-add ls-int from-lport 1000 'inport == "11111111-2222-3333-4444-555555555555" && (ip4 || ip6)' drop
ovn-nbctl list ACLinterface prefix で入れ替える
VM ごとの ACL を再適用する場合、どの ACL がその interface に属するのかを識別できる必要があります。実装上は、interfaceid の先頭部分を ACL 名の prefix にし、同じ prefix の ACL を削除してから作り直すと、古い rule が残りにくくなります。
ovn-nbctl --format=json --columns=_uuid,name find ACL
ovn-nbctl --if-exists remove Logical_Switch ls-int acls <acl-uuid>
ovn-nbctl destroy ACL <acl-uuid>実際の自動化では、この削除と作成を OVN northbound DB の transaction としてまとめます。途中で古い ACL と新しい ACL が混在しないようにするためです。
適用後に確認する
ACL を適用したら、OVN northbound DB と実際の疎通の両方を確認します。DB 上に rule が存在していても、match 条件が誤っていれば意図した通信制御にはなりません。
ovn-nbctl list ACL
ovn-nbctl lsp-list ls-int
ovn-nbctl lsp-get-addresses 11111111-2222-3333-4444-555555555555
ping -c 3 10.0.0.10
curl -I http://10.0.0.10/IPv4 と IPv6 を分けて考える
ACL では IPv4 と IPv6 を明示的に分けて考えます。IPv4 だけを許可しているつもりでも、IPv6 側が別経路で通る可能性があります。逆に、IPv6 link-local を完全に塞ぐと、近隣探索や一部の制御通信に影響することがあります。
ip4 だけを見て ACL を設計しない方が安全です。ip6、icmp6、fe80::/10、内部 ULA への通信を分けて確認します。確認ポイント
- 対象 VM の
interfaceidと OVN logical switch port が一致している - 許可 rule の priority が drop rule より高い
from-lportとto-lportを混同していない- IPv4 と IPv6 の許可範囲を別々に確認している
- ACL を単発作業ではなく ruleset として再現できる
まとめ
Ubuntu 26.04 の KVM / OVS / OVN 環境では、VM の通信制御を OVN logical switch port 単位で扱えます。これは VM 内の firewall とは別の層で、仮想ネットワーク側に通信制御を置く考え方です。
重要なのは、ACL を単発のコマンドではなく ruleset として管理することです。logical switch、logical switch port、inport、priority、IPv4 / IPv6、最後の drop まで整理しておくと、VM ごとの通信制御を再現しやすくなります。

