コントラクト
コントラクトは、Cisco Application Centric Infrastructure (ACI) 管理者にエンドポイント グループ間での Cisco ACI ファブリック内トラフィック フローを制御する手段を提供します。これらのコントラクトは、一方のエンドポイント グループが希望するサービスを提供し、もう一方のエンドポイント グループがそれらのサービスを消費するプロバイダー/コンシューマ モデルを使用して構築されます。コントラクトには、グローバル、テナント、VRF、またはアプリケーション プロファイルの範囲が割り当てられ、これによりコントラクトのアクセシビリティが制限されます。
つまり、コントラクトは 1 つ以上のサブジェクトで構成されます。各サブジェクトには 1 つ以上のフィルタが含まれます。各フィルタには 1 つ以上のエントリが含まれます。各エントリは、アクセス コントロール リスト(ACL)の 1 行に相当し、エンドポイント グループ内のエンドポイントが接続されているリーフ スイッチで適用されます。
詳細には、コントラクトは次の項目で構成されます。
-
サブジェクト:特定のアプリケーションまたはサービス用のフィルタのグループ。
-
フィルタ:レイヤ 2 ~ レイヤ 4 の属性 (イーサネット タイプ、プロトコル タイプ、TCP フラグ、ポートなど) に基づいてトラフィックを分類するために使用します。
-
アクション:フィルタリングされたトラフィックで実行されるアクション。次のアクションがサポートされます。
-
トラフィックの許可 (通常のコントラクトのみ)
-
トラフィックのマーク (DSCP/CoS) (通常のコントラクトのみ)
-
トラフィックのリダイレクト (サービス グラフによる通常のコントラクトのみ)
-
トラフィックのコピー (サービス グラフまたは SPAN による通常のコントラクトのみ)
-
トラフィックのブロック(タブー コントラクトのみ)
-
トラフィックのロギング(タブー コントラクトのみ)
-
-
ラベル:(任意)ポリシーの適用における精度を高めるために、サブジェクトやエンドポイント グループなどのオブジェクトをグループ化するために使用します。
異なるエンドポイント グループは、定義済みのコントラクト ルールに基づいてのみ別のエンドポイント グループと通信できますが、エンドポイント グループ内通信ではコントラクトは必要ありません。同じエンドポイント グループ内のエンドポイント間のエンドポイント グループ内通信は、デフォルトで許可されます。
契約がサブジェクトと、2 つのエンドポイント グループ(EPG)間の任意の送信元ポートと宛先ポート 80 を持つフィルタで定義されている場合、1つはコンシューマとして、もう 1 つはプロバイダーとして、Cisco ACI ファブリックはコンシューマ EPG からプロバイダー EPG へのパケットを許可します。宛先ポートは80、送信元ポートはanyです。ただし、プロバイダーからコンシューマへの戻りパケットはまだ許可されていません。リターンパケットを許可するオプションの1つは、フィルタのサブジェクトで [両方の方向を適用(Apply Both Direction)] と [リバース フィルタ ポート(Reverse Filter Port)] を有効にすることです。これら 2 つのオプションは、サブジェクトの作成時にデフォルトで有効になっています。
[両方の方向を適用(Apply Both Direction)] は、同じレイヤ 4 ポートの組み合わせを持つ反対方向のパケット、つまり、プロバイダー EPG から宛先ポート 80 および任意の送信元ポートを持つコンシューマ EPG へのパケットを許可するルールを作成します。次に、[リバース フィルタ ポート(Reverse Filter Port)] は、この新しいルールの宛先ポートと送信元ポートを反転させます。これにより、プロバイダー EPG からコンシューマ EPG へのパケットが、プロバイダー EPG からのリターンパケットと一致する宛先ポートと送信元ポート 80 で許可されるというルールが作成されます。
ただし、Cisco ACI コントラクトはステートフルではなく、プロバイダー EPG からコンシューマ EPG へのパケットはリターン パケットである必要はありません。これは、プロバイダー EPG がコンシューマ EPG へのトラフィックを開始する場合、送信元ポートが 80 であれば、Cisco ACI ファブリックはそれをすべての宛先ポートに許可することを意味します。フィルタの [ステートフル(Stateful)] オプションを使用すると、このような TCP トラフィックの問題を回避できます。ステートフル オプションが有効になっている場合、リターン方向(プロバイダーからコンシューマ)のルールは、TCP ポート(この例では宛先ポートと送信元ポート 80)の上にある TCP ACK フラグをチェックして、プロバイダーEPGから開始されたトラフィックをブロックします。
コントラクトを設定していない場合はマルチキャストキャスト トラフィックおよび同一クラスのトラフィック以外に、次のタイプのパケットのトラフィックだけが許可されます。
-
DHCP v4(prot 0x11、sport 0x44、dport 0x43)
-
DHCP v4(prot 0x11、sport 0x43、dport 0x44)
-
DHCP v6(prot 0x11、sport 0x222、dport 0x223)
-
OSPF(prot 0x59)
-
EIGRP(prot 0x58)
-
PIM(prot 0x67)
-
IGMP(prot 0x2)
-
ND-Sol ICMPv6(prot 0x3a dport 0x0087)
-
ND-Advt ICMPv6(prot 0x3a dport 0x0088)
次の例では、第 1 のエンドポイント グループ内の Web サーバ群、第 2 のエンドポイント グループ内のアプリケーション サーバ群、第 3 のエンドポイントグループ内のデータベース サーバ群を含む 3 層アプリケーションでのエンドポイント グループ間トラフィック フローを、さまざまなコントラクトが制御する方法を示します。Web エンドポイント グループ(プロバイダー)は、L3Out エンドポイント グループ(Cisco ACI ファブリックへの外部からのトラフィック)で使用されるコントラクト(contract1)を提供します。これにより、Cisco ACI ファブリックの外部から Web サーバに Web トラフィックが 到達できるようになります。アプリケーション エンドポイント グループ(プロバイダー)は、Web エンドポイント グループ(コンシューマ)が使用する通信用のコントラクト(contract2)を提供します。これにより、Web サーバはアプリケーション サーバ上のアプリケーションを呼び出せるようになります。最後に、アプリケーション エンドポイント グループ(コンシューマ)は、データベース エンドポイント グループ(プロバイダー)が提供するコントラクト(contract3)を使用します。これにより、アプリケーション サーバは、アプリケーションのデータベースにアクセスできるようになります。非確認済み UDP トラフィックの場合、リバース ポート フィルタリングは必要ありません。ただし、TCP トラフィックの場合は、応答側は、リバース ポート フィルタリングまたは応答側からのすべての確立されたトラフィックを許可する別のコントラクトがなければ TCP セッションを設定できません。
Cisco ACI で適用できるコントラクトの種類は次のとおりです。
-
通常のコントラクト
-
タブー コントラクト
-
アウトオブバンド(OOB)コントラクト
コントラクトは、次のタイプのエンドポイント グループの通信を管理します。
-
アプリケーション エンドポイント グループ間
-
アプリケーション エンドポイント グループと外部ネットワーク間
-
アプリケーション エンドポイント グループとインバウンド向けのマネージメント エンドポイント グループ間。たとえば、インバウンド マネージメントが Cisco ACI ファブリック用に構成されており、特定のエンドポイント グループがそのファブリックへのアクセスを許可される場合などです。
アウトオブバンド コントラクトは、管理テナントからのアウトオブバンド トラフィックのみに適用されます。タブー コントラクトは、通常のコントラクトに関連するトラフィックを拒否およびロギングするために使用され、通常のコントラクトより前にハードウェア内に設定されます。たとえば、ポート 305 を除く送信元ポート 50 から 500 までのトラフィックを許可するには、タブー コントラクトにポート 305 を拒否する単一のエントリを作成し、一方、通常のコントラクトで 50 から 500 の範囲内のすべてのポートを許可します。ポート 305 を拒否するタブー コントラクトは、通常のコントラクトでポート 50 から 500 を許可する前に、ハードウェアにプログラムします。
コントラクト構成パラメータ
コントラクトを構成する場合は、次のオプションを定義できます。
- Application-profile:このコントラクトは、同じアプリケーション プロファイル内のすべてのエンドポイント グループに適用できます。
-
Contract Scope:2 つ以上の参加ピア エンティティまたはエンドポイント グループ間のサービスコントラクトの範囲。コントラクトは、プロバイダー エンドポイント グループの範囲外のコンシューマ エンドポイント グループには適用されません。
以下の状態があります。
- Private Network:このコントラクトは、同じ VRF 内のすべてのエンドポイント グループに適用できます。
- Tenant:このコントラクトは、同じテナント内のすべてのエンドポイント グループに適用できます。
- Global:このコントラクトは、ファブリック全体にわたり、すべてのエンドポイント グループに適用できます。
デフォルトのステータスは [Private Network] です。
-
QoS Class:サービス コントラクトの優先度レベル。
以下の優先度レベルを指定できます。
- [Unspecified]
- Level1:クラス 1 の DSCP(Differentiated Services Code Point)値。
- Level2:クラス 2 の DSCP 値。
- Level3:クラス 3 の DSCP 値。
デフォルトは Unspecified(未指定)です。
-
Tags (labels):(任意)検索キーワードまたはアプリケーション プロファイルに割り当てられている用語。タグを使用すると、わかりやすい名前で複数のオブジェクトをグループ化できます。複数のオブジェクトに同じタグ名を割り当て、1 つのオブジェクトに 1 つ以上のタグ名を割り当てることができます。コントラクトがコンシューマまたはプロバイダーとしてエンドポイント グループに割り当てられている場合、デフォルトで、コントラクト内のすべてのサブジェクトがそのエンドポイント グループに適用されます。タグがある場合は、一致基準を持つアプリケーション プロファイル内のエンドポイント グループだけが、コントラクトのサブジェクトを導入します。
-
Match:コンシューマ エンドポイント グループ間のサブジェクト一致基準。ラベルは、エンドポイント グループ、コントラクト、ブリッジ ドメイン、DHCP リレー ポリシー、および DNS ポリシーなどのさまざまなプロバイダーおよびコンシューマの管理対象オブジェクトに適用できます。プロバイダー ラベルとコンシューマ ラベルの一致を確認する場合、一致設定はプロバイダー エンドポイント グループによって決定されます。次のさまざまなオプションがあります。
- AtleastOne:少なくとも1 つのラベルが、プロバイダー エンドポイント グループとコンシューマ エンドポイント グループで一致する。空白のラベルは一致と見なされます。
- AtmostOne:エンドポイント グループ上のすべてのラベルがまったく同じ場合にのみ一致する。空白のラベルは一致と見なされます。
- None:サブジェクト ラベルのいずれも一致しない。
- All:両エンドポイント グループに空白のラベル以外のすべてのラベルがある場合にのみ一致する。
デフォルトは AtleastOne(1 つ以上)です。
通常のコントラクトの作成/変更/削除
コントラクトの作成
-
メニュー バーで、
の順に選択します。 -
[Work] ペインで、[Tenant_Name] を選択します。
-
ナビゲーション ウィンドウでは、
を選択します。 -
作業ウィンドウで、
の順に選択します。 -
[Create Contract] ダイアログボックスで、次の操作を実行します。
-
コントラクトの名前を入力します。
-
(任意)コントラクト範囲を選択します。
-
(任意)[QoS Class] を選択します。
-
[Subject] の横にある [+] をクリックし、コントラクト サブジェクトを追加します。
-
[Create Contract Subject] ダイアログボックスで、次の操作を実行します。
-
コントラクトの件名を入力します。
-
[Filter Chain] フィールドで [+] をクリックします。
フィルタの作成については、「フィルタ」の項を参照してください。
-
-
-
-
[更新(Update)] をクリックします。
-
OK をクリックします。
-
[送信(Submit)] をクリックします。
コントラクトの変更
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
作業ウィンドウで、 [Tenant_Name] を選択します。
-
ナビゲーション ウィンドウで、 [Tenant_Name] > [Security Policies] > [Contracts] > [Contract_Name] を選択します。
-
[Work] ペインで、[Policy] タブを選択します。
-
(任意)[Contract Scope] を選択します。
-
(任意)[QoS Class] を選択します。
-
[Subject] フィールドの横にある [+] をクリックし、コントラクト サブジェクトを追加します。
-
[Create Contract Subject] ダイアログボックスで、次の操作を実行します。
-
コントラクトサブジェクトの名前を入力します。
-
[Filter Chain] の横にある [+] をクリックします。
(注)
フィルタの作成については、「フィルタ」の項を参照してください。
-
-
-
-
[Update] をクリックします。
-
[OK] をクリックします。
-
[送信(Submit)] をクリックします。
コントラクトの削除
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
作業ウィンドウで、 [Tenant_Name] を選択します。
-
ナビゲーション ウィンドウで、 [Tenant_Name] > [Security Policies] > [Contracts] > [Contract_Name] を選択します。
-
[Work] ペインで、[Actions] > [Delete] の順に選択します。
コントラクトの確認
REST :: /api/node/class/vzBrCP.xml
CLI :: moquery -c vzBrCP
EPG コントラクトの適用/削除
EPG へのコントラクトの適用
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
[Work] ペインで、[Tenant_Name] を選択します。
-
ナビゲーション ウィンドウで、 [Tenant_Name] > [Application Profiles] > [Application_Profile_Name] > [Application EPGs] > [EPG_Name] > [Contracts] の順に選択します。
-
[Work] ペインで、[Actions] > [Add Provided Contract] または [Actions] > [Add Consumed Contract] を選択します。
注:コントラクトの展開方法に応じた操作を選択します。
-
[Add Contract] ダイアログボックスで、次の操作を実行します。
-
[Contract_Name] を入力します。
-
[QOS policy] を選択します(任意)。
-
[Label] を選択します(任意)。
-
-
[送信(Submit)] をクリックします。
EPG からのコントラクトの削除
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
作業ウィンドウで、 [Tenant_Name] を選択します。
-
ナビゲーション ウィンドウで、 [Tenant_Name] > [Application Profiles] > [Application_Profile_Name] > [Application EPGs] > [EPG_Name] > [Contracts] > [Contract_Name] の順に選択します。
-
[Work] ペインで、[Actions] > [Delete] の順に選択します。
EPG でのコントラクトの確認
Provider
REST :: /api/node/class/fvRsProv.xml
CLI :: moquery -c fvRsProv
Consumer
REST :: /api/node/class/fvRsCons.xml
CLI :: moquery -c fvRsCons
外部ネットワークコントラクトの適用/削除
外部ネットワークへのコントラクトの適用
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
作業ウィンドウで、 [Tenant_Name] を選択します。
-
[Navigation] ペインで、 [Tenant_Name] > [Networking] > [External Routed Networks] > [Routed Outside_Name] > [Networks] > [External_Network_Instance_Profile] の順に選択します。
-
[Work] ペインで、[Add Provided Contract] または [Add Consumed Contract] のいずれかの横にある [+] をクリックします。
注:コントラクトをどのように導入するかによって選択します。
-
[Contract_Name] を選択します。
-
[QOS Type] を選択します。
-
[Match Criteria] を選択します。
-
-
[更新(Update)] をクリックします。
外部ネットワークからの通信に関するコントラクトの削除
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
作業ウィンドウで、 [Tenant_Name] を選択します。
-
[Navigation] ペインで、 [Tenant_Name] > [Networking] > [External Routed Networks] > [Routed Outside_Name] > [Networks] > [External_Network_Instance_Profile] の順に選択します。
-
作業ウィンドウで、[Contract_Name] を選択し、 [x] をクリックします。
外部ネットワークコントラクトの確認
Provider
REST :: /api/node/class/fvRsProv.xml
CLI :: moquery -c fvRsProv
Consumer
REST :: /api/node/class/fvRsCons.xml
CLI :: moquery -c fvRsCons
VRF コントラクトの適用または削除
VRF インスタンス内のすべてのエンドポイント グループにコントラクトを適用するために、コントラクトを VRF インスタンスに直接適用できます。この概念は「vzAny」エンドポイント グループとも呼ばれます。単一の設定箇所から VRF インスタンス内のすべてのエンドポイント グループのコントラクトの設定を許可し、ハードウェアのリソース消費を最適化することでコントラクト管理を容易にします。
たとえば、Cisco Application Centric Infrastructure (ACI) 管理に 100 個のエンドポイント グループがあり、それらすべてが同じ VRF の部分である場合、エンドポイント グループごとではなく、VRF にあるこの 1 つの vzAny グループにコントラクトを適用できます。
VRF インスタンス規模のコントラクトとは、従来、TCP トラフィックで逆ポート転送をイネーブルにする必要なしに、エンドポイント グループ コントラクトが 1 方向(コンシューマからプロバイダー)のトラフィックのみを定義することを可能にする、確立されたトラフィックを許可するコントラクトです。VRF インスタンス内のすべてのエンドポイント グループが確立されたトラフィックを許可するため、エンドポイント グループに直接適用されるコントラクトで逆ポート転送は不要です。
コントラクトまたはその欠如が ACI ファブリックで VRF 内のトラフィックをブロックしているかを確認する簡便な方法として、VRF インスタンスを非強制化する方法があります。これにより、コントラクトを必要とせずに、VRF インスタンス内のすべてのエンドポイント グループ間の通信が許可されます。これは、VRF インスタンス エンドポイント グループに共通のテナント コントラクト vzAny を適用することに相当します。
(注) |
VRF 内に非常に多くのコントラクトがある場合は、VRF が強制化に戻ったときにリーフ スイッチにコントラクトを再導入するのに、最長で 1 時間かかる場合があります。 |
共有サービスの場合は、コンシューマ (vzAny) 側の宛先の pcTag(分類)を適切に導出するために、EPG の下にプロバイダ EPG 共有サブネットを定義する必要があります。コンシューマとプロバイダの両方のサブネットがブリッジ ドメイン下で定義され、共有サービス コンシューマとして機能する vzAny に対して、ブリッジ ドメインからブリッジドメインへの共有サービス設定から移行する場合は、少なくとも共有フラグを使用してプロバイダ サブネットを EPG に追加する追加の設定手順を実行する必要があります。
(注) |
定義済みのブリッジ ドメイン サブネットの複製として EPG サブネットを追加する場合は、サブネットの両方の定義に同じフラグが定義されていることを確認してください。そうしないと、予期しないファブリック転送の動作が発生する可能性があります。 |
GUI を使用したコントラクトの VRF(vzAny)への適用
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
作業ウィンドウで、 [Tenant_Name] を選択します。
-
ナビゲーション ウィンドウで、 [Tenant_Name] > [Networking] > [Private Networks] > [Private_Network_Name] > [EPG Collection for Context] の順に選択します。[
-
[Work] ペインで、[Add Provided Contract] または [Add Consumed Contract] のいずれかの横にある [+] をクリックします。
コントラクトをどのように導入するかによって選択します。
-
[Contract_Name] を入力します。
-
[QOS Type] を選択します。
-
[Match Criteria] を選択します。
-
-
[更新(Update)] をクリックします。
GUI を使用したコントラクトの VRF(vzAny)からの削除
-
メニュー バーで、[Tenants] > [ALL TENANTS] の順に選択します。
-
作業ウィンドウで、[Tenant_Name] を選択します。
-
ナビゲーション ウィンドウで、 [Tenant_Name] > [Networking] > [Private Networks] > [Private_Network_Name] > [EPG Collection for Context] の順に選択します。
-
作業ウィンドウで、 [Contract_Name] を選択し、[x] をクリックします。
VRF コントラクトの確認
次の API は、VRF のコントラクトを確認します。
/api/node/class/vzBrCP.xml
次の iShell コマンドは VRF のコントラクトを確認します。
admin@apic1:~> moquery -c vzBrCP