【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

目录

一、抓包命令

ibdump 抓包命令

tcpdump抓包命令

二、RDMA抓包

1.ibdump

2.tcpdump (docker,Linux内核从4.9以上)

3.Offloaded Traffic Sniffer(tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

数据收发测试工具:

三、抓包结果文件拆分

        边抓包边切割

        切割已经爪完成的包

四、抓包结果分析

RDMA抓包


诊断工具--翻译中

RDMA抓包

ibdump

tcpdump (docker,Linux内核从4.9以上)

Offloaded Traffic Sniffer(tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

未整理工具


作者:bandaoyu,原始连接:https://blog.csdn.net/bandaoyu/article/details/115791233

一、抓包命令

ibdump 抓包命令

[root @ rdma64 ibdump-master]#ibdump -h
   ibdump-dump Mellanox Technologies ConnectX 网卡的 Infiniband 数据包
                可以生成文件给Wireshark进行图形流量分析

用法:
  ibdump [选项]

选项:
  -d,--ib-dev = <dev>使用IB设备<dev>(找到默认的第一个设备)
  -i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
  -w,-write = <文件>  结果保存到文件(默认为“ sniffer.pcap”)
                         “-”代表标准输出-启用管道传输到tcpdump或tshark。
  -o,--output = <文件>是-w选项的别名。不使用-为了向后兼容
  -b,--max-burst = <log2突发> log2的最大突发大小
                               捕获而没有数据包丢失。
                               每个条目占用〜MTU字节的内存(默认12-4096个条目)
  -s,-silent不打印进度指示。
  -T,--conti使用连续页面。
  -M,--mem-mode <大小>(指定时),仅在抓包动作停止后才将包写入文件,它比默认模式快(丢包更少)
                         ,但占用更多内存。在这种模式下,ibdump在捕获<size>个字节后停止
  -p,--writer-thread <大小>使用特定线程将数据写入磁盘。为了使用此功能,您必须指定
                               两个临时缓冲区的大小,用于保存数据给线程写入磁盘

  --decap  解封装端口镜像的headers。用于捕获RSPAN流量时需要启用。
  -h,--help显示此帮助屏幕。
  -v,--version打印版本信息。

用法:Mellanox Interconnect Communityhttps://community.mellanox.com/s/article/MLNX2-117-2647kn

[root@tuki1 ~]#  ibdump -d mlx5_0 -i 1

tcpdump抓包命令

简介:tcpdump是一个可以根据需求来抓取网络上传输的数据包的工具

常用的命令选项有:

-c:设定抓取的数量

-i:指定监听的网口

-w:将抓取的数据包保存到文件

-s:截取报文的内容,默认截取96字节,-s0表示截取全部

-r:读取数据包内容

-C 10: 每10M保存一个包

-G 600:每10分钟保存一个包

过滤的参数规则:

host:指定主机名

net:指定网段

port:指定端口

portrange:指定端口范围

连接运算符

and:所有的条件都满足

or:只要满足一个条件

not:取反,也可以用!

例子:

1、抓取主机172.0.0.1的eth0网口的8080、8081端口传输的数据包并保存文件

tcpdump -i eth0 -s0  port 8080 or port 8081 host 172.0.0.1 -w 1.pcap

2、按 crtl+c 停止抓包,当前目录会生成一个1.pcap文件

3、简单查看数据包内容

tcpdump -r 1..pcap

注:一般对抓取的数据包用Wireshark工具进行分析

二、RDMA抓包

有三种方法。(抓包:sniffer packet、Packet capture)

1.ibdump

嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。

例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.

  • 编译

Mellanox   github: https://github.com/Mellanox/ibdump

编译报错:ibdump.c:890:30: 错误:‘IBV_FLOW_ATTR_SNIFFER’未声明(在此函数内第一次使用)

则在文件:vim ibdump.c  添加:

#if !defined(IBV_FLOW_ATTR_SNIFFER)
#define IBV_FLOW_ATTR_SNIFFER   3
#endif
具体含义见:https://man7.org/linux/man-pages/man3/ibv_create_flow.3.html

执行:

make WITHOUT_FW_TOOLS=yes
  • 用法

启用步骤:

1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件:
options mlx4_core log_num_mgm_entry_size = -1:

(实际mlnx.conf提示:

Please don't edit this file. Create a new file under
# /etc/modprobe.d/ for your configurations.
所以在/etc/modprobe.d/下创建:

mlx5.conf #根据主机上的实际ib名称创建

options mlx4_core log_num_mgm_entry_size = -1:
options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句

2.重新启动驱动程序。

重启网络接口ib0

ifdown ib0
ifup ib0

注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。
 

Mellanox 社区--https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

服务端:
ib_write_bw -d mlx5_1  #监听mlx5_1 网卡

#客户端
ib_write_bw  182.205.31.53  --report_gbits -F

抓包:
 ibdump -d mlx5_1 -i 1
 ibdump -d mlx5_1 -i 1  -w  msg.acp #抓包并写入msg.acp 

 -d,--ib-dev = <dev>使用IB设备<dev>(找到默认的第一个设备)
  -i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
  -w,-write = <文件>  结果保存到文件(默认为“ sniffer.pcap”)
                         “-”代表标准输出-启用管道传输到tcpdump或tshark。

(更多参数说明见本文后面)

测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954

2.tcpdump (docker,Linux内核从4.9以上)

最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma

(查看内核版本命令:uname -r、uname -a、lsb_release -a)
但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。

使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。

使用方法:

1、拉取容器:
docker pull mellanox / tcpdump-rdma

2、启动容器
docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces --net=host --privileged

现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)

3、保存捕获结果到文件

tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap 

这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。

-s:截取报文的内容,默认截取96字节,-s0表示截取全部

-i:指定监听的网口

(更多参数说明见本文后面)

3.Offloaded Traffic Sniffer(tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer

ConnectX®-4更高版本的网卡中受支持

Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获

使能Offloaded  Traffic Sniffer:

  1. Turn on the new ethtool private flags "sniffer" (off by default). 

    $ ethtool --set-priv-flags enp130s0f0 sniffer on

  2. 在要监听的以太网接口上设置sniffer 标志后,运行tcpdump捕获该接口上的bypass kernel 流量。

注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。

有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:

(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool--connectx-4-x

一、前提条件

设置
注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/
在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。

查看tcpdump和libpcap版本

[root@rdma63 dscp]# tcpdump --help
tcpdump version 4.9.2
libpcap version 1.5.3

配置

  • 链路层:以太网
  • 流量:RoCE

二、执行过程


1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。

2.使用ethtool启用嗅探器。


在此示例中,网卡名称为ens785f0:
# ethtool --set-priv-flags ens785f0 sniffer on

注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。


3.运行tcpdump等待数据包

对于低于5.1的MLNX_OFED版本,请运行:
#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap

对于MLNX_OFED v5.1及更高版本,运行:
#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap

测试完成后,在wireshark中打开文件。
请参阅tcpdump主页(tcpdump(8):https://linux.die.net/man/8/tcpdump)以查看更多示例。

4. 验证RDMA抓包效果(Run RDMA traffic):

在一个服务器上运行

# ib_send_bw

************************************
* Waiting for client to connect... *
************************************

在另外一个服务器上运行:

# ib_send_bw  192.168.5.232  --report_gbits -F

---------------------------------------------------------------------------------------
Send BW Test
Dual-port : OFF Device : mlx5_1
Number of qps : 1 Transport type : IB
Connection type : RC Using SRQ : OFF

TX depth : 128
CQ Moderation : 100
Mtu : 4096[B]
Link type : Ethernet
Gid index : 0
Max inline data : 0[B]
rdma_cm QPs : OFF
Data ex. method : Ethernet

---------------------------------------------------------------------------------------
local address: LID 0000 QPN 0x01ae PSN 0x31a206
GID: 00:00:00:00:00:00:00:00:00:00:255:255:12:12:12:06
remote address: LID 0000 QPN 0x020a PSN 0xa2824e
GID: 00:00:00:00:00:00:00:00:00:00:255:255:12:12:12:05
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps]
65536 1000 95.16 95.16 0.181502
---------------------------------------------------------------------------------------

5.检查输出文件。
在此示例中,UDP端口4791用于RoCEv2通信。

# cat ~/rdma_traffic.txt

...

14:48:23.007280 IP (tos 0x0, ttl 64, id 5066, offset 0, flags [DF], proto UDP (17), length 308)
1.1.6.2.49153 > 1.1.5.2.4791: [no cksum] UDP, length 280
0x0000: 248a 0780 5401 e41d 2df2 a45c 8100 0006 $...T...-..\....
0x0010: 0800 4500 0134 13ca 4000 4011 18ea 0101 ..E..4..@.@.....
0x0020: 0602 0101 0502 c001 12b7 0120 0000 6440 ..............d@
0x0030: ffff 0000 0001 0000 002a 8001 0000 0000 .........*......
0x0040: 0001 0107 0203 0000 0000 0000 0011 7a2f ..............z/
0x0050: ac19 0010 0000 0000 0000 19ac 2f7a 0000 ............/z..
0x0060: 0000 0000 0000 0106 4853 e41d 2d03 00f2 ........HS..-...
0x0070: a45c 0000 0000 0000 0000 0001 a400 0000 .\..............
0x0080: 0000 0000 00b0 28a5 38b7 ffff 37f0 ffff ......(.8...7...
0x0090: ffff 0000 0000 0000 0000 0000 ffff 0101 ................
0x00a0: 0602 0000 0000 0000 0000 0000 ffff 0101 ................
0x00b0: 0502 0000 0007 0040 0098 0000 0000 0000 .......@........
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00e0: 0000 0000 0000 0040 b1ee 0000 0000 0000 .......@........
0x00f0: 0000 0000 0000 0101 0602 0000 0000 0000 ................
0x0100: 0000 0000 0000 0101 0502 0000 0000 0000 ................
0x0110: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0130: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0140: 0000 5870 f2dd ..Xp..

如果您将文件保存给Wireshark,则会收到以下消息:
“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”

IROCE 工具

https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

ib_send_bw/ib_write_bw

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 -vv

测试SEND模式

在一个服务器上运行
# ib_send_bw

在另外一个服务器上运行:
# ib_send_bw  192.168.5.232  --report_gbits -F


测试WRITE模式

在一个服务器上运行
# ib_write_bw

在另外一个服务器上运行:
# ib_write_bw  192.168.5.232  --report_gbits -F

--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,
tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,
tos=1000000、1000001、1000010、1000011,即64

实战

  1. 使能Offloaded  Traffic Sniffer:

 [root@rdma63 tcpdump]# ifconfig  找到两张IB网卡

ib18-0: 192.169.31.53
ib3b-0: 172.17.31.53

  

为方便,将两个网卡都使能

$ ethtool --set-priv-flags ib18-0 sniffer on
$ ethtool --set-priv-flags ib3b-0 sniffer on

  1. 运行监听工具tcpdump

我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp  消息。

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 -vv

  1. 运行server和client

查询IB卡与网口对应关系:

[root@rdma63 dscp]# ibdev2netdev

mlx5_0 port 1 ==> ib18-0 (Up)
mlx5_1 port 1 ==> ib3b-0 (Up)

我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以
53(172.17.31.53)上运行server:

ib_write_bw -d mlx5_1 
54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53):
ib_write_bw 172.17.31.53

用ibdump监听:
./ibdump -d mlx5_1


服务端:
ib_send_bw -d mlx5_1   --rdma_cm

客户端:
ib_send_bw 172.17.31.53 --tos=0x04 –R


--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,
tos=10000、10001、10010、10011,即16、17、18、19
想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,
tos=1000000、1000001、1000010、1000011,即64、65、66、67
  

RDMA Qos note

日期

变更人

版本

备注


数据收发测试工具:

RDMA通信测试工具|RDMA信息查询工具_https://blog.csdn.net/bandaoyu/article/details/115798045

三、抓包结果文件拆分

抓的包太大,怎么拆分成多个文件呢?

边抓包边切割

常用的命令选项有:

-c:设定抓取的数量

-i:指定监听的网口

-w:将抓取的数据包保存到文件

-s:截取报文的内容,默认截取96字节,-s0表示截取全部

-r:读取数据包内容

-C 10: 每10M保存一个包

-G 600:每10分钟保存一个包

割已经爪完成的包

用tcpdump就可以直接拆分抓到的数据包。
tcpdump  -r    ***.pcap  -w  newfile  -C 1000

就是从已经捕获的文件读取,然后再另存成新文件,并且每个文件大小是1000M(不过不是1G,是1000M个字节)

四、抓包结果分析

RoCEv2 帧结构|RoCE和RRoCE|Soft-RoCE_https://blog.csdn.net/bandaoyu/article/details/117560876

=========================草稿======================

RDMA抓包

    1. ibdump

嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。

例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.

用法

启用步骤:

1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件:

options mlx4_core log_num_mgm_entry_size = -1:

(实际mlnx.conf提示:

Please don't edit this file. Create a new file under

# /etc/modprobe.d/ for your configurations.

所以在/etc/modprobe.d/下创建:

mlx5.conf #根据主机上的实际ib名称创建

options mlx4_core log_num_mgm_entry_size = -1:

options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句

2.重新启动驱动程序。

.重启网络接口ib0

ifdown ib0

ifup ib0

注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。

https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

服务端:

ib_write_bw -d mlx5_1  #监听mlx5_1 网卡

ib_write_bw  182.205.31.53  --report_gbits -F #客户端

测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954

ibdump github: https://github.com/Mellanox/ibdump

注意,RDMA write/read的时候,用的是GID而不是IP,协议也不是UDP,所以不要用IP和UDP/TCP过滤,否则抓不到包

    1. tcpdump (docker,Linux内核从4.9以上)

最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma

(查看内核版本命令:uname -r、uname -a、lsb_release -a)

但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。

使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。

使用方法:

1、拉取容器:

docker pull mellanox / tcpdump-rdma

2、启动容器

docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces --net=host --privileged

现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)

3、保存捕获结果到文件

tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap 

这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。

    1. tcpdump (Offloaded Traffic Sniffer,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer

在ConnectX®-4和更高版本的网卡中受支持。

Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获

  1. 使能Offloaded  Traffic Sniffer:

Turn on the new ethtool private flags "sniffer" (off by default). 

$ ethtool --set-priv-flags enp130s0f0 sniffer on

(在运行tcpdump的主机上)

  1. 在要监听的以太网接口上设置sniffer 标志后,运行tcpdump捕获该接口上的bypass kernel 流量。

注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。

有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:

(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool--connectx-4-x)

一、前提条件

设置

注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。

在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。

查看tcpdump和libpcap版本

[root@rdma63 dscp]# tcpdump --help

tcpdump version 4.9.2

libpcap version 1.5.3

配置

链路层:以太网

流量:RoCE

二、执行过程

1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。

2.使用ethtool启用嗅探器。

在此示例中,网卡名称为ens785f0

# ethtool --set-priv-flags ens785f0 sniffer on

注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。

3.运行tcpdump等待数据包

对于低于5.1的MLNX_OFED版本,请运行:

#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap

对于MLNX_OFED v5.1及更高版本,运行:

#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap

 ./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.54 -i ib3b-0 -vv

(抓取网卡ib3b-0 172.17.31.54 172.17.31.54 之间的udp数据包)

测试完成后,在wireshark中打开文件。

请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。

 备注:使用过程中,发现加了port过滤后,抓不到RDMA

Tcpdump 抓到的包的tos更像是dscp的值

    1. 验证RDMA抓包效果(Run RDMA traffic):
      1. ib_send_bw/ib_write_bw

测试SEND模式

在一个服务器上运行

# ib_send_bw

在另外一个服务器上运行:

# ib_send_bw  192.168.5.232  --report_gbits -F

测试WRITE模式

在一个服务器上运行

# ib_write_bw

在另外一个服务器上运行:

# ib_write_bw  192.168.5.232  --report_gbits -F

5.检查输出文件。

在此示例中,UDP端口4791用于RoCEv2通信。

# cat ~/rdma_traffic.txt

如果您将文件保存给Wireshark,则会收到以下消息:

“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”

设置tos

服务端:

ib_send_bw -d mlx5_1 --rdma_cm

客户端:

ib_send_bw 172.17.31.53 --tos=0x04 -R

      1.  bv_xxx_pingpong

使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:

RDMA抓包

    1. ibdump

嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。

例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.

用法

启用步骤:

1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件:

options mlx4_core log_num_mgm_entry_size = -1:

(实际mlnx.conf提示:

Please don't edit this file. Create a new file under

# /etc/modprobe.d/ for your configurations.

所以在/etc/modprobe.d/下创建:

mlx5.conf #根据主机上的实际ib名称创建

options mlx4_core log_num_mgm_entry_size = -1:

options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句

2.重新启动驱动程序。

.重启网络接口ib0

ifdown ib0

ifup ib0

注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。

https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn

服务端:

ib_write_bw -d mlx5_1  #监听mlx5_1 网卡

ib_write_bw  182.205.31.53  --report_gbits -F #客户端

测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954

ibdump github: https://github.com/Mellanox/ibdump

    1. tcpdump (docker,Linux内核从4.9以上)

最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma

(查看内核版本命令:uname -r、uname -a、lsb_release -a)

但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。

使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。

使用方法:

1、拉取容器:

docker pull mellanox / tcpdump-rdma

2、启动容器

docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces --net=host --privileged

现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)

3、保存捕获结果到文件

tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap 

这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。

    1. tcpdump (Offloaded Traffic Sniffer,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer

在ConnectX®-4和更高版本的网卡中受支持。

Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获

  1. 使能Offloaded  Traffic Sniffer:

Turn on the new ethtool private flags "sniffer" (off by default). 

$ ethtool --set-priv-flags enp130s0f0 sniffer on

(在运行tcpdump的主机上)

  1. 在要监听的以太网接口上设置sniffer 标志后,运行tcpdump捕获该接口上的bypass kernel 流量。

注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。

有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:

(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool--connectx-4-x)

一、前提条件

设置

注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。

在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。

查看tcpdump和libpcap版本

[root@rdma63 dscp]# tcpdump --help

tcpdump version 4.9.2

libpcap version 1.5.3

配置

链路层:以太网

流量:RoCE

二、执行过程

1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。

2.使用ethtool启用嗅探器。

在此示例中,网卡名称为ens785f0

# ethtool --set-priv-flags ens785f0 sniffer on

注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。

3.运行tcpdump等待数据包

对于低于5.1的MLNX_OFED版本,请运行:

#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap

对于MLNX_OFED v5.1及更高版本,运行:

#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap

*.pcap文件用wireshark打开。

 ./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.54 -i ib3b-0 -vv

(抓取网卡ib3b-0 172.17.31.54 172.17.31.54 之间的udp数据包,只有SEND的时候走IP,能识别为UDP包,当使用WRITE/READ时,不走IP,走的是GID,所以tcpdump不能使用ipudp过滤,否则就把RDMA包给过滤了)

测试完成后,在wireshark中打开文件。

请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。

Tcpdump 抓到的包的tos更像是dscp的值

    1. 验证RDMA抓包效果(Run RDMA traffic):
      1. ib_send_bw/ib_write_bw

测试SEND模式

在一个服务器上运行

# ib_send_bw

在另外一个服务器上运行:

# ib_send_bw  192.168.5.232  --report_gbits -F

测试WRITE模式

在一个服务器上运行

# ib_write_bw

在另外一个服务器上运行:

# ib_write_bw  192.168.5.232  --report_gbits -F

5.检查输出文件。

在此示例中,UDP端口4791用于RoCEv2通信。

# cat ~/rdma_traffic.txt

如果您将文件保存给Wireshark,则会收到以下消息:

“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”

设置tos

服务端:

ib_send_bw -d mlx5_1 --rdma_cm

客户端:

ib_send_bw 172.17.31.53 --tos=0x04 -R

      1.  bv_xxx_pingpong

使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:

# 在服务端

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1

  local address:  LID 0x000c, QPN 0x000a19, PSN 0xf31d1e, GID fe80::e41d:2d03:50:e831

  remote address: LID 0x000e, QPN 0x000491, PSN 0xfefc9e, GID fe80::e41d:2d03:50:e801

8192000 bytes in 0.01 seconds = 11821.07 Mbit/sec

1000 iters in 0.01 seconds = 5.54 usec/iter

#在客户端 192.168.10.27是服务端的地址

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1 192.168.10.27

  local address:  LID 0x000e, QPN 0x000491, PSN 0xfefc9e, GID fe80::e41d:2d03:50:e801

  remote address: LID 0x000c, QPN 0x000a19, PSN 0xf31d1e, GID fe80::e41d:2d03:50:e831

8192000 bytes in 0.01 seconds = 11797.66 Mbit/sec

1000 iters in 0.01 seconds = 5.55 usec/iter

说明ibv_rc_pingpong Command - Sun Datacenter InfiniBand Switch 648 Topic Set

      1. rdma_server

服务器端运行:

rdma_server    #默认端口是7471

客户端运行:

rdma_client  -s 服务端IP

帮助:man  rdma_server

      1. ib_send_bw/ib_write_bw 发送Qos的数据包

用ibdump监听:

./ibdump -d mlx5_1

ib_send_bw要支持Qos需要加--rdma_cm

服务端:

ib_send_bw -d mlx5_1   --rdma_cm

客户端:

ib_send_bw 172.17.31.53 --tos=0x04 –R

--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=1000000、1000001、1000010、1000011,即64、65、66、67

    1. 远程捕获交换机数据包

交换机需要安装Packet Capture

:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163


图1-1 远程报文捕获组网图

过程:

  1. 配置Device 交换机

# FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014

<Device> packet-capture remote interface fortygige 1/0/1 port 2014

语法:

packet-capture remote interface interface-type interface-number [ port port ]

interface-type 查询命令:

display interface

dis int

packet-capture stop 停止服务

(2)     配置Wireshark

a.     PC上打开Wireshark软件,选择“Capture > Options”

b.     选择“Interface > Remote”

c.     输入DeviceIP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014

d.     点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。

更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

    1. 抓包记录
      1. tcpdump -Offloaded Traffic Sniffer

在53机器上:

ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

  1. 使能Offloaded  Traffic Sniffer:

   [root@rdma63 tcpdump]# ifconfig  找到两张IB网卡

ib18-0: 192.169.31.53

ib3b-0: 172.17.31.53

  

为方便,将两个网卡都使能

$ ethtool --set-priv-flags ib18-0 sniffer on

$ ethtool --set-priv-flags ib3b-0 sniffer on

  1. 运行监听工具tcpdump

我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp  消息。

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 –vv

RMDA write的时候用的不是IP,用的是GID,所以不能用IP过滤)

  1. 运行server和client

查询IB卡与网口对应关系:

[root@rdma63 dscp]# ibdev2netdev

mlx5_0 port 1 ==> ib18-0 (Up)

mlx5_1 port 1 ==> ib3b-0 (Up)

我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以

53(172.17.31.53)上运行server:

ib_write_bw -d mlx5_1 

54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53):

ib_write_bw 172.17.31.53

用ibdump监听:

./ibdump -d mlx5_1

服务端:

ib_send_bw -d mlx5_1   --rdma_cm

客户端:

ib_send_bw 172.17.31.53 --tos=0x04 –R

--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=1000000、1000001、1000010、1000011,即64、65、66、67

      1. rdma_server

服务器端运行:

rdma_server    #默认端口是7471

客户端运行:

rdma_client  -s 服务端IP

帮助:man  rdma_server

      1. ib_send_bw/ib_write_bw 发送Qos的数据包

用ibdump监听:

./ibdump -d mlx5_1

ib_send_bw要支持Qos需要加--rdma_cm

服务端:

ib_send_bw -d mlx5_1   --rdma_cm

客户端:

ib_send_bw 172.17.31.53 --tos=0x04 –R

--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=1000000、1000001、1000010、1000011,即64、65、66、67

    1. 远程捕获交换机数据包

交换机需要安装Packet Capture

:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

1-1 远程报文捕获组网图

过程:

  1. 配置Device 交换机

# FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014

<Device> packet-capture remote interface fortygige 1/0/1 port 2014

语法:

packet-capture remote interface interface-type interface-number [ port port ]

interface-type 查询命令:

display interface

dis int

packet-capture stop 停止服务

(2)     配置Wireshark

a.     PC上打开Wireshark软件,选择“Capture > Options”

b.     选择“Interface > Remote”

c.     输入DeviceIP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014

d.     点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。

更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

    1. 抓包记录
      1. tcpdump -Offloaded Traffic Sniffer

在53机器上:

ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

  1. 使能Offloaded  Traffic Sniffer:

   [root@rdma63 tcpdump]# ifconfig  找到两张IB网卡

ib18-0: 192.169.31.53

ib3b-0: 172.17.31.53

  

为方便,将两个网卡都使能

$ ethtool --set-priv-flags ib18-0 sniffer on

$ ethtool --set-priv-flags ib3b-0 sniffer on

  1. 运行监听工具tcpdump

我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp  消息。

./tcpdump udp  and src host 172.17.31.54 and dst host 172.17.31.53  -i ib3b-0 –vv

  1. 运行server和client

查询IB卡与网口对应关系:

[root@rdma63 dscp]# ibdev2netdev

mlx5_0 port 1 ==> ib18-0 (Up)

mlx5_1 port 1 ==> ib3b-0 (Up)

我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以

53(172.17.31.53)上运行server:

ib_write_bw -d mlx5_1 

54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53):

ib_write_bw 172.17.31.53

用ibdump监听:

./ibdump -d mlx5_1

服务端:

ib_send_bw -d mlx5_1   --rdma_cm

客户端:

ib_send_bw 172.17.31.53 --tos=0x04 –R

--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值

所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,

tos=10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,

tos=1000000、1000001、1000010、1000011,即64、65、66、67

过滤:----注意,RDMA write/read的时候,用的是GID而不是IP,协议也不是UDP,所以不要用IP和UDP/TCP过滤,否则抓不到包

源主机是:172.17.31.54、目标主机是:172.17.31.53 目标端口是:12345 的数据

./tcpdump src host 172.17.31.54 and dst host 172.17.31.53 and dst port 12345  -i ib3b-0 -vv

协议是UDP 源主机是:172.17.31.54、目标主机是:172.17.31.53 目标端口是:12345 的数据

./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.53 and dst port 12345  -i ib3b-0 -vv

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1 -p 12345

ibv_rc_pingpong -g 0  -i 1 172.17.31.53 -p 12345

OPCODE                      | IBV_QPT_UD | IBV_QPT_UC | IBV_QPT_RC

----------------------------+------------+------------+-----------

IBV_WR_SEND                 |     X      |     X      |     X

IBV_WR_SEND_WITH_IMM        |     X      |     X      |     X

IBV_WR_RDMA_WRITE           |            |     X      |     X

IBV_WR_RDMA_WRITE_WITH_IMM  |            |     X      |     X

IBV_WR_RDMA_READ            |            |            |     X

IBV_WR_ATOMIC_CMP_AND_SWP   |            |            |     X

IBV_WR_ATOMIC_FETCH_AND_ADD |            |            |     X

ibv_post_send(3) - Linux manual page

rdma_cm

/* Connection types available. */

#define RC  (0)

#define UC  (1)

#define UD  (2)

#define RawEth  (3)

#define XRC (4)

#define DC  (5)

#define SRD (6)

posted on 2022-10-04 01:23  bdy  阅读(382)  评论(0编辑  收藏  举报

导航