此产品的文档集力求使用非歧视性语言。在本文档集中,非歧视性语言是指不隐含针对年龄、残障、性别、种族身份、族群身份、性取向、社会经济地位和交叉性的歧视的语言。由于产品软件的用户界面中使用的硬编码语言、基于 RFP 文档使用的语言或引用的第三方产品使用的语言,文档中可能无法确保完全使用非歧视性语言。 深入了解思科如何使用包容性语言。
思科采用人工翻译与机器翻译相结合的方式将此文档翻译成不同语言,希望全球的用户都能通过各自的语言得到支持性的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 Cisco Systems, Inc. 对于翻译的准确性不承担任何责任,并建议您总是参考英文原始文档(已提供链接)。
本文档介绍了解并排除ACI安全策略(称为合同)故障的步骤。
本文档中的材料摘自《思科以应用为中心的基础设施故障排除》第二版书,特别是《安全策略 — 概述》、《安全策略 — 工具》、《安全策略 — EPG至EPG》、《安全策略 — 首选组》和《安全策略 — vzAny至EPG》章。
ACI解决方案的基本安全架构遵循许可列表模式。除非在unenforced模式下配置VRF,否则会隐式丢弃所有EPG到EPG的流量。如开箱即用的许可列表模型所示,默认VRF设置处于enforced模式。通过在交换机节点上实施分区规则,可以允许或明确拒绝流量。根据终端组(EPG)之间的期望通信流和用于定义这些规则的方法,这些分区规则可以编程为各种不同的配置。请注意,分区规则条目不是有状态的,通常会在规则编程后根据端口/套接字允许或拒绝给定两个EPG。
在ACI中规划分区规则的主要方法如下:
下图可用于引用上述每种方法允许控制的分区规则的粒度:
在使用合同方法编写分区规则时,有一个选项用于定义合同范围。如果需要任何路由泄漏/共享服务设计,必须仔细考虑此选项。如果希望从ACI交换矩阵中的一个VRF连接到另一个VRF,则合同是执行此操作的方法。
范围值可以是以下值:
一旦对zoning-rule进行了编程,它将在枝叶上显示如下:
+---------+--------+--------+----------+----------------+---------+---------+-----------------+----------+----------------------+
| Rule ID | SrcEPG | DstEPG | FilterID | Dir | operSt | Scope | Name | Action | Priority |
+---------+--------+--------+----------+----------------+---------+---------+-----------------+----------+----------------------+
随着每个分区规则的编程,根据过滤器条目映射的分区规则条目的矩阵将开始使用交换机上的Policy CAM。在设计通过ACI交换矩阵的允许流时,应特别注意重复使用合同,而不是根据最终设计创建新合同。在不了解所导致的分区规则的情况下,随意地跨多个EPG重复使用同一合同,可能会快速级联成意外允许的多个流。同时,这些无意的流量将继续消耗策略CAM。当策略CAM变满时,分区规则编程将开始失败,这可能会导致意外和间歇性丢失,具体取决于配置和终端行为。
这是需要配置合同的共享服务使用案例的特殊标注。共享服务通常意味着ACI交换矩阵内的VRF间流量,该流量依赖于使用“租户”或“全局”范围合同。要充分理解这一点,必须首先强调分配给EPG的典型pcTag值并非全球唯一的。pcTags的范围被限定在VRF中,同一个pcTag可能会在另一个VRF中重复使用。当讨论路由泄漏时,开始在ACI交换矩阵上实施要求,包括需要全局唯一值,包括子网和pcTags。
使这一点成为特殊考虑的是将EPG作为消费者与提供商相关联的方向性方面。在共享服务方案中,通常希望提供商驱动全局pcTag以获得交换矩阵唯一值。同时,消费者将保留其VRF范围的pcTag,使其处于特殊位置,以便现在能够编程和了解使用全局pcTag值执行策略。
作为参考,pcTag分配范围如下:
在每个VRF中,可以定义实施方向设置。
了解策略的实施位置取决于几个不同的变量。
下表有助于了解在枝叶级别执行安全策略的位置。
场景 |
VRF实施模式 |
消费者 |
提供商 |
策略实施于 |
VRF内 |
入口/出口 |
EPG |
EPG |
·如果获知目标终端:入口枝叶* ·如果未获知目标终端:出口枝叶 |
入口 |
EPG |
L3Out EPG |
消费者枝叶(非边界枝叶) |
|
入口 |
L3Out EPG |
EPG |
提供商枝叶(非边界枝叶) |
|
出口 |
EPG |
L3Out EPG |
边界枝叶 — >非边界枝叶流量 ·如果获知目标终端:边界枝叶 ·如果未获知目标终端:非边界枝叶 非边界枝叶 — >边界枝叶流量 ·边界枝叶 |
|
出口 |
L3Out EPG |
EPG |
||
入口/出口 |
L3Out EPG |
L3Out EPG |
入口枝叶* |
|
VRF间 |
入口/出口 |
EPG |
EPG |
消费者枝叶 |
入口/出口 |
EPG |
L3Out EPG |
消费者枝叶(非边界枝叶) |
|
入口/出口 |
L3Out EPG |
EPG |
入口枝叶* |
|
入口/出口 |
L3Out EPG |
L3Out EPG |
入口枝叶* |
*策略实施应用于数据包命中后的第一个枝叶。
下图显示了一个合同实施示例,其中EPG-Web作为消费者,L3Out EPG作为提供商具有VRF内合同。如果VRF设置为入口实施模式,策略由EPG-Web所在的枝叶节点实施。如果VRF设置为出口实施模式,则如果VM-Web终端是在边界枝叶上获取的,则由L3Out所在的边界枝叶节点实施策略。
有许多工具和命令可用于帮助识别策略丢弃。策略丢弃可定义为由于合同配置或缺少合同配置而丢弃的数据包。
以下工具和命令可用于明确验证由于已完成的合同消费者/提供商关系而在枝叶交换机上编程的分区规则。
显示所有分区规则的交换机级命令。
leaf# show zoning-rule
+---------+--------+--------+----------+----------------+---------+----------+-----------------+----------+----------------------------+
| Rule ID | SrcEPG | DstEPG | FilterID | Dir | operSt | Scope | Name | Action | Priority |
+---------+--------+--------+----------+----------------+---------+----------+-----------------+----------+----------------------------+
| 4156 | 25 | 16410 | 425 | uni-dir-ignore | enabled | 2818048 | external_to_ntp | permit | fully_qual(7) |
| 4131 | 16410 | 25 | 424 | bi-dir | enabled | 2818048 | external_to_ntp | permit | fully_qual(7) |
+---------+--------+--------+----------+----------------+---------+----------+-----------------+----------+----------------------------+
包含分区规则正在执行的运动/数据流的过滤器。过滤器编程可以用此命令进行验证。
leaf# show zoning-filter
+----------+----------+-------------+-------------+-------------+----------+-------------+-------------+-------------+-------------+----------+
| FilterId | Name | EtherT | Prot | ApplyToFrag | Stateful | SFromPort | SToPort | DFromPort | DToPort | Prio |
+----------+----------+-------------+-------------+-------------+----------+-------------+-------------+-------------+-------------+----------+
| implarp | implarp | arp | unspecified | no | no | unspecified | unspecified | unspecified | unspecified | dport |
| implicit | implicit | unspecified | unspecified | no | no | unspecified | unspecified | unspecified | unspecified | implicit |
| 425 | 425_0 | ip | tcp | no | no | 123 | 123 | unspecified | unspecified | sport |
| 424 | 424_0 | ip | tcp | no | no | unspecified | unspecified | 123 | 123 | dport |
+----------+----------+-------------+-------------+-------------+----------+-------------+-------------+-------------+-------------+----------+
可以运行此命令来验证每个分区规则的命中数。这对于确定预期规则是否正在被命中而不是另一个预期规则非常有用,例如可能具有更高优先级的隐式丢弃规则。
leaf# show system internal policy-mgr stats
Requested Rule Statistics
Rule (4131) DN (sys/actrl/scope-2818048/rule-2818048-s-16410-d-25-f-424) Ingress: 0, Egress: 0, Pkts: 0 RevPkts: 0
Rule (4156) DN (sys/actrl/scope-2818048/rule-2818048-s-25-d-16410-f-425) Ingress: 0, Egress: 0, Pkts: 0 RevPkts: 0
可以在iBash级别运行的交换机级别命令,该命令报告ACL(合同)相关丢包和流相关信息,包括:
leaf# show logging ip access-list internal packet-log deny
[ Tue Oct 1 10:34:37 2019 377572 usecs]: CName: Prod1:VRF1(VXLAN: 2654209), VlanType: Unknown, Vlan-Id: 0, SMac: 0x000c0c0c0c0c, DMac:0x000c0c0c0c0c, SIP: 192.168.21.11, DIP: 192.168.22.11, SPort: 0, DPort: 0, Src Intf: Tunnel7, Proto: 1, PktLen: 98
[ Tue Oct 1 10:34:36 2019 377731 usecs]: CName: Prod1:VRF1(VXLAN: 2654209), VlanType: Unknown, Vlan-Id: 0, SMac: 0x000c0c0c0c0c, DMac:0x000c0c0c0c0c, SIP: 192.168.21.11, DIP: 192.168.22.11, SPort: 0, DPort: 0, Src Intf: Tunnel7, Proto: 1, PktLen: 98
设备上Python脚本,它根据ID执行名称查找时,生成一个输出,该输出将分区规则、过滤器和命中统计信息相关联。此脚本非常有用,因为它采用多步骤流程,并将其转换为单个命令,该命令可过滤为特定EPG/VRF或其他合同相关值。
leaf# contract_parser.py
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[7:4131] [vrf:common:default] permit ip tcp tn-Prod1/ap-Services/epg-NTP(16410) tn-Prod1/l3out-L3Out1/instP-extEpg(25) eq 123 [contract:uni/tn-Prod1/brc-external_to_ntp] [hit=0]
[7:4156] [vrf:common:default] permit ip tcp tn-Prod1/l3out-L3Out1/instP-extEpg(25) eq 123 tn-Prod1/ap-Services/epg-NTP(16410) [contract:uni/tn-Prod1/brc-external_to_ntp] [hit=0]
[12:4169] [vrf:common:default] deny,log any tn-Prod1/l3out-L3Out1/instP-extEpg(25) epg:any [contract:implicit] [hit=0]
[16:4167] [vrf:common:default] permit any epg:any tn-Prod1/bd-Services(32789) [contract:implicit] [hit=0]
用于检查转发详细信息的ASIC级别报告,在丢包的情况下,它指示丢弃原因。与此部分相关,原因可能是SECURITY_GROUP_DENY(合同策略丢弃)。
APIC上基于Python的实用程序,可以通过ELAM跟踪端到端数据包流。
一个APIC应用,它抽象化各种ASIC的复杂性,使转发决策检查更加方便和用户友好。
有关ELAM、Triage和ELAM Assistant工具的其他详细信息,请参阅“交换矩阵内转发”部分
基于每个枝叶的策略CAM使用率是一个重要监控参数,用于确保交换矩阵处于正常状态。最快速监控方法是使用GUI中的“Capacity Dashboard”并明确检查“Policy Cam”列。
此命令可用于验证各种资源限制和使用情况,包括策略CAM。请注意,此命令只能在vsh_lc中运行,因此如果从iBash运行,请使用“ — c”标志传入此命令。
leaf8# vsh_lc -c "show platform internal hal health-stats"
|Sandbox_ID: 0 Asic Bitmap: 0x0
|-------------------------------------
...
Policy stats:
=============
policy_count : 96
max_policy_count : 65536
policy_otcam_count : 175
max_policy_otcam_count : 8192
policy_label_count : 0
max_policy_label_count : 0
=============
排除两个端点之间的连接问题的方法有很多。以下方法为快速有效地隔离连接问题是否为策略丢弃(合同引起)的结果提供了良好的起点。
在深入讨论之前,需要提出一些高级问题:
有了各种可用的工具,有一些工具比其他工具更适合和更便于使用,这取决于已知的有关受影响流量的信息级别。
ACI交换矩阵中数据包的完整路径是否已知(入口枝叶、出口枝叶……)?
请注意,本部分不会详细讨论fTriage工具。有关使用此工具的更多详细信息,请参阅“交换矩阵内转发”一章。
请注意,虽然可视性和故障排除有助于快速了解两个端点之间的数据包丢弃位置,但fTriage显示更多深入信息,以便进一步进行故障排除。即fTriage将帮助识别接口、丢弃原因和有关受影响流量的其他低级详细信息
.
此示例场景将展示如何排除两个终端之间的策略丢弃故障:192.168.21.11 和 192.168.23.11
假设在这两个端点之间发生丢包,将使用以下故障排除工作流程确定问题的根本原因:
确定流量流中涉及的src/dst枝叶:
上述步骤将在下一段进一步介绍。
此示例场景将展示如何排除两个终端之间的策略丢弃故障:EPG-Web中的192.168.21.11和EPG-DB中的192.168.23.11。
可视性和故障排除工具将帮助可视化特定EP到EP流发生数据包丢弃的交换机,并确定可能丢弃数据包的位置。
配置会话名称、源和目标终端。然后单击“提交”或“生成报告”。
该工具将自动查找交换矩阵中的终端,并提供有关租户、应用配置文件和EP所属的EPG的信息。
在本例中,它将发现EP属于租户Prod1,它们属于同一应用配置文件“AppProf”,并被分配到不同的EPG:“Web”和“DB”。
该工具将自动显示故障排除方案的拓扑。在这种情况下,两个终端恰好连接到同一枝叶交换机。
通过导航到Drop/Stats子菜单,用户可以查看有关枝叶或主干上的常规丢包。请参阅本书“交换矩阵内转发”一章中的“接口丢弃”部分,了解更多有关了解哪些丢弃相关的信息。
其中许多丢弃是预期行为,可以忽略。
通过使用交换机图上的黄色“丢弃的数据包”按钮向下钻取以丢弃详细信息,用户可以查看有关丢弃的数据流的详细信息。
通过导航到Contracts(合同)子菜单,用户可以确定哪个合同导致EPG之间的策略下拉。在本例中,“隐式”(Implicit)表示拒绝Prod1/VRF1,它显示一些命中数。这并不一定意味着指定的流(192.168.21.11和192.168.23.11)达到此隐式拒绝。如果Context Implicit deny规则的Hits数增加,则表明Prod1/DB和Prod1/Web之间存在未命中任何合同的流量,因此被Implicit deny规则丢弃。
在Tenant(租户)>的Application Profile Topology(应用配置文件拓扑)视图中,选择左侧的Application Profile name(应用配置文件名称)> Topology(拓扑),可以验证将哪些合同应用于数据库EPG。在这种情况下,没有将合同分配给EPG:
由于源和目的EPG已知,因此还可以确定其他相关信息,例如:
通过打开租户>在左侧选择租户名称>操作>资源ID > EPG,可以从APIC GUI中轻松检索类ID和范围
在本例中,类ID和范围是:
验证ACI枝叶上丢弃的数据包的有趣工具是iBash命令行:'show logging ip access-list internal packet-log deny':
leaf5# show logging ip access-list internal packet-log deny | grep 192.168.21.11
[2019-10-01T14:25:44.746528000+09:00]: CName: Prod1:VRF1(VXLAN: 2654209), VlanType: FD_VLAN, Vlan-Id: 114, SMac: 0xf6f26c4ec8d0, DMac:0x0022bdf819ff, SIP: 192.168.21.11, DIP: 192.168.23.11, SPort: 0, DPort: 0, Src Intf: Ethernet1/19, Proto: 1, PktLen: 126
[2019-10-01T14:25:44.288653000+09:00]: CName: Prod1:VRF1(VXLAN: 2654209), VlanType: FD_VLAN, Vlan-Id: 116, SMac: 0x3e2593f0eded, DMac:0x0022bdf819ff, SIP: 192.168.23.11, DIP: 192.168.21.11, SPort: 0, DPort: 0, Src Intf: Ethernet1/19, Proto: 1, PktLen: 126
根据前面的输出,可以看到,在枝叶交换机上,从EP 192.168.23.11到192.168.21.11的许多ICMP数据包已丢弃。
contract_parser工具将帮助验证应用于终端关联的VRF的实际策略:
leaf5# contract_parser.py --vrf Prod1:VRF1
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[7:5159] [vrf:Prod1:VRF1] permit ip tcp tn-Prod1/ap-App1/epg-App(32771) eq 5000 tn-Prod1/ap-App1/epg-Web(32772) [contract:uni/tn-Prod1/brc-web_to_app] [hit=0]
[7:5156] [vrf:Prod1:VRF1] permit ip tcp tn-Prod1/ap-App1/epg-Web(32772) tn-Prod1/ap-App1/epg-App(32771) eq 5000 [contract:uni/tn-Prod1/brc-web_to_app] [hit=0]
[16:5152] [vrf:Prod1:VRF1] permit any epg:any tn-Prod1/bd-Web(49154) [contract:implicit] [hit=0]
[16:5154] [vrf:Prod1:VRF1] permit arp epg:any epg:any [contract:implicit] [hit=0]
[21:5155] [vrf:Prod1:VRF1] deny,log any epg:any epg:any [contract:implicit] [hit=38,+10]
[22:5153] [vrf:Prod1:VRF1] deny,log any epg:any pfx-0.0.0.0/0(15) [contract:implicit] [hit=0]
这也可以通过在枝叶中编程的分区规则验证交换机实施的策略。
leaf5# show zoning-rule scope 2654209
+---------+--------+--------+----------+----------------+---------+----------+------------+----------+-------------------------+
| Rule ID | SrcEPG | DstEPG | FilterID | Dir | operSt | Scope | Name | Action | Priority |
+---------+--------+--------+----------+----------------+---------+----------+------------+----------+-------------------------+
| 5155 | 0 | 0 | implicit | uni-dir | enabled | 2654209 | | deny,log | any_any_any(21) |
| 5159 | 32771 | 32772 | 411 | uni-dir-ignore | enabled | 2654209 | web_to_app | permit | fully_qual(7) |
| 5156 | 32772 | 32771 | 410 | bi-dir | enabled | 2654209 | web_to_app | permit | fully_qual(7) |
+---------+--------+--------+----------+----------------+---------+----------+------------+----------+-------------------------+
如可视性与故障排除工具、contract_parser工具和分区规则所示,输出确认在故障排除过程中,源和目标EPG之间没有合同。很容易假设丢弃的数据包与隐式拒绝规则5155匹配。
ELAM捕获提供用于检查转发详细信息的ASIC级别报告,在数据包被丢弃的情况下,该报告指示丢弃原因。当丢弃原因为策略丢弃时(如本场景所示),ELAM捕获的输出将如下所示。
请注意,本章不讨论设置ELAM捕获的详细信息,请参阅“交换矩阵内转发”一章。
leaf5# vsh_lc
module-1# debug platform internal tah elam asic 0
module-1(DBG-elam)# trigger init in-select 6 out-select 0
module-1(DBG-elam)# trigger reset
module-1(DBG-elam-insel6)# set outer ipv4 src_ip 192.168.21.11 dst_ip 192.168.23.11
module-1(DBG-elam-insel6)# start
module-1(DBG-elam-insel6)# status
ELAM STATUS
===========
Asic 0 Slice 0 Status Triggered
Asic 0 Slice 1 Status Armed
module-1(DBG-elam-insel6)# ereport | grep reason
RW drop reason : SECURITY_GROUP_DENY
LU drop reason : SECURITY_GROUP_DENY
pkt.lu_drop_reason: 0x2D
上述ELAM报告清楚地显示由于策略丢弃而丢弃了数据包:'SECURITY_GROUP_DENY'
通过APIC GUI上的ELAM Assistant应用可显示与ELAM捕获完全相同的结果。
通常,用户将配置相关流的源和目标详细信息。在本示例中,源IP用于捕获目标EPG中流向与源EPG没有合同关系的终端的流量。
通过ELAM Assistant可以查看三个级别的输出。这些是Express、Detail和Raw。
在Express Result(快速结果)下,丢弃代码原因SECURITY_GROUP_DENY表示丢弃是合同命中的结果。
在配置了合同首选组的VRF中,有两种类型的策略实施可用于EPG:
合同首选组功能可更好地控制VRF中EPG之间的通信。如果VRF中的大部分EPG应该具有开放式通信,但少数应仅与其他EPG具有有限的通信,请配置合同首选组和合同与过滤器的组合,以更加精确地控制EPG间通信。
如果存在覆盖source-any-destination-any-deny默认规则的合同,则从首选组排除的EPG只能与其他EPG通信。
从本质上讲,合同首选组与常规合同相反。对于常规合同,显式permit zoning-rules使用VRF范围的隐式deny zoning-rule进行编程。对于首选组,使用最高数值优先级值编程隐式PERMIT分区规则,而编程特定DENY分区规则以禁止来自非首选组成员的EPG的流量。因此,首先评估拒绝规则,如果流与这些规则不匹配,则隐式允许流。
对于首选组之外的每个EPG,始终有一对明确的deny zoning-rules:
下图显示了一个逻辑拓扑,其中EPG应用、应用2和应用3均配置为首选组成员。
VM-App是EPG-App的一部分,VM-App2是EPG-App2的一部分。App和App2 EPG都应是首选的一部分,因此可以自由通信。
VM-App在TCP端口6000上向VM-App2发起流量。EPG-App和EPG-App2都是VRF1的首选组成员。VM-App2从TCP端口6000上从未收到任何数据包。
1.查找EPG APP的pcTag及其VRF VNID/Scope
EPG和VRF pcTags
2.在入口枝叶上使用contract_parser.py验证合同编程
使用contract_parser.py和/或“show zoning-rule”命令并指定VRF
fab3-leaf8# show zoning-rule scope 2654209
+---------+--------+--------+----------+---------+---------+---------+------+----------+----------------------------+
| Rule ID | SrcEPG | DstEPG | FilterID | Dir | operSt | Scope | Name | Action | Priority |
+---------+--------+--------+----------+---------+---------+---------+------+----------+----------------------------+
| 4165 | 0 | 0 | implicit | uni-dir | enabled | 2654209 | | permit | grp_any_any_any_permit(20) |
| 4160 | 0 | 0 | implarp | uni-dir | enabled | 2654209 | | permit | any_any_filter(17) |
| 4164 | 0 | 15 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_any_dest_any_deny(19) |
| 4176 | 0 | 16386 | implicit | uni-dir | enabled | 2654209 | | permit | any_dest_any(16) |
| 4130 | 32770 | 0 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_src_any_any_deny(18) |
| 4175 | 49159 | 0 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_src_any_any_deny(18) |
| 4129 | 0 | 49159 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_any_dest_any_deny(19) |
| 4177 | 32778 | 0 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_src_any_any_deny(18) |
| 4128 | 0 | 32778 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_any_dest_any_deny(19) |
| 4178 | 32775 | 0 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_src_any_any_deny(18) |
| 4179 | 0 | 32775 | implicit | uni-dir | enabled | 2654209 | | deny,log | grp_any_dest_any_deny(19) |
+---------+--------+--------+----------+---------+---------+---------+------+----------+----------------------------+
fab3-leaf8# contract_parser.py --vrf Prod1:VRF1
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[16:4176] [vrf:Prod1:VRF1] permit any epg:any tn-Prod1/bd-App(16386) [contract:implicit] [hit=0]
[16:4160] [vrf:Prod1:VRF1] permit arp epg:any epg:any [contract:implicit] [hit=0]
[18:4130] [vrf:Prod1:VRF1] deny,log any tn-Prod1/vrf-VRF1(32770) epg:any [contract:implicit] [hit=?]
[18:4178] [vrf:Prod1:VRF1] deny,log any epg:32775 epg:any [contract:implicit] [hit=?]
[18:4177] [vrf:Prod1:VRF1] deny,log any epg:32778 epg:any [contract:implicit] [hit=?]
[18:4175] [vrf:Prod1:VRF1] deny,log any epg:49159 epg:any [contract:implicit] [hit=?]
[19:4164] [vrf:Prod1:VRF1] deny,log any epg:any pfx-0.0.0.0/0(15) [contract:implicit] [hit=0]
[19:4179] [vrf:Prod1:VRF1] deny,log any epg:any epg:32775 [contract:implicit] [hit=?]
[19:4128] [vrf:Prod1:VRF1] deny,log any epg:any epg:32778 [contract:implicit] [hit=?]
[19:4129] [vrf:Prod1:VRF1] deny,log any epg:any epg:49159 [contract:implicit] [hit=?]
[20:4165] [vrf:Prod1:VRF1] permit any epg:any epg:any [contract:implicit] [hit=65]
检查上述输出,观察到具有最高优先级20的隐式permit条目 — ruleId 4165。除非有具有较低优先级的显式拒绝规则禁止流量,否则此隐式允许规则将导致允许所有流量。
此外,对于pcTag 32775(即EPG App2的pcTag),观察到两个显式拒绝规则。这两个显式拒绝分区规则禁止从任何EPG到EPG App2的流量,反之亦然。这些规则的优先级为18和19,因此它们将优先于默认的允许规则。
结论是,EPG App2不是首选组成员,因为已观察到显式拒绝规则。
3.检验EPG首选组成员配置
导航APIC GUI并检查EPG App2和EPG应用首选组成员配置,在下图中,请参阅EPG App2未配置为首选组成员。
EPG App2 — 排除首选组成员设置
EPG应用 — 包括首选组成员设置
4.将EPG App2设置为首选组成员
更改App2 EPG配置可使首选组作为首选组的一部分自由通信。
EPG App2 — 包括首选组成员设置
5.使用src EP所在的枝叶上的contract_parser.py重新验证合同编程
再次使用contract_parser.py并指定VRF名称以验证EPG App2的显式拒绝规则是否已消失。
fab3-leaf8# contract_parser.py --vrf Prod1:VRF1
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[16:4176] [vrf:Prod1:VRF1] permit any epg:any tn-Prod1/bd-App(16386) [contract:implicit] [hit=0]
[16:4160] [vrf:Prod1:VRF1] permit arp epg:any epg:any [contract:implicit] [hit=0]
[18:4175] [vrf:Prod1:VRF1] deny,log any epg:16390 epg:any [contract:implicit] [hit=0]
[18:4167] [vrf:Prod1:VRF1] deny,log any epg:23 epg:any [contract:implicit] [hit=0]
[18:4156] [vrf:Prod1:VRF1] deny,log any tn-Prod1/vrf-VRF1(32770) epg:any [contract:implicit] [hit=0]
[18:4168] [vrf:Prod1:VRF1] deny,log any epg:49159 epg:any [contract:implicit] [hit=0]
[19:4164] [vrf:Prod1:VRF1] deny,log any epg:any pfx-0.0.0.0/0(15) [contract:implicit] [hit=0]
[19:4169] [vrf:Prod1:VRF1] deny,log any epg:any epg:16390 [contract:implicit] [hit=0]
[19:4159] [vrf:Prod1:VRF1] deny,log any epg:any epg:23 [contract:implicit] [hit=0]
[19:4174] [vrf:Prod1:VRF1] deny,log any epg:any epg:49159 [contract:implicit] [hit=0]
[20:4165] [vrf:Prod1:VRF1] permit any epg:any epg:any [contract:implicit] [hit=65]
上述输出中不再显示EPG App2及其pcTag32775的显式拒绝规则。这意味着EPG应用和EPG应用2中的EP之间的流量现在将匹配隐式允许规则(ruleId 4165),最高优先级为20。
在一个或多个EPG之间配置合同时,可以将合同配置为消耗关系或提供的关系。当EPG数量增加时,它们之间的合同关系量也会增加。某些常见使用案例要求所有EPG与另一个特定EPG交换流量。此类用例可以是EPG,其中包含需要由相同VRF(例如NTP或DNS)内的所有其他EPG使用的服务的EP。vzAny可降低在配置所有EPG与提供所有其他EPG要使用的服务的特定EPG之间的合同关系时的运营开销。此外,由于每个vzAny合同关系仅添加了2个分区规则,因此vzAny允许在枝叶交换机上更有效地使用安全策略CAM。
下图描述了这样的使用案例,其中EPG Web中的VM-Web和VM-App分别需要使用EPG-NTP中的VM-NTP的NTP服务。vzAny允许VRF Prod:VRF1中的每个EPG从EPG NTP使用NTP服务,而不是在EPG NTP上配置提供的合同,并且随后将该合同与EPG Web和App上使用的合同相同。
vzAny - VRF中的任何EPG Prod:VRF1都可以使用EPG NTP中的NTP服务
考虑这样一个场景:当使用NTP服务的EPG之间没有合同时,它们之间会观察到丢弃。
1.查找EPG NTP的pcTag及其VRF VNID/Scope
“Tenant > Operational > Resource IDs > EPGs”允许查找pcTag和范围
EPG NTP pcTag及其VRF VNID/范围
2.验证合同是否配置为vz作为VRF一部分的任何使用合同
导航到VRF,并检查“EPG Collection for VRF”下是否有已使用的合同配置为vzAny。
配置为已消耗vz的合同VRF上的任何合同
3.验证相同合同是否应用为EPG NTP上提供的合同
为了建立合同关系,需要将同一合同应用为向其VRF中的其他EPG提供NTP服务的EPG NTP上提供的合同。
4.使用contract_parser.py或“show zoning-rule”对入口枝叶进行分区规则验证
入口枝叶应该具有2个分区规则,以允许任何EPG和EPG NTP之间的双向流量传输(如果合同主题设置为允许两个方向)。“任何EPG”在分区规则编程中表示为pcTag 0。
在指定VRF时在入口枝叶上使用contract_parser.py或“show zoning-rule”命令可确保对zoning-rule进行编程。
使用contract_parser.py和“show zoning-rule”检查是否存在基于vzAny的分区规则。
这里显然有两种规则:
鉴于最低优先级具有优先级,VRF的所有EPG将有权访问NTP EPG。
fab3-leaf8# contract_parser.py --vrf Prod1:VRF
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[13:4156] [vrf:Prod1:VRF1] permit ip tcp tn-Prod1/ap-Services/epg-NTP(49161) eq 123 epg:any [contract:uni/tn-Prod1/brc-any_to_ntp] [hit=0]
[14:4168] [vrf:Prod1:VRF1] permit ip tcp epg:any tn-Prod1/ap-Services/epg-NTP(49161) eq 123 [contract:uni/tn-Prod1/brc-any_to_ntp] [hit=0]
[16:4176] [vrf:Prod1:VRF1] permit any epg:any tn-Prod1/bd-App(16386) [contract:implicit] [hit=0]
[16:4174] [vrf:Prod1:VRF1] permit any epg:any tn-Prod1/bd-Services(32776) [contract:implicit] [hit=0]
[16:4160] [vrf:Prod1:VRF1] permit arp epg:any epg:any [contract:implicit] [hit=0]
[21:4165] [vrf:Prod1:VRF1] deny,log any epg:any epg:any [contract:implicit] [hit=65]
[22:4164] [vrf:Prod1:VRF1] deny,log any epg:any pfx-0.0.0.0/0(15) [contract:implicit] [hit=0]
fab3-leaf8# show zoning-rule scope 2654209
+---------+--------+--------+----------+---------+---------+---------+------------+----------+----------------------+
| Rule ID | SrcEPG | DstEPG | FilterID | Dir | operSt | Scope | Name | Action | Priority |
+---------+--------+--------+----------+---------+---------+---------+------------+----------+----------------------+
| 4165 | 0 | 0 | implicit | uni-dir | enabled | 2654209 | | deny,log | any_any_any(21) |
| 4160 | 0 | 0 | implarp | uni-dir | enabled | 2654209 | | permit | any_any_filter(17) |
| 4164 | 0 | 15 | implicit | uni-dir | enabled | 2654209 | | deny,log | any_vrf_any_deny(22) |
| 4176 | 0 | 16386 | implicit | uni-dir | enabled | 2654209 | | permit | any_dest_any(16) |
| 4174 | 0 | 32776 | implicit | uni-dir | enabled | 2654209 | | permit | any_dest_any(16) |
| 4168 | 0 | 49161 | 424 | uni-dir | enabled | 2654209 | any_to_ntp | permit | any_dest_filter(14) |
| 4156 | 49161 | 0 | 425 | uni-dir | enabled | 2654209 | any_to_ntp | permit | src_any_filter(13) |
+---------+--------+--------+----------+---------+---------+---------+------------+----------+----------------------+
共享第3层出站是一种配置,它允许在一个VRF中有一个L3Out提供一些服务(外部访问),并且一个或多个其他VRF使用此L3Out。有关共享L3Out的详细信息,请参阅“外部路由”一章。
执行共享L3Out时,建议让合同的提供商成为共享L3Out,EPG成为合同的消费者。此场景将在本节中说明。
建议不要执行相反操作,即L3Out使用EPG提供的服务。原因与可扩展性有关,因为对于共享服务,zoning-rules仅安装在消费者VRF上。消费和提供原则表示流量从何处开始。使用默认入口策略实施时,这意味着策略实施将应用于消费者端,更具体地应用于入口枝叶(非边界枝叶)。 入口枝叶要执行策略,需要目标的pcTag。在此场景中,目标是外部EPG pcTag。入口枝叶因此执行策略实施并将数据包转发到边界枝叶。边界枝叶在其交换矩阵链路上接收数据包,该交换矩阵链路执行路由查找(LPM)并将数据包转发到目的前缀的邻接关系上。
但是,边界枝叶在将流量发送到目标EP时不会执行任何策略实施,也不会在将返回流量流回源EP时执行任何策略实施。
因此,只有入口非BL枝叶的策略CAM安装了条目(在消费者VRF中),BL的策略CAM不会受到影响。
1.验证消费者EPG的EPG pcTag和VRF VNID/范围
对于共享L3Out,分区规则仅安装在使用者VRF中。提供商必须拥有允许此pcTag用于所有消费者VRF的全局pcTag(低于16k)。在我们的场景中,提供商是外部EPG,将拥有全局pcTag。与往常一样,消费者EPG将使用本地pcTag。
消费者EPG的pcTag
2.验证提供商L3Out EPG的pcTag和VRF VNID/范围
如步骤1所述,提供商L3Out EPG具有全局范围pcTag,作为L3Out的前缀,这些前缀会泄漏到消费者VRF中。因此,L3Out EPG pcTag需要与消费者VRF中的pcTag不重叠,因此它在全局pcTag范围内。
提供商外部EPG的pcTag
3.验证消费者EPG是否配置了导入的租户范围合同或全局合同
在EPG/BD下定义子网的消费者EPG NTP使用“租户”或“全局”范围合同
EPG使用的合同
4.验证消费者EPG的BD是否配置了作用域设置为“在VRF之间共享”的子网
EPG的子网在桥接域下配置,但必须具有“在VRF之间共享”标志(允许路由泄漏)和“通告外部”标志(允许通告到L3Out)
5.验证提供商L3Out EPG是否配置了导入的租户范围合同或全局合同
L3Out EPG应具有租户范围合同或配置为所提供合同的全局合同。
提供商L3Out的合同
6.验证提供商L3Out EPG是否配置了已检查必要范围的子网
提供商L3Out EPG应使用以下范围配置要泄漏的前缀:
有关L3Out EPG中的子网标志的详细信息,请参阅“外部转发”一章。
外部EPG子网设置
外部EPG子网设置已展开
7.验证消费者VRF的非BL上L3Out EPG子网的pcTag
当发往外部EPG子网的流量进入非BL时,会根据目标前缀执行查找以确定pcTag。这可以在非BL上使用以下命令来检查。
请注意,此输出在VNI范围2818048即消费者VRF VNID。通过查看该表,消费者可以找到目标的pcTag,即使它不在同一VRF中。
fab3-leaf8# vsh -c 'show system internal policy-mgr prefix' | egrep 'Vrf-Vni|==|common:default'
Vrf-Vni VRF-Id Table-Id Table-State VRF-Name Addr Class Shared Remote Complete
======= ====== =========== ======= ============================ ================================= ====== ====== ====== ========
2818048 19 0x13 Up common:default 0.0.0.0/0 15 False False False
2818048 19 0x80000013 Up common:default ::/0 15 False False False
2818048 19 0x13 Up common:default 172.16.10.0/24 25 True True False
以上输出显示了L3Out EPG子网及其全局pcTag 25的组合。
8.验证消费者VRF的非BL上的编程分区规则
使用“contract_parser.py”或“show zoning-rule”命令并指定VRF。
以下命令输出显示了两个分区规则,以允许从使用者EPG本地pcTag 16410到L3Out EPG全局pcTag 25的流量。这属于范围2818048,即使用者VRF的范围。
fab3-leaf8# show zoning-rule scope 2818048
+---------+--------+--------+----------+----------------+---------+---------+-----------------+----------+-----------------------+
| Rule ID | SrcEPG | DstEPG | FilterID | Dir | operSt | Scope | Name | Action | Priority |
+---------+--------+--------+----------+----------------+---------+---------+-----------------+----------+-----------------------+
| 4174 | 0 | 0 | implarp | uni-dir | enabled | 2818048 | | permit | any_any_filter(17) |
| 4168 | 0 | 15 | implicit | uni-dir | enabled | 2818048 | | deny,log | any_vrf_any_deny(22) |
| 4167 | 0 | 32789 | implicit | uni-dir | enabled | 2818048 | | permit | any_dest_any(16) |
| 4159 | 0 | 0 | implicit | uni-dir | enabled | 2818048 | | deny,log | any_any_any(21) |
| 4169 | 25 | 0 | implicit | uni-dir | enabled | 2818048 | | deny,log | shsrc_any_any_deny(12)|
| 4156 | 25 | 16410 | 425 | uni-dir-ignore | enabled | 2818048 | external_to_ntp | permit | fully_qual(7) |
| 4131 | 16410 | 25 | 424 | bi-dir | enabled | 2818048 | external_to_ntp | permit | fully_qual(7) |
+---------+--------+--------+----------+----------------+---------+---------+-----------------+----------+-----------------------+
fab3-leaf8# contract_parser.py --vrf common:default
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[7:4131] [vrf:common:default] permit ip tcp tn-Prod1/ap-Services/epg-NTP(16410) tn-Prod1/l3out-L3Out1/instP-extEpg(25) eq 123 [contract:uni/tn-Prod1/brc-external_to_ntp] [hit=0]
[7:4156] [vrf:common:default] permit ip tcp tn-Prod1/l3out-L3Out1/instP-extEpg(25) eq 123 tn-Prod1/ap-Services/epg-NTP(16410) [contract:uni/tn-Prod1/brc-external_to_ntp] [hit=0]
[12:4169] [vrf:common:default] deny,log any tn-Prod1/l3out-L3Out1/instP-extEpg(25) epg:any [contract:implicit] [hit=0]
[16:4167] [vrf:common:default] permit any epg:any tn-Prod1/bd-Services(32789) [contract:implicit] [hit=0]
[16:4174] [vrf:common:default] permit arp epg:any epg:any [contract:implicit] [hit=0]
[21:4159] [vrf:common:default] deny,log any epg:any epg:any [contract:implicit] [hit=0]
[22:4168] [vrf:common:default] deny,log any epg:any pfx-0.0.0.0/0(15) [contract:implicit] [hit=0]
9.验证提供商VRF的BL上的编程分区规则
使用“contract_parser.py”或“show zoning-rule”命令并指定VRF。以下命令输出显示提供商VRF中没有之前多次概述的NO specific zoning-rules。
它处于提供商2719752的作用域范围内。
border-leaf# show zoning-rule scope 2719752
+---------+--------+--------+----------+----------------+---------+---------+--------------+----------+----------------------+
| Rule ID | SrcEPG | DstEPG | FilterID | Dir | operSt | Scope | Name | Action | Priority |
+---------+--------+--------+----------+----------------+---------+---------+--------------+----------+----------------------+
| 4134 | 10937 | 24 | default | uni-dir-ignore | enabled | 2719752 | vrf1_to_vrf2 | permit | src_dst_any(9) |
| 4135 | 24 | 10937 | default | bi-dir | enabled | 2719752 | vrf1_to_vrf2 | permit | src_dst_any(9) |
| 4131 | 0 | 0 | implicit | uni-dir | enabled | 2719752 | | deny,log | any_any_any(21) |
| 4130 | 0 | 0 | implarp | uni-dir | enabled | 2719752 | | permit | any_any_filter(17) |
| 4132 | 0 | 15 | implicit | uni-dir | enabled | 2719752 | | deny,log | any_vrf_any_deny(22) |
+---------+--------+--------+----------+----------------+---------+---------+--------------+----------+----------------------+
border-leaf# contract_parser.py --vrf Prod1:VRF3
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[9:4134] [vrf:Prod1:VRF3] permit any tn-Prod1/l3out-L3Out1/instP-extEpg2(10937) tn-Prod1/l3out-L3Out2/instP-extEpg2(24) [contract:uni/tn-Prod1/brc-vrf1_to_vrf2] [hit=0]
[9:4135] [vrf:Prod1:VRF3] permit any tn-Prod1/l3out-L3Out2/instP-extEpg2(24) tn-Prod1/l3out-L3Out1/instP-extEpg2(10937) [contract:uni/tn-Prod1/brc-vrf1_to_vrf2] [hit=0]
[16:4130] [vrf:Prod1:VRF3] permit arp epg:any epg:any [contract:implicit] [hit=0]
[21:4131] [vrf:Prod1:VRF3] deny,log any epg:any epg:any [contract:implicit] [hit=0]
[22:4132] [vrf:Prod1:VRF3] deny,log any epg:any pfx-0.0.0.0/0(15) [contract:implicit] [hit=0]
版本 | 发布日期 | 备注 |
---|---|---|
1.0 |
05-Aug-2022 |
初始版本 |