手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 KVM VM の ACL 設定 – OVN logical port 単位で通信を制御する

Ubuntu 26.04 仮想化基盤の関連記事

この記事では、Ubuntu 26.04 の KVM / OVS / OVN 環境で、VM の通信を OVN ACL で制御する考え方を整理します。VM 内の firewall ではなく、OVN の logical switch / logical switch port 側で通信を制御する構成です。

この方式では、VM の NIC に対応する logical switch port を対象にし、inportdirectionprioritymatchaction を組み合わせて ACL を定義します。VM 作成時に使った interfaceid が、ここでも通信制御の境界になります。

この記事で扱うこと
  • OVN ACL を VM 内 firewall とは別の層として扱う考え方
  • logical switch port と inport を使った VM 単位の通信制御
  • directionprioritymatchaction の整理
  • ruleset として ACL を再現可能に管理する考え方
対象 OSUbuntu 26.04 Server
仮想化基盤KVM / QEMU / libvirt
仮想ネットワークOpen vSwitch / OVN
制御対象OVN logical switch port
確認コマンドovn-nbctlvirsh
  1. VM の logical switch port を確認する
  2. ACL の direction / priority / match / action を整理する
  3. 許可 rule と最後の drop rule を分ける
  4. interface 単位で既存 ACL を入れ替える
  5. 適用後に OVN northbound DB と疎通を確認する
参考
書籍
参考書籍

マスタリング TCP/IP ルーティング編

VM の ACL や OVN を扱う場合でも、最終的には IP、経路、疎通制御の理解が重要になります。ルーティングやネットワーク設計を確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

KVM VM の ACL で何を制御するのか

対象意味
logical switchVM が接続される OVN 上の L2 network
logical switch portVM の NIC に対応する OVN port
ACLlogical switch に紐づく通信制御 rule
inport特定 VM port から出る通信を対象にする条件
from-lportlogical port から出る方向の通信
to-lportlogical port に入る方向の通信

ここで扱う ACL は、OS 内部の nftablesufw とは別の層です。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_Port
ACL を VM 名だけで考えると、どの NIC に効いているのかが曖昧になります。OVN ACL では、VM の NIC に対応する logical switch port と interfaceid を基準にして確認します。

ACL の基本構造

OVN ACL は、方向、優先度、match 条件、action の組み合わせです。priority は大きい方が優先されます。最後に drop rule を置く場合は、許可 rule の priority を高くします。

項目意味
directionfrom-lportVM から出る通信
priority4900rule の優先度
matchinport == "..." && ip4 && icmp4対象通信の条件
actionallow-related戻り通信も含めて許可する
actiondrop条件に合う通信を破棄する

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 ACL
本番運用では、ACL をこのような単発コマンドで積み増すより、既存 ACL を対象 interface の prefix で削除し、定義済み ruleset から再作成する方が再現性を保ちやすくなります。

interface 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 を完全に塞ぐと、近隣探索や一部の制御通信に影響することがあります。

IPv6 を使う環境では、ip4 だけを見て ACL を設計しない方が安全です。ip6icmp6fe80::/10、内部 ULA への通信を分けて確認します。

確認ポイント

  • 対象 VM の interfaceid と OVN logical switch port が一致している
  • 許可 rule の priority が drop rule より高い
  • from-lportto-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 ごとの通信制御を再現しやすくなります。

Ubuntu 26.04 KVM VM ACL の関連記事
Ubuntu 26.04 KVM VM の ACL 設定 – OVN logical port 単位で通信を制御する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る