らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

Cisco ACI で Contract に例外を設定する

Cisco ACI では通信させたい EPG 同士を Contract で接続するのが基本です。 しかし、Contract へ接続していても、例外設定をすることで指定した EPG を「Contract 制御の対象外」にすることが出来ます。 今回は 5.0(2h) で検証を実施しました。

尚、今回は Contract に例外設定をしていますが、Subject に例外設定を行うことも可能です。 また、今回の検証では EPG 名で例外設定を行っていますが、Tag を活用して例外設定を行った方がメリットがあるケースもあろうかと思われます (Contract 例外設定に限らず、Tag の設定は「Tag を理解し、活用出来る設計になっている」必要があります)。

また、後述しますが vzAny と Contract 例外設定を組み合わせることは出来ないようです。 これが可能であれば、より有益な機能だと思われるのですが…

検証の前提

下記の設定を前提に検証しています。

tenant Tenant1
  access-list Any
    match raw Entry1
    exit
  contract Contract1
    subject Subject1
      access-group Any both
      exit
    exit
  vrf context Vrf1
    exit
  bridge-domain Bd11
    arp flooding
    vrf member Vrf1
    exit
  bridge-domain Bd21
    arp flooding
    vrf member Vrf1
    exit
  bridge-domain Bd22
    arp flooding
    vrf member Vrf1
    exit
  bridge-domain Bd31
    arp flooding
    vrf member Vrf1
    exit
  application Ap1
    epg Epg11
      bridge-domain member Bd11
      contract consumer Contract1
      set qos-class level3
      exit
    epg Epg21
      bridge-domain member Bd21
      contract provider Contract1
      set qos-class level3
      exit
    epg Epg22
      bridge-domain member Bd22
      contract provider Contract1
      set qos-class level3
      exit
    epg Epg31
      bridge-domain member Bd31
      contract provider Contract1
      set qos-class level3
      exit
    exit
  interface bridge-domain Bd11
    ip address 10.0.1.254/24 scope public
    exit
  interface bridge-domain Bd21
    ip address 10.0.2.254/24 scope public
    exit
  interface bridge-domain Bd22
    ip address 10.0.3.254/24 scope public
    exit
  interface bridge-domain Bd31
    ip address 10.0.4.254/24 scope public
    exit
  exit

例外無しパターン

例外を設定しない、通常の状態を確認します。

f:id:sig9:20200820222334p:plain

この場合、Zoning-rule は下記のように表示されます。 例外設定をしていない為、Epg11 から Epg21, 22, 31 宛の全ての Permit ルールが存在することが分かります。

leaf# contract_parser.py --sepg tn-Tenant1/ap-Ap1/epg-Epg11
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]

[9:4152] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg22(16389) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
[9:4134] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg31(16390) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
[9:4135] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg21(49156) [contract:uni/tn-Tenant1/brc-Contract1] [hit=?]

ひとつの EPG を例外にするパターン

次は「ひとつの EPG だけ、例外にする」パターンを考えます。

f:id:sig9:20200820222337p:plain

Contract にある Contract Exception に例外とするルールの設定を行います。 Type には DNVRFTenantEPGTag などを選択可能です。 Consumer RegexProvider Regex には、各々 Consumer / Provider 側になる設定を行います。 この際、「空欄は何れにも一致しない」 を意味する点に留意します。 ここでは「Epg11 → Epg21 は例外にする (Contract 処理をしない)」という設定にしました。

f:id:sig9:20200820222340p:plain

この設定を実施した上で Zoning-rule を確認すると「Epg11 → Epg21」が存在しなくなっていることが分かります。

leaf# contract_parser.py --sepg tn-Tenant1/ap-Ap1/epg-Epg11
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]

[9:4152] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg22(16389) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
[9:4134] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg31(16390) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]

複数の EPG を例外にするパターン

例外設定には正規表現を利用出来る為、「ひとつのルールで複数の EPG (等) を例外設定する」ことが可能です。

f:id:sig9:20200820222343p:plain

例えば Provider 側に「Epg2 で始まるものを除外する (例. Epg21, Epg22, Epg23…) という場合、Provider RegexEpg2.* と設定します。

f:id:sig9:20200820222346p:plain

この設定を実施した上で Zoning-rule を確認すると「Epg11 → Epg21」と「Epg11 → Epg22」が存在しなくなっていることが分かります。

leaf# contract_parser.py --sepg tn-Tenant1/ap-Ap1/epg-Epg11
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]

[9:4134] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg31(16390) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]

vzAny と組み合わせることは出来ない

仮に Contract の例外設定を vzAny と組み合わせた場合を考えます。

f:id:sig9:20200820234643p:plain

vzAny 設定なので、VRF には以下のように Contract が設定されているものとします。

f:id:sig9:20200820234924p:plain

この際、vzAny による Zoning-rule は以下のように設定されます。

[16:4140] [vrf:Tenant1:Vrf1] permit arp epg:any epg:any [contract:implicit] [hit=0]
[21:4151] [vrf:Tenant1:Vrf1] permit any epg:any epg:any [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]

この Zoning-rule を見ると分かるのですが、vzAny は (当然と言えば当然ですが) EPG 名を特定せず、any として設定されています。 この影響なのか、Contract の例外設定で EPG 名を指定しても例外として扱うことが出来ません。 今回は EPG 名で例外設定しようとしたのですが、例えば Tag で例外設定しようとしても「vzAny では例外に出来ない」という点は変わらないようです。