如何捕获 Cisco IOS 交换机上的流量?

网络工程 思科 监控 思科-ios 线鲨
2021-07-09 13:58:14

为了调查客户端到服务器通信中的问题,我需要捕获数据包进行分析。但是,不允许在客户端或服务器上安装数据包分析器,例如 Wireshark 或 tcpdump。他们的客户端连接到 Catalyst 3560,服务器连接到 Catalyst 3750 交换机。

我可以将我的笔记本电脑插入交换机端口以使用我的笔记本电脑的数据包分析器捕获流量吗?如何?

4个回答

可以监控客户端交换机端口或服务器交换机端口。第三个交换机端口可以配置为镜像端口这意味着该镜像端口将接收对应原始端口上的所有数据包的副本,而原始流量不会受到影响。

例如,在 Catalyst 3560 上:

  1. 进入配置模式:

    conf t
    
  2. 定义源并设置会话号:

    monitor session 1 source interface fa 0/24
    

    在这里,会话编号可以是 1 到 66,您也可以指定 VLAN 或以太网通道。此外,如果您想同时监视多个客户端,则可以使用fa 0/25 - 26诸如可能的接口范围和诸如 的接口列表fa 0/24,fa 0/26此外,通过重复该命令,您可以添加端口,或使用no. 不能在同一个会话中混合端口和 VLAN,另一个限制是您不能将目标端口用作源端口。

  3. 定义目的端口:

    monitor session 1 destination interface gi 0/1
    

    您可以使用普通端口,但不能使用 VLAN。与上面类似,目标端口不能是源端口:这里使用的端口可以是源端口或目标端口,并且只能是一个会话。同样,您可以像上面一样指定多个端口。

  4. 您可能想要exit配置模式并保存配置。

  5. 你可以看看你定义的会话 - 这里有多个端口,像上面一样尝试:

    #show monitor session 1
    Session 1
    ---------
    Type                   : Local Session
    Source Ports           :
        Both               : Fa0/24,Fa0/25-26
    Destination Ports      : Fa0/48,Gi0/1
        Encapsulation      : Native
              Ingress      : Disabled
    

    您可以在此处看到一个封装 - 您可以选择将其设置为replicate用于复制源接口封装方法,例如encapsulation replicate在源接口之后添加此外,您可以指定方向 ( txrxboth)、过滤 VLAN 等。Ingress: Disabled行表示交换机将不接受您的捕获设备在目标端口上提供给它的任何帧。有关此类更详细的信息以及进一步的限制和默认设置,请查看交换机 IOS 版本的命令参考。

配置源端口和目标端口后,您可以使用连接到目标端口的笔记本电脑捕获流量,例如使用 Wireshark。

可以限制源会话的数量,例如3560最多支持2个。

捕获后,不要忘记删除此会话配置。

如果您的流量碰巧通过运行 Cisco IOS 12.4(20)T 或更高版本的路由器,另一种可能是使用嵌入式数据包捕获功能。

此功能在 3560 或 3750 等交换机平台上不可用。

此功能的作用是在路由器上捕获并保存一个小的 PCAP 文件,您可以使用 Wireshark 下载和分析该文件。

一个 环节细节

我想在混合物中添加 ELAM。PFC3(6500、7600)支持 ELAM。

您需要启用“内部服务”,但它运行起来非常安全,我已经在生产网络中运行了很多,并且还没有遇到过负面影响。

本质上,ELAM 的作用是向您展示通过 DBUS(数据总线)发送给 PFC 进行查找处理的内容,以及 PFC 在 RBUS(结果总线)中给出的查找结果是什么。

  1. 显示 plat cap elam asic 超人插槽 DFC/PFC_SLOT_YOU_WANT_TO_LOOK
  2. 如果 ip_sa=192.0.2.1,则显示 plat cap elam 触发 dbus ipv4
  3. 显示 plat cap elam 开始
  4. 显示 plat cap elam 数据

对于触发器,有在线帮助,IP_SA == IP 源地址,IP_DA == IP 目标地址,还有很多其他可用的。如果您要检查的内容不可用,您可以对第一个 64B 上的任意数据进行数据 + 掩码匹配。
任意触发器有点笨拙,但可以更安全,您将像这样使用它:

如果数据 = DATA1 DATA2 DATAn [MASK1 MASK2 MASKn],则显示平台捕获 elam 触发 dbus 其他

数据从 DMAC 开始。因此,假设我们想要捕获 [0 1951] 的传入 MPLS 堆栈,但我们不关心 MAC 地址,我们可以这样做:

如果数据 = 0 0 0 0x88470000 0x00000079 0xF0000000 [ 0 0 0 0xffffffff 0xf000ffff 0xf0000000 ],则显示平台捕获 elam 触发 dbus 其他


示例输出可能是:

7600#show platform capture elam data
DBUS data:
SEQ_NUM                          [5] = 0x1D
QOS                              [3] = 1
QOS_TYPE                         [1] = 0
TYPE                             [4] = 0 [ETHERNET]
STATUS_BPDU                      [1] = 0
IPO                              [1] = 1
NO_ESTBLS                        [1] = 0
RBH                              [3] = b000   ! port-channel hash
CR                               [1] = 1      ! recirculated
TRUSTED                          [1] = 1
NOTIFY_IL                        [1] = 0
NOTIFY_NL                        [1] = 0
DISABLE_NL                       [1] = 0
DISABLE_IL                       [1] = 0
DONT_FWD                         [1] = 0
INDEX_DIRECT                     [1] = 0
DONT_LEARN                       [1] = 0
COND_LEARN                       [1] = 0
BUNDLE_BYPASS                    [1] = 0
QOS_TIC                          [1] = 1
INBAND                           [1] = 0
IGNORE_QOSO                      [1] = 0
IGNORE_QOSI                      [1] = 0
IGNORE_ACLO                      [1] = 0
IGNORE_ACLI                      [1] = 0
PORT_QOS                         [1] = 0
CACHE_CNTRL                      [2] = 0 [NORMAL]
VLAN                             [12] = 4086
SRC_FLOOD                        [1] = 0
SRC_INDEX                        [19] = 0xC0          ! divmod64(0xc0) = 3,0, add 1 to each, 4/1 == our physical port
LEN                              [16] = 102
FORMAT                           [2] = 0 [IP]
MPLS_EXP                         [3] = 0x0
REC                              [1] = 0
NO_STATS                         [1] = 0
VPN_INDEX                        [10] = 0x7F
PACKET_TYPE                      [3] = 0 [ETHERNET]
L3_PROTOCOL                      [4] = 0 [IPV4]
L3_PT                            [8] = 1 [ICMP]
MPLS_TTL                         [8] = 0
SRC_XTAG                         [4] = 0xF
DEST_XTAG                        [4] = 0xA
FF                               [1] = 0
MN                               [1] = 0
RF                               [1] = 1
SC                               [1] = 0
CARD_TYPE                        [4] = 0x0
DMAC                             = 8843.e1de.22c0
SMAC                             = 0000.0000.0000
IPVER                            [1] = 0 [IPV4]
IP_DF                            [1] = 1
IP_MF                            [1] = 0
IP_HDR_LEN                       [4] = 5
IP_TOS                           [8] = 0x0
IP_LEN                           [16] = 84
IP_HDR_VALID                     [1] = 1
IP_CHKSUM_VALID                  [1] = 1
IP_L4HDR_VALID                   [1] = 1
IP_OFFSET                        [13] = 0
IP_TTL                           [8] = 63
IP_CHKSUM                        [16] = 0xBCF1
IP_SA                            = x.x.x       ! to protect the guilty
IP_DA                            = y.y.y.y     ! to protect the guilty
ICMP_TYPE                        [8] = 0x8
ICMP_CODE                        [8] = 0x0
ICMP_DATA [104]
0000:  A0 8B 18 A5 00 39 46 35 BF 51 00 6F 3C            ".....9F5.Q.o<"
CRC                              [16] = 0x71B3

RBUS data:
SEQ_NUM                          [5] = 0x1D
CCC                              [3] = b100 [L3_RW]  ! normal L3_RW, we know it was not dropped, L2/mls policed etc
CAP1                             [1] = 0
CAP2                             [1] = 0
QOS                              [3] = 0
EGRESS                           [1] = 0
DT                               [1] = 0 [IP]
TL                               [1] = 0 [B32]
FLOOD                            [1] = 1
DEST_INDEX                       [19] = 0x3E8    ! same as VLAN, but not always    
VLAN                             [12] = 1000     ! you may need to check internal vlan     
RBH                              [3] = b111      ! again, port-channel hash
RDT                              [1] = 0
GENERIC                          [1] = 0
EXTRA_CICLE                      [1] = 0
FABRIC_PRIO                      [1] = 0
L2                               [1] = 0
FCS1                             [8] = 0x1
IP_TOS_VALID                     [1] = 1
IP_TOS_OFS                       [7] = 15
IP_TOS                           [8] = 0x0
IP_TTL_VALID                     [1] = 1
IP_TTL_OFS                       [7] = 22
IP_TTL                           [8] = 62
IP_CSUM_VALID                    [1] = 1
IP_CSUM_OFS                      [7] = 24
IP_CSUM                          [16] = 0xBDF1
DELTA_LEN                        [8] = 0
REWRITE_INFO
 i0  - replace bytes from ofs 0 to ofs 11 with seq 'D0 D0 FD 09 34 2D 88 43 E1 DE 22 C0'.   ! this is the actual L2 rewrite data, so you should obviously see DMAC and SMAC here 
FCS2                             [8] = 0x0
7600#

几乎所有较大的平台都有这种类型的传输数据包的低级别捕获,当您需要验证硬件是否按照配置执行操作时,这非常有用,有时存在软件缺陷并且它会做一些超出预期的事情。
我知道在 GSR 中您可以看到内存中的传输,在 Juniper Trio 中也有非常好的工具。博科可以做到。令人困惑的是,它们没有记录在供应商页面中。

我在 serverfault 上问了一些类似的问题,答案可能在这里有用。

Cisco IOS 调试命令和数据包监控

排除第 3 层的以太网(第 2 层)故障