ネットワーク ACL を設定するには

注釈

ネットワーク ACL は OVN NIC タイプOVN ネットワークブリッジネットワーク(いくつか制限あり、ブリッジの制限 参照)で利用できます。

ネットワーク ACL は同じネットワークに接続された異なるインスタンス間のネットワークアクセスや、他のネットワークとのアクセスを制御するトラフィクルールを定義します。

ネットワーク ACL は インスタンスの NIC やネットワークに直接適用できます。 ネットワークに適用するときは、ネットワークに接続されたすべての NIC に ACL が適用されます。

特定の ACL を(明示的にあるいはネットワークから暗黙的に)適用したインスタンス NIC は論理的なグループを形成し、他のルールから送信元あるいは送信先として参照できます。 より詳細な情報は ACL グループ を参照してください。

ACL を作成する

ACL を作成するには以下のコマンドを使用します:

incus network acl create <ACL_name> [configuration_options...]

このコマンドはルール無しの ACL を作成します。 次のステップとして ACL に ルールを追加します

有効なネットワーク ACL の名前は以下のルールに従う必要があります。

  • 名前は 1 文字から 63 文字の間である。

  • 名前は ASCII の文字、数字、ハイフンからのみなる。

  • 名前は数字やハイフンから始まらない。

  • 名前はハイフンで終わらない。

ACL のプロパティ

ACL のプロパティには次のものがあります:

プロパティ

必須

説明

name

string

yes

プロジェクト内でユニークなネットワーク ACL の名前

description

string

no

ネットワーク ACL の説明

ingress

rule list

no

内向きのトラフィックルールのリスト

egress

rule list

no

外向きのトラフィックルールのリスト

config

string set

no

キー・バリューペア形式での設定オプション(user.* カスタムキーのみサポート)

ルールの追加と削除

それぞれの ACL はルールの 2 つのリストを含みます。

  • イングレス (ingress) ルールは NIC に向かう内向きのトラフィックに適用されます。

  • エグレス (egress) ルールは NIC から出ていく外向きのトラフィックに適用されます。

ACL にルールを追加するには、以下のコマンドを使います。 <direction> には ingressegress のどちらかを指定します:

incus network acl rule add <ACL_name> <direction> [properties...]

このコマンドは指定した方向(direction)に対応するリストにルールを追加します。

ACL 全体を編集する 場合を除き)ルールを編集することはできませんが、以下のコマンドでルールを削除はできます:

incus network acl rule remove <ACL_name> <direction> [properties...]

ユニークにルールを特定するのに必要なすべてのプロパティを指定するか、またはマッチしたすべてのルールを削除するためコマンドに --force を追加する必要があります。

ルールの順番と優先度

ルールはリストとして提供されます。 しかしリスト内のルールの順番は重要ではなくフィルタリングには影響しません。

Incus は以下のように action プロパティに基づいてルールの順番を自動的に決めます:

  • drop

  • reject

  • allow

  • 上記のすべてにマッチしなかったトラフィックに対する自動のデフォルトアクション(デフォルトでは rejectデフォルトアクションの設定 参照)。

これは NIC に複数の ACL を適用する際、組み合わせたルールの順番を指定する必要がないことを意味します。 ACL 内のあるルールがマッチすれば、そのルールが採用され、他のルールは考慮されません。

ルールのプロパティ

ACL ルールには次のプロパティがあります:

プロパティ

必須

説明

action

string

yes

マッチしたトラフィックに適用するアクション(allow, reject または drop

state

string

yes

ルールの状態(enabled, disabled または logged)、未設定の場合のデフォルト値は enabled

description

string

no

ルールの説明

source

string

no

CIDR か IP の範囲、送信元の ACL の名前、あるいは(ingress ルールに対しての) ソースサブジェクト名セレクターのカンマ区切りリスト、または any の場合は空を指定

destination

string

no

CIDR か IP の範囲、送信先の ACL の名前、あるいは(egress ルールに対しての) デスティネーションサブジェクト名セレクターのカンマ区切りリスト、または any の場合は空を指定

protocol

string

no

マッチ対象のプロトコル(icmp4, icmp6, tcp, udp)、または any の場合は空を指定

source_port

string

no

protocol が udptcp の場合はポートかポートの範囲(開始-終了で両端含む)のカンマ区切りリスト、または any の場合は空を指定

destination_port

string

no

protocol が udptcp の場合はポートかポートの範囲(開始-終了で両端含む)のカンマ区切りリスト、または any の場合は空を指定

icmp_type

string

no

protocol が icmp4icmp6 の場合は ICMP の Type 番号、または any の場合は空を指定

icmp_code

string

no

protocol が icmp4icmp6 の場合は ICMP の Code 番号、または any の場合は空を指定

ルール内でセレクタを使う

注釈

この機能は OVN NIC タイプOVN ネットワーク でのみサポートされます。

(ingress ルールの)source フィールドと (egress ルールの)destination フィールドは CIDR や IP の範囲の代わりにセレクタの使用をサポートします。

この機能を使えば、 IP のリストを管理したり追加のサブネットを作ることなしに、 ACL グループかネットワークセレクタを使ってインスタンスのグループに対するルールを定義できます。

ACL グループ

(明示的にあるいはネットワーク経由で暗黙的に)特定の ACL を適用されたインスタンス NIC は論理的なポートグループを形成します。

そのような ACL グループは サブジェクト名セレクタ と呼ばれ、他の ACL グループ内で ACL 名を用いて参照できます。

たとえば foo という名前の ACL がある場合、この ACL が適用されたインスタンス NIC のグループを source=foo で参照できます。

ネットワークセレクタ

ネットワークサブジェクトセレクタ を用いて、ネットワーク上の外向きと内向きのトラフィックにルールを定義できます。

@internal@external という 2 つの特別なネットワークサブジェクトセレクタがあります。 これらはそれぞれネットワークのローカルと外向きのトラフィックを示します。 たとえば:

source=@internal

ネットワークが ネットワークピア をサポートする場合、ピア接続間のトラフィックを @<network_name>/<peer_name> という形式のネットワークサブジェクトセレクタで参照できます。 たとえば:

source=@ovn1/mypeer

ネットワークサブジェクトセレクターを使用する際は、 ACL 適用先のネットワークは指定されたピア接続を持っていなければなりません。 持っていない場合 ACL は適用できません。

トラフィックのログ

一般的には ACL はインスタンスとネットワーク間のネットワークトラフィックを制御するためのものです。 しかし、特定のネットワークトラフィックをログ出力するためにルールを使うこともできます。 これはモニタリングや、ルールを実際に有効にする前にテストするのに役立ちます。

ログのためにルールを追加するには state=logged プロパティ付きでルールを作成してください。 ACL 内のすべてのログのルールに対するログ出力は以下のコマンドで表示できます:

incus network acl show-log <ACL_name>

ACL を編集する

ACL を編集するには以下のコマンドを使用します:

incus network acl edit <ACL_name>

このコマンドは ACL を編集用に YAML 形式でオープンします。 ACL 設定とルールの両方を編集できます。

ACL の適用

ACL の設定が終わったらネットワークかインスタンス NIC に適用する必要があります。

そのためにはネットワークか NIC の設定の security.acls リストに ACL を追加してください。 ネットワークの場合は、以下のコマンドを使います:

incus network set <network_name> security.acls="<ACL_name>"

インスタンス NIC の場合は、以下のコマンドを使います:

incus config device set <instance_name> <device_name> security.acls="<ACL_name>"

デフォルトアクションの設定

1 つ以上の ACL が NIC に(明示的にあるいはネットワーク経由で暗黙的に)適用されると、 NIC にデフォルトの reject ルールが追加されます。 このルールは適用された ACL 内のどのルールにもマッチしないすべてのトラフィックを拒否(reject)します。

この挙動はネットワークと NIC レベルの security.acls.default.ingress.actionsecurity.acls.default.egress.action 設定で変更できます。 NIC レベルの設定はネットワークレベルの設定を上書きします。

たとえば、ネットワークに接続されたすべてのインスタンスの内向きのトラフィックを許可(allow)するには以下のコマンドを使用します:

incus network set <network_name> security.acls.default.ingress.action=allow

インスタンス NIC に同じデフォルトアクションを設定するには以下のコマンドを使用します:

incus config device set <instance_name> <device_name> security.acls.default.ingress.action=allow

ブリッジの制限

ブリッジネットワークにネットワーク ACL を使用する場合は以下の制限に気を付けてください。

  • OVN ACL とは違い、ブリッジ ACL はブリッジと Incus ホストの間の境界のみに適用されます。これは外部へと外部からのトラフィックにネットワークポリシーを適用するために使うことしかできないことを意味します。ブリッジ間のファイアウォール、つまり同じブリッジに接続されたインスタンス間のトラフィックを制御するファイアウォールには使えません。

  • ACL グループとネットワークセレクタ はサポートされません。

  • iptables ファイアウォールドライバーを使う際は、 IP レンジサブジェクト(例:192.0.2.1-192.0.2.10)は使用できません。

  • ベースラインのネットワークサービスルールが(対応する INPUT/OUTPUT チェイン内の) ACL ルールの前に適用されます。これは一旦 ACL チェインに入ってしまうと INPUT/OUTPUT と FORWARD トラフィックを区別できないからです。このため ACL ルールはベースラインのサービスルールをブロックするのには使えません。