Cisco ACI で Contract に例外を設定する
Cisco ACI では通信させたい EPG 同士を Contract で接続するのが基本です。 しかし、Contract へ接続していても、例外設定をすることで指定した EPG を「Contract 制御の対象外」にすることが出来ます。 今回は 5.0(2h) で検証を実施しました。
尚、今回は Contract に例外設定をしていますが、Subject に例外設定を行うことも可能です。 また、今回の検証では EPG 名で例外設定を行っていますが、Tag を活用して例外設定を行った方がメリットがあるケースもあろうかと思われます (Contract 例外設定に限らず、Tag の設定は「Tag を理解し、活用出来る設計になっている」必要があります)。
また、後述しますが vzAny と Contract 例外設定を組み合わせることは出来ないようです。 これが可能であれば、より有益な機能だと思われるのですが…
検証の前提
下記の設定を前提に検証しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 | 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
|
例外無しパターン
例外を設定しない、通常の状態を確認します。
この場合、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 だけ、例外にする」パターンを考えます。
Contract にある Contract Exception
に例外とするルールの設定を行います。 Type
には DN
、VRF
、Tenant
、EPG
、Tag
などを選択可能です。 Consumer Regex
と Provider Regex
には、各々 Consumer / Provider 側になる設定を行います。 この際、「空欄は何れにも一致しない」 を意味する点に留意します。 ここでは「Epg11 → Epg21 は例外にする (Contract 処理をしない)」という設定にしました。
この設定を実施した上で 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 (等) を例外設定する」ことが可能です。
例えば Provider 側に「Epg2 で始まるものを除外する (例. Epg21, Epg22, Epg23…) という場合、Provider Regex
に Epg2.*
と設定します。
この設定を実施した上で 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 と組み合わせた場合を考えます。
vzAny 設定なので、VRF には以下のように Contract が設定されているものとします。
この際、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 では例外に出来ない」という点は変わらないようです。