SPAN 和 ERSPAN
Cumulus Linux 同时支持 SPAN 和 ERSPAN。
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
。
在
/etc/cumulus/acl/policy.d/
目录中创建一个规则文件。以下示例规则将入口 swp1 的 ICMP 数据包镜像到 swp54,并将出口 swp4 的 UDP 数据包镜像到 swp53cumulus@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
安装规则
cumulus@switch:~$ sudo cl-acltool -i
请勿使用 -P
选项运行 cl-acltool -i
命令。-P
选项会删除所有现有的控制层面规则或其他已安装的规则,并且仅安装指定文件中定义的规则。
验证您是否已安装 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
在
/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
安装规则
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
使用 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
在
/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 地址是否可访问。 安装规则
cumulus@switch:~$ sudo cl-acltool -i
请勿使用 -P
选项运行 cl-acltool -i
命令。-P
选项会删除所有现有的控制层面规则或其他已安装的规则,并且仅安装指定文件中定义的规则。
验证您是否已安装 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 SPAN
或 sudo 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 条目在内核中尚不存在,您需要在发送镜像流量之前手动解析此条目(使用
ping
或arping
)。 - 镜像到您正在监控的同一接口会导致流量的递归洪泛,并可能影响其他接口上的流量。
- Cumulus VX 不支持基于 ACL 的 SPAN、ERSPAN 或端口镜像。要在 Cumulus VX 中捕获数据包,请使用
tcpdump
命令行网络流量分析器。 - 当您使用 NVUE
nv set system port-mirror
命令配置 ERSPAN 会话时,目的地 IP 地址必须可通过默认 VRF 从源 IP 地址访问。