Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

追踪虚拟路由器数据包路径

Contrail 网络虚拟路由器是从虚拟机 (VM) 获取数据包并将其转发到目标位置的组件。跟踪是调试数据包路径的有用工具。

在本主题中,我们将跟踪以下用例中的 vRouter 数据包路径:

单播数据包路径 - VN 内

此过程逐步调试从 VM1 到 VM2(在同一计算节点上)和 VM3(位于不同计算节点上)的虚拟网络内(VN 内)流量的单播数据包路径。在此示例中,列出的虚拟机位于同一子网 10.1.1.0/24中。VN 内流量位于同一虚拟网络中。

VM1

IP 地址 10.1.1.5/32 (计算 1)

VM2

IP 地址 10.1.1.6/32 (计算 1)

VM3

IP 地址 10.1.1.7/32 (计算 2)

计算内用例

  1. vif使用以下命令发现与虚拟机的虚拟机接口 (VMI) 对应的接口:

    您还可以通过输入自检 URL 来发现 vif 接口。

    例子:

    注意:

    将 IP 地址替换为自检 HTTP URL 中的实际计算 IP 地址。

  2. 运行命令以 vif --get <index> 验证是否已在 vRouter 接口 (VIF) 中设置虚拟路由和转发 (VRF) 和策略标志。

    验证每个 vif标志的示例输出:

  3. 运行以下命令以显示桥接表中的所有条目:

    例子:

    示例中突出显示的是网桥表中目标虚拟机的目标 MAC 地址以及与之关联的下一跃点标识符。

  4. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

    在此示例中, Oif:6 是下一跃点中的 OIF 索引,它是数据包的传出接口。对应于 Encap Data 在数据包转发到传出接口之前添加到 IP 数据包的 L2 封装。

  5. 运行 vif --get <oifindex> 以获取传出 VIF 详细信息。

    例子:

    当流量流过时,相应 VIF 接口的接收数据包和传输数据包RXTX计数器将递增。

  6. 运行命令 flow -l 以列出创建的流。如果在 VIF 上启用了策略标志,则会创建一个流,如示例中所示。

    示例:从 执行 PING 10.1.1.6 操作 10.1.1.5

    当流量流过时,正向和反向流中的统计信息将递增。如果特定流的统计信息未递增,则可能表明该方向存在潜在问题。流操作应为 F “或”,用于转发或 N NAT 输出的数据包。流操作 为 表示 D 将丢弃数据包。

  7. vrouter_agent_debug运行脚本以收集所有相关日志。

计算间用例

在计算间情况下,下一跃点查找指向将数据包带到另一个计算节点的隧道。网桥条目还将指示在封装期间添加到数据包的标签/VNID。计算间流量在不同计算节点上的 VM 之间传输。

对于计算 1:

  1. vif使用以下命令发现与虚拟机的虚拟机接口 (VMI) 对应的接口:

    您还可以通过输入自省 URL 来发现 vif 接口:

    例子:

    注意:

    将 IP 地址替换为自检 HTTP URL 中的实际计算 IP 地址。

  2. 运行命令以 vif --get <index> 验证是否已在 vRouter 接口 (VIF) 中设置虚拟路由和转发 (VRF) 和策略标志。

    验证每个 vif标志的示例输出:

  3. 运行以下命令以显示桥接表中的所有条目:

    例子:

    在示例中, 2:99:ef:64:96:e1 属于IP地址 10.1.1.7 和标签 27 用于封装数据包。

  4. 运行 nh --get <nh id> 以获取下一跃点详细信息。

    例子:

    在此示例中,下一跃点输出将下一跃点类型指示为 Tunnel,封装使用 MPLSoGRE,传出接口 Oif:0指示为 ,以及隧道的相应源和目标 IP 地址。

对于计算 2:

  1. 运行命令以查看 mpls --get <label> 映射到特定传入 MPLS 表的下一跃点。

    例子:

  2. 运行 nh --get <nh_id> 以获取下一跃点详细信息。

    例子:

  3. 运行 vif --get <oifindex> 以获取传出 VIF 详细信息。

    例子:

    注意:

    如果您使用的是 VXLAN 封装,请在计算 2 上执行以下操作:

    1. 对于步骤 1,请运行命令以获取从 VXLAN ID 到下一跃点的映射,而不是运行mpls --getvxlan --get <vxlanid>命令。

    2. 使用 VXLAN 时,下一跃点指向转换后的下一跃点的 VRF。使用相应 VRF 中的网桥查找(如步骤 3 所示)获取最终传出下一跃点,该跃点将指向 VIF 接口。

单播数据包路径 - VN 间

以下过程逐步调试从 VM1 到 VM2(在同一计算节点上)和 VM3(在不同的计算节点上)的数据包路径。在此示例中,列出的虚拟机 (VM) 位于同一子网 10.1.1.0/24中。

VM1

IP 地址 10.1.1.5/32 (计算 1)

VM2

IP 地址 20.1.1.6/32 (计算 1)

VM3

IP 地址 20.1.1.5/32 (计算 2)

注意:

将 IP 地址替换为所有自检 URL 中的实际计算 IP 地址。

计算内用例

  1. vif使用以下命令发现与虚拟机的虚拟机接口 (VMI) 对应的接口:

    您还可以通过输入自省 URL 来发现 vif 接口:

    例子:

    注意:

    将 IP 地址替换为自检 HTTP URL 中的实际计算 IP 地址。

  2. 运行命令以 vif --get <index> 验证是否已在 vRouter 接口 (VIF) 中设置虚拟路由和转发 (VRF) 和策略标志。

    验证每个 vif标志的示例输出:

  3. 运行以下命令以显示桥接表中的所有条目:

    例子:

    对于虚拟网络间 (VN),数据包在第 3 层路由,而不是第 2 层交换。虚拟路由器为目标网络执行代理 ARP,为来自源的 ARP 请求提供其虚拟 MAC 地址 0:0:5e:0:1:0 。这 rt –dump 可以从源 VN inet 表中看出。这会导致数据包被 vRouter 接收,vRouter 会执行路由查找以将数据包发送到正确的目标。

  4. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

  5. 运行 rt --dump 2 --family inet | grep <ip address> 以显示指定 IP 地址上的 inet 系列路由。

    例子:

  6. 运行 nh --get <nh id> 以获取下一跃点详细信息。

    例子:

  7. 运行 vif --get <oifindex> 以获取传出 VIF 详细信息。

    例子:

计算间用例

在相互计算的情况下,查找的下一跃点将数据包发送出去,将指向隧道下一跃点。根据封装优先级,将添加适当的封装并以隧道方式传输数据包。计算间流量在不同计算节点上的 VM 之间传输。

对于计算 1:

  1. 运行 rt --dump 2 --family inet | grep <ip address> 以显示指定 IP 地址的 inet 系列路由。

    例子:

  2. 运行 nh --get <nh id> 以显示下一跃点详细信息,该详细信息指向隧道下一跃点。

    例子:

对于计算 2:

  1. 运行命令以查看 mpls --get <label> 映射到特定传入 MPLS 表的下一跃点。

    例子:

  2. 运行 nh --get <nh id> 以查看下一跃点详细信息。

    例子:

    在此示例中, Oif:4 是下一跃点中的 OIF 索引,它是数据包的传出接口。对应于 Encap Data 在数据包转发到传出接口之前添加到 IP 数据包的 L2 封装。

  3. 运行 vif --get <oifindex> 以获取传出 VIF 详细信息。

    例子:

    有关 Contrail 网络中的 EVPN 类型 5 路由的详细信息,请参阅 支持 EVPN 路由类型 5

广播、未知单播和组播数据包路径

以下过程将逐步调试 Contrail 网络中广播、未知单播和组播 (BUM) 流量的数据包路径。在此示例中,列出的虚拟机 (VM) 位于同一子网 70.70.70.0/24 中。

ToR 服务节点 (TSN) 积极持有 contrail-tor-agent 并负责:

  1. 充当来自 ToR 交换机的所有 BUM 流量的接收方。

  2. 充当连接到 ToR 交换机的裸金属服务器 DNS/DHCP 响应方。

低于 5.x 的 Contrail 网络版本使用 Open vSwitch Database (OVSDB) 管理的 VXLAN 环境。

OVSDB 管理的 VXLAN 的拓扑示例:

  • 架顶式交换机 1 (ToR SW1) - 10.204.74.229 (lo0.0 = 1.1.1.229)

  • 架顶式交换机 2 (ToR SW2) - 10.204.74.230 (lo0.0 = 1.1.1.230)

  • ToR 服务节点 1 (TSN1) = 10.219.94.7

  • ToR 服务节点 2 (TSN2) = 10.219.94.8

  • 控制器 1 = 10.219.94.4

  • 控制器 2 = 10.219.94.5

  • 控制器 3 = 10.219.94.6

  • 计算1 = 10.219.94.9

  • 计算2 = 19.219.94.18

  • 虚拟网络 (VN) = 70.70.70.0/24

  • 虚拟机 1 (VM1) = 70.70.70.3 驻留在计算 2 上

  • 虚拟机 2 (VM2) = 70.70.70.5 驻留在计算 1 上

  • 裸机服务器 1 (BMS1) = 70.70.70.100

  • 裸机服务器 2 (BMS2) = 70.70.70.101

  1. 运行命令以 set protocols ovsdb interfaces <interface> 配置您希望 OVSDB 协议管理的物理接口。

    例子:

    BMS 挂起的 ToR 接口标记为 ovsdb interfaces

  2. 通过显示 ovsdb mac ToR 交换机的表来查看进入这些接口的数据包。

    例子:

    标记为红色ff:ff:ff:ff:ff:ff:ff ( - 广播路由)的条目表示进入 ToR SW 的 BUM 数据包的 ovsdb interface下一跃点。在这种情况下,VTEP 地址 10.219.94.7 是下一跃点,即 TSN1。这根据哪个TSN对有问题的ToR交换机具有活动 contrail-tor-agent 状态而变化。这样,BUM 数据包将被转发到 VXLAN 隧道中的 TSN 节点(本地 VTEP 源接口为,RVTEP 源接口为 1.1.1.229 10.219.94.7)。

    VXLAN 封装数据包随 VXLAN 网络标识符 (VNI) 一起发送,该标识符在创建逻辑接口时由 Contrail 网络预先确定。例如,在 Contrail 网络中配置为逻辑端口时 ge-0/0/46 ,将在 ToR 上提交以下配置。

    例子:

    当 VXLAN 封装的数据包到达 TSN 节点时,让我们来看看 vRouter 如何处理此数据包。

  3. 运行 vxlan --dump 以转储 VXLAN 表。VXLAN 表将网络 ID 映射到下一跃点。

    例子:

    在此示例中,下一跃点 13 是为 VNI 4编程的。

  4. 运行 nh --get <nh id> 以显示下一跃点详细信息并确定关联的虚拟路由和转发 (VRF)。

    例子:

  5. 运行以下命令以显示桥接表中的所有条目:

    例子:

    在示例网桥表中,由于我们正在跟踪 BUM 数据包路径,因此我们需要通过选择编程的下一跳来检查 ff:ff:ff:ff:ff:ff:ff 路由。在示例中,它是 24。请注意,已对一系列复合下一跃点进行编程。

  6. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

    示例中的组播树显示有两个动态 IP (DIP)。数据包来源的 DIP 将被忽略。因此,数据包仅转发到 DIP 10.219.94.18

  7. 运行 vxlan --get <vnid> 以检查 DIP 10.219.94.18 如何处理传入的 VXLAN 封装数据包。

    例子:

  8. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

  9. 运行以下命令以显示桥接表中的所有条目:

    例子:

    在示例网桥表中,由于我们正在跟踪 BUM 数据包路径,因此我们需要通过选择编程的下一跳来检查 ff:ff:ff:ff:ff:ff:ff 路由。在示例中,它是 50。

  10. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

    在此示例中,您只需要检查 DIP 10.219.94.9。其余端点要么是本地端点,要么是 BUM 流量的来源。现在,让我们检查一下 DIP 10.219.94.9 如何处理传入的 VXLAN 封装数据包。

  11. 运行 vxlan --get <vnid> 以检查 DIP 10.219.94.9 如何处理传入的 VXLAN 封装数据包。

    例子:

  12. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

  13. 使用以下命令显示 VRF 的网桥表:

    例子:

  14. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

    从上面的输出来看,您需要进一步检查的唯一 DIP 是 10.219.94.8。其余 DIP 要么是本地的,要么是 BUM 流量的来源。现在,让我们看看 DIP 10.219.94.8 如何处理传入的 VXLAN 封装数据包。

  15. 运行 vxlan --get <vnid> 以检查 DIP 10.219.94.9 如何处理传入的 VXLAN 封装数据包。

    例子:

  16. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

  17. 使用以下命令显示 VRF 的网桥表:

    例子:

  18. 运行 nh --get <nh id> 以显示下一跃点详细信息。

    例子:

    现在,您只有一个 DIP, 1.1.1.230 即拓扑中的 ToR SW2。这也应该存在于组播树中,因为此 ToR SW 在与我们正在跟踪的 VN (VNI=4) 相同的 VN 中也有一个端点(即 BMS2)。

这样就可以从一个 ToR 交换机完成所有级别的转发和跟踪 BUM 数据包,并复制到拓扑中的其他预期接收器。

这些组播树由TSN连接到的控制器编程。如果要检查控制器的内存以及最终在所有 TSN 计算上编程的内容,请使用控制器 IP 地址输入以下自检 URL: