SPAN 和 ERSPAN

Cumulus Linux 同时支持 SPANERSPAN

  • SPAN 镜像从接口(SPAN 源)传入或传出的所有数据包,并将数据包复制并传输到本地端口或 CPU(SPAN 目的地)以进行监控。SPAN 目的地端口也称为镜像到端口 (MTP)。原始数据包仍然被交换,而数据包的镜像副本则从 MTP 输出。

  • ERSPAN 将镜像的数据包发送到位于路由网络中任何位置的监控节点。交换机通过在其路由表中查找目的地 IP 地址来查找镜像数据包的传出端口。交换机使用 GRE 封装原始第 2 层数据包以进行 IP 交付。封装的数据包具有以下格式

     ----------------------------------------------------------
    | MAC_HEADER | IP_HEADER | GRE_HEADER | L2_Mirrored_Packet |
     ----------------------------------------------------------
    

SPAN

要配置 SPAN 以镜像交换机上的端口,您需要创建一个端口镜像会话。会话 ID 是介于 0 和 7 之间的数字。

您可以设置以下 SPAN 选项

  • 源端口
  • 目的地端口
  • 方向(入口或出口)

运行 nv set system port-mirror session <session-id> span <option> 命令。NVUE 命令将配置保存在 /etc/cumulus/switchd.d/port-mirror.conf 文件中。

为了减少数据量,您可以将镜像帧截断为指定的字节数。大小必须介于 4 到 4088 字节之间,并且是 4 的倍数。

命令示例

要镜像在 swp1 上接收的所有数据包,并将数据包复制并传输到 swp2 以进行监控

cumulus@switch:~$ nv set system port-mirror session 1 span direction ingress
cumulus@switch:~$ nv set system port-mirror session 1 span source-port swp1
cumulus@switch:~$ nv set system port-mirror session 1 span destination swp2
cumulus@switch:~$ nv config apply

要镜像从 swp1 输出的所有数据包,并将数据包复制并传输到 swp2 以进行监控

cumulus@switch:~$ nv set system port-mirror session 1 span direction egress
cumulus@switch:~$ nv set system port-mirror session 1 span source-port swp1
cumulus@switch:~$ nv set system port-mirror session 1 span destination swp2
cumulus@switch:~$ nv config apply

引用传出接口的 SPAN 会话根据路由决策之前的入口接口创建镜像数据包。例如,以上命令捕获最终注定要离开 swp1 的流量,但在数据包到达 swp2 时镜像数据包。数据包引用原始 VLAN 标记,并且源和目的地 MAC 地址在 swp2 最初接收数据包时传输。

要将来自所有端口的数据包镜像到 swp53

cumulus@switch:~$ nv set system port-mirror session 1 span direction ingress
cumulus@switch:~$ nv set system port-mirror session 1 span source-port swp1-54
cumulus@switch:~$ nv set system port-mirror session 1 span destination swp53
cumulus@switch:~$ nv config apply

要镜像在 bond1 上接收的所有数据包,并将数据包复制并传输到 swp53 以进行监控

cumulus@switch:~$ nv set system port-mirror session 1 span direction ingress
cumulus@switch:~$ nv set system port-mirror session 1 span source-port bond1
cumulus@switch:~$ nv set system port-mirror session 1 span destination swp53
cumulus@switch:~$ nv config apply

要将镜像帧截断为 40 字节

cumulus@switch:~$ nv set system port-mirror session 1 span truncate size 40
cumulus@switch:~$ nv config apply

删除 SPAN 会话

您可以使用 nv unset system port-mirror 命令删除所有 SPAN 会话。例如

cumulus@switch:~$ nv unset system port-mirror
cumulus@switch:~$ nv config apply

要删除特定的 SPAN 会话,请运行 nv unset system port-mirror session <session-id> 命令。例如

cumulus@switch:~$ nv unset system port-mirror session 1
cumulus@switch:~$ nv config apply

编辑 /etc/cumulus/switchd.d/port-mirror.conf 文件,然后加载配置。

以下示例配置镜像在 swp1 上接收的所有数据包,并将数据包复制并传输到 swp2 以进行监控

cumulus@switch:~$ sudo nano /etc/cumulus/switchd.d/port-mirror.conf
Copyright © 2021 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# This software product is a proprietary product of Nvidia Corporation and its affiliates
# (the "Company") and all right, title, and interest in and to the software
# product, including all associated intellectual property rights, are and
# shall remain exclusively with the Company.
#
# This software product is governed by the End User License Agreement
# provided with the software product.
#
# [session_n]
# session-id = n
# mirror.session.n.direction = (ingress | egress)
# mirror.session.n.src = <swpx, bond>
# mirror.session.n.dest = (swpx | <src-ip> <dst-ip>)
# mirror.session.n.type = (span | erspan | none)
#
# Default is all sessions off
# mirror.session.all.type = none
[session_1]
session-id = 1
mirror.session.1.direction = ingress
mirror.session.1.src = swp1
mirror.session.1.dest = swp2
mirror.session.1.type = span

运行以下命令以加载配置

cumulus@switch:~$ /usr/lib/cumulus/switchdctl --load /etc/cumulus/switchd.d/port-mirror.conf -prefix mirror

引用传出接口的 SPAN 会话根据路由决策之前的入口接口创建镜像数据包。例如,以下规则捕获最终注定要离开 swp1 的流量,但在数据包到达 swp49 时镜像数据包。该规则传输引用原始 VLAN 标记以及源和目的地 MAC 地址的数据包,这些标记和地址在 swp49 最初接收数据包时的时间点。

[session_1]
session-id = 1
mirror.session.1.direction = egress
mirror.session.1.src = swp1
mirror.session.1.dest = swp49
mirror.session.1.type = span
cumulus@switch:~$ /usr/lib/cumulus/switchdctl --load /etc/cumulus/switchd.d/port-mirror.conf -prefix mirror

使用 ACL 的选择性 SPAN

您可以配置带有 ACL 的选择性 SPAN,以根据以下内容镜像流量子集

  • 源或目的地 IP 地址
  • IP 协议
  • TCP 或 UDP 源或目的地端口
  • TCP 标志
  • 入口端口

要匹配具有源 IP 地址 10.10.1.1 的 swp1 入口流量,并在发生匹配时将流量镜像到 swp2

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 match ip source-ip 10.10.1.1
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 action span swp2
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound

要匹配在 swp1 上传入的 OSPF 数据包,并在发生匹配时将流量镜像到 swp2

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 match ip protocol ospf
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 action span swp2
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound

要匹配在 bond1 上传入的 UDP 数据包,并在发生匹配时将流量镜像到 swp53

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 match ip protocol udp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 action span swp53
cumulus@switch:~$ nv set interface bond1 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

  • 始终将规则文件放在 /etc/cumulus/acl/policy.d/ 目录中。
  • cl-acltool--out-interface 规则结合使用仅适用于传输流量;它不适用于源自交换机的流量。
  • --out-interface 规则不能以绑定接口为目标,只能以与其绑定的绑定成员为目标。例如,要将所有离开 bond1 的数据包镜像到 swp53,其中 bond1 成员为 swp1 和 swp2,请创建规则 -A FORWARD --out-interface swp1,swp2 -j SPAN --dport swp53

  1. /etc/cumulus/acl/policy.d/ 目录中创建一个规则文件。以下示例规则将入口 swp1 的 ICMP 数据包镜像到 swp54,并将出口 swp4 的 UDP 数据包镜像到 swp53

    cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/span.rules
    [iptables]
    -A FORWARD --in-interface swp1 -p icmp -j SPAN --dport swp54
    -A FORWARD --out-interface swp4 -p udp -j SPAN --dport swp53
    
  2. 安装规则

    cumulus@switch:~$ sudo cl-acltool -i
    

请勿使用 -P 选项运行 cl-acltool -i 命令。-P 选项会删除所有现有的控制层面规则或其他已安装的规则,并且仅安装指定文件中定义的规则。

  1. 验证您是否已安装 SPAN 规则

    cumulus@switch:~$ sudo cl-acltool -L all | grep SPAN
    38025 7034K SPAN       icmp --  swp1   any     anywhere             anywhere             dport:swp54
    50832   55M SPAN       udp  --  any    swp4    anywhere             anywhere             dport:swp53
    

规则示例

要将来自所有端口的、匹配源 IP 地址 20.0.1.0 和目的地 IP 地址 20.0.1.2 的转发数据包镜像到端口 swp1

-A FORWARD --in-interface swp+ -s 20.0.0.2 -d 20.0.1.2 -j SPAN --dport swp1

要将来自所有端口的 ICMP 数据包镜像到 swp1

-A FORWARD --in-interface swp+ -s 20.0.0.2 -p icmp -j SPAN --dport swp1

要镜像从端口 swp1 接收的、朝向目的地 IP 地址 20.0.1.2 和目的地端口 53 的转发 UDP 数据包

-A FORWARD --in-interface swp1 -d 20.0.1.2 -p udp --dport 53 -j SPAN --dport swp1

要镜像所有仅设置了 SYN 的转发 TCP 数据包

-A FORWARD --in-interface swp+ -p tcp --tcp-flags ALL SYN -j SPAN --dport swp1

要镜像所有仅设置了 FIN 的转发 TCP 数据包

-A FORWARD --in-interface swp+ -p tcp --tcp-flags ALL FIN -j SPAN --dport swp1

将 CPU 端口用作 SPAN 目的地

您可以将 CPU 端口设置为 SPAN 目的地接口,以将数据层面流量镜像到 CPU。SPAN 流量将转到单独的网络接口镜像,您可以使用 tcpdump 在其中对其进行分析。如果您在交换机上没有任何空闲的外部端口用于监控,这是一个有用的功能。SPAN 流量不会出现在交换机端口上。

Cumulus Linux 控制到达 CPU 的流量量,以便镜像流量不会使 CPU 过载。

您可以使用 ACL 将 CPU 端口配置为 SPAN 目的地。

要监控镜像到 CPU 的流量,请运行 tcpcdump -i mirror 命令。

  • Cumulus Linux 不支持控制层面生成流量到 CPU 端口的出口镜像。
  • 当您将 CPU 端口设置为 SPAN 目的地接口时,Cumulus Linux 会将与规则匹配的数据包在入口和出口只镜像一次到目的地接口。

要匹配具有源 IP 地址 10.10.1.1 的 swp1 入口流量,并在发生匹配时将流量镜像到 CPU

cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 action span cpu
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 match ip source-ip 10.10.1.1
cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

要匹配具有源 IP 地址 10.10.1.1 的 swp1 出口流量,并在发生匹配时将流量镜像到 CPU

cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 action span cpu
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 match ip source-ip 10.10.1.1
cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 outbound
cumulus@switch:~$ nv config apply
  1. /etc/cumulus/acl/policy.d/ 目录中创建一个文件并添加规则。

    要匹配具有源 IP 地址 10.10.1.1 的 swp1 入口流量,并在发生匹配时将流量镜像到 CPU

    cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/span-cpu.rules
    [iptables]
      -A FORWARD -i swp1 -s 10.10.1.1 -j SPAN --dport cpu
    

    要匹配具有源 IP 地址 10.10.1.1 的 swp1 出口流量,并在发生匹配时将流量镜像到 CPU

    -A FORWARD -o swp1 -s 10.10.1.1 -j SPAN --dport cpu
    
  2. 安装规则

    cumulus@switch:~$ sudo cl-acltool -i
    

请勿使用 -P 选项运行 cl-acltool -i 命令。-P 选项会删除所有现有的控制层面规则或其他已安装的规则,并且仅安装指定文件中定义的规则。

ERSPAN

要配置 ERSPAN 以镜像交换机上的端口,您需要创建一个端口镜像会话。会话 ID 是介于 0 和 7 之间的数字。

您可以设置以下 ERSPAN 选项

  • 源端口
  • 方向(入口或出口)
  • 用于 ERSPAN 封装的源 IP 地址
  • 用于 ERSPAN 封装的目的地 IP 地址

运行 nv set system port-mirror session <session-id> erspan <option> 命令。NVUE 命令将配置保存在 /etc/cumulus/switchd.d/port-mirror.conf 文件中。

为了减少数据量,您可以将镜像帧截断为指定的字节数。大小必须介于 4 到 4088 字节之间,并且是 4 的倍数。

命令示例

以下示例配置从源 IP 地址 10.10.10.1 到目的地 IP 地址 10.10.10.234 的 ERSPAN 封装。

要镜像所有到达 swp1 的数据包

cumulus@switch:~$ nv set system port-mirror session 1 erspan direction ingress
cumulus@switch:~$ nv set system port-mirror session 1 erspan source-port swp1
cumulus@switch:~$ nv set system port-mirror session 1 erspan destination source-ip 10.10.10.1
cumulus@switch:~$ nv set system port-mirror session 1 erspan destination dest-ip 10.10.10.234
cumulus@switch:~$ nv config apply

要镜像所有从 swp1 输出的数据包

cumulus@switch:~$ nv set system port-mirror session 1 erspan direction egress
cumulus@switch:~$ nv set system port-mirror session 1 erspan source-port swp1
cumulus@switch:~$ nv set system port-mirror session 1 erspan destination source-ip 10.10.10.1
cumulus@switch:~$ nv set system port-mirror session 1 erspan destination dest-ip 10.10.10.234
cumulus@switch:~$ nv config apply

删除 ERSPAN 会话

您可以使用 nv unset system port-mirror 命令删除所有 ERSPAN 会话。例如

cumulus@switch:~$ nv unset system port-mirror
cumulus@switch:~$ nv config apply

要删除特定的 ERSPAN 会话,请运行 nv unset system port-mirror session <session-id> 命令。例如

cumulus@switch:~$ nv unset system port-mirror session 1
cumulus@switch:~$ nv config apply

编辑 /etc/cumulus/switchd.d/port-mirror.conf 文件,然后加载配置。

以下示例 ERSPAN 配置镜像在 swp1 上接收的所有数据包

cumulus@switch:~$ sudo nano /etc/cumulus/switchd.d/port-mirror.conf
Copyright © 2021 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# This software product is a proprietary product of Nvidia Corporation and its affiliates
# (the "Company") and all right, title, and interest in and to the software
# product, including all associated intellectual property rights, are and
# shall remain exclusively with the Company.
#
# This software product is governed by the End User License Agreement
# provided with the software product.
#
# [session_n]
# session-id = n
# mirror.session.n.direction = (ingress | egress)
# mirror.session.n.src = <swpx, bond>
# mirror.session.n.dest = (swpx | <src-ip> <dst-ip>)
# mirror.session.n.type = (span | erspan | none)
#
# Default is all sessions off
# mirror.session.all.type = none
[session_1]
session-id = 1
mirror.session.1.direction = ingress
mirror.session.1.src = swp1
mirror.session.1.dest = 10.10.10.1 10.10.10.234
mirror.session.1.type = erspan

运行以下命令以加载配置

cumulus@switch:~$ /usr/lib/cumulus/switchdctl --load /etc/cumulus/switchd.d/port-mirror.conf -prefix mirror

  • 如果您使用 Wireshark 查看 ERSPAN 输出,您可能会看到 Wireshark 错误消息 Unknown version, please report or test to use fake ERSPAN preference,并且跟踪可能无法读取。要解决此问题,请转到 Wireshark 常规首选项中的协议 \ ERSPAN,然后选中强制解码伪造的 ERSPAN 帧选项。
  • 要在目的地交换机上设置 捕获过滤器,以过滤特定的 IP 协议,请使用 ip.proto == 47 来过滤 GRE 封装(IP 协议 47)的流量。

使用 ACL 的选择性 ERSPAN

您可以配置带有 ACL 的选择性 ERSPAN,以根据以下内容镜像流量子集

  • 源或目的地 IP 地址
  • IP 协议
  • TCP 或 UDP 源或目的地端口
  • TCP 标志
  • 入口端口

以下命令镜像来自所有 swp 接口的入站 ICMP 数据包。用于 ERSPAN 封装的源 IP 地址为 10.10.10.1,用于 ERSPAN 封装的目的地 IP 地址为 10.10.10.234。

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 match ip protocol icmp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 action erspan source-ip 10.10.10.1
cumulus@switch:~$ nv set acl EXAMPLE1 rule 1 action erspan dest-ip 10.10.10.234
cumulus@switch:~$ nv set interface swp1-54 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply
  1. /etc/cumulus/acl/policy.d/ 中创建一个规则文件。以下规则为所有入口 swp1 的 ICMP 数据包配置 ERSPAN。用于 ERSPAN 封装的源 IP 地址为 10.10.10.1,用于 ERSPAN 封装的目的地 IP 地址为 10.10.10.234。

    cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/erspan.rules
    [iptables]
    -A FORWARD --in-interface swp1 -p icmp -j ERSPAN --src-ip 10.10.10.1 --dst-ip 10.10.10.234
    

    src-ip 可以是任何 IP 地址,即使该 IP 地址在路由表中不存在也是如此。

    dst-ip 必须是通过路由表和前面板端口(而非管理端口)或 SVI 可访问的 IP 地址。使用 ping 或 ip route get来验证目的地 IP 地址是否可访问。

  2. 安装规则

    cumulus@switch:~$ sudo cl-acltool -i
    

请勿使用 -P 选项运行 cl-acltool -i 命令。-P 选项会删除所有现有的控制层面规则或其他已安装的规则,并且仅安装指定文件中定义的规则。

  1. 验证您是否已安装 ERSPAN 规则

    cumulus@switch:~$ sudo iptables -L -v | grep ERSPAN
    29     0 ERSPAN     icmp --  swp1   any     anywhere             anywhere             ERSPAN src-ip:10.10.10.1 dst-ip:10.10.10.234
    

规则示例

在以下示例规则中,用于 ERSPAN 封装的源 IP 地址为 10.10.10.1,用于 ERSPAN 封装的目的地 IP 地址为 10.10.10.234。

要镜像来自所有端口的、匹配源 IP 地址 20.0.0.2 和目的地 IP 地址 20.0.1.2 的转发数据包

-A FORWARD --in-interface swp+ -s 20.0.0.2 -d 20.0.1.2 -j ERSPAN --src-ip 10.10.10.1 --dst-ip 10.10.10.234

要镜像来自所有端口的 ICMP 数据包

-A FORWARD --in-interface swp+ -p icmp -j ERSPAN --src-ip 10.10.10.1 --dst-ip 10.10.10.234

要镜像目的地端口为 53 且在 swp1 上到达的转发 UDP 数据包

-A FORWARD --in-interface swp1 -p udp --dport 53 -j ERSPAN --src-ip 10.10.10.1 --dest-ip 10.10.10.234

要镜像所有仅设置了 SYN 的转发 TCP 数据包

-A FORWARD --in-interface swp+ -p tcp --tcp-flags ALL SYN -j ERSPAN --src-ip 10.10.10.1 --dst-ip 10.10.10.234

要镜像所有仅设置了 FIN 的转发 TCP 数据包

-A FORWARD --in-interface swp+ -p tcp --tcp-flags ALL FIN -j ERSPAN --src-ip 10.10.10.1 --dst-ip 10.10.10.234

显示 SPAN 和 ERSPAN 配置

要显示特定会话的 SPAN 和 ERSPAN 配置,请运行 NVUE nv show system port-mirror session <session-id> 命令。要显示所有会话的 SPAN 和 ERSPAN 配置,请运行 NVUE nv show system port-mirror 命令。

cumulus@switch:~$ nv show system port-mirror session 1
                 operational  applied  pending
---------------  -----------  -------  -------
erspan                                        
  enable                               off    
span                                          
  enable                               on     
  direction                            ingress
  [destination]                               
  [source-port]                        swp1   
  truncate                                    
    enable                             off  

您还可以运行 sudo cl-acltool -L all | grep SPANsudo cl-acltool -L all | grep ERSPAN 命令。

cumulus@switch:~$ sudo cl-acltool -L all | grep SPAN
    0     0 SPAN       all  --  any    swp1    10.10.10.1    anywhere    /* rule_id:1,acl_name:EXAMPLE1,dir:outbound,interface_id:swp1 */ dport:cpu

限制

  • 在具有 Spectrum-2 ASIC 或更高版本的交换机上,Cumulus Linux 在原子模式下支持四个 SPAN 目的地,或者在非原子模式下支持八个 SPAN 目的地。在具有 Spectrum 1 ASIC 的交换机上,Cumulus Linux 在原子模式下仅支持单个 SPAN 目的地,或者在非原子模式下支持三个 SPAN 目的地。
  • WJH 缓冲区丢弃监控使用 SPAN 目的地;如果您配置了刚刚发生了什么 (WJH),请确保您没有超过交换机 ASIC 类型允许的 SPAN 目的地总数。
  • 多个 SPAN 源可以指向同一个 SPAN 目的地,但一个 SPAN 源不能指定两个 SPAN 目的地。
  • Cumulus Linux 不支持 IPv6 ERSPAN 目的地。
  • 您不能使用 eth0 作为目的地。
  • 您无法镜像出口绑定接口(例如 bond1)的数据包;您只能镜像出口绑定成员(例如 swp1、swp2 等)的数据包。
  • 不保证镜像流量。拥塞的 MTP 会导致丢弃镜像数据包。
  • 过度订阅的 SPAN 和 ERSPAN 目的地接口可能会导致数据层面缓冲区耗尽和缓冲区丢弃。当所有源端口的聚合速度超过目的地端口时,启用 SPAN 和 ERSPAN 时请谨慎。
  • ERSPAN 不会导致内核发送 ARP 请求来解析 ERSPAN 目的地的下一跳。如果目的地或下一跳的 ARP 条目在内核中尚不存在,您需要在发送镜像流量之前手动解析此条目(使用 pingarping)。
  • 镜像到您正在监控的同一接口会导致流量的递归洪泛,并可能影响其他接口上的流量。
  • Cumulus VX 不支持基于 ACL 的 SPAN、ERSPAN 或端口镜像。要在 Cumulus VX 中捕获数据包,请使用 tcpdump 命令行网络流量分析器。
  • 当您使用 NVUE nv set system port-mirror 命令配置 ERSPAN 会话时,目的地 IP 地址必须可通过默认 VRF 从源 IP 地址访问。