Sunday, October 15, 2017

聊一聊 esxi 上的抓包工具pktcap-uw

今天聊一下esxi 5.5开始提供的抓包工具 pktcap-uw, (在5.5之前esxi 上的抓包工具tcpdump-uw  由于只能针对vmkernel 端口进行抓包,有一定局限性)。
对于网络工程师,抓得一手好包,是一个必备技能。尤其是NSX在每个esxi host 里面多部署了一个三层的逻辑路由器VDR,在每个host 里面的网络节点又增加了。并且通过对抓包工具的学习,同时也会对datapath 层面的理解加深。

先从vswitch 开始,二层交换机data path 非常简单
下图是一个逻辑概念,一个数据包,从物理交换机进入到,esxi 物理网卡,vswitch ,虚拟机的虚拟网卡。

Pktcap-uw 可以针对vswitch port , uplink分别进行抓包,需要注意的是pktcap-uw 抓包需要指方向



 1 获取vswitch port ID ,有多种方法,这里列出两种
第一种:
好处在于只用一条命令就能获取必要的信息
net-stats -l
[root@localhost:/tmp] net-stats -l
PortNum          TypeSubType SwitchName       MACAddress         ClientName
33554434           4       0 vSwitch0         00:50:56:b6:2b:53  vmnic0
33554437           3       0 vSwitch0         00:50:56:62:59:80  vmk1
50331650           4       0 DvsPortset-0     00:50:56:b6:2e:e3  vmnic1
67108866           4       0 DvsPortset-1     00:50:56:b6:60:fd  vmnic2
67108872           3       0 DvsPortset-1     00:50:56:b6:2b:53  vmk0
67108874           5       6 DvsPortset-1     00:50:56:96:5b:99  linux_mirror.eth0
67108875           5       6 DvsPortset-1     00:50:56:96:5b:8e  linux_source_231.eth0
67108877           5       6 DvsPortset-1     00:50:56:96:3d:35  linux_dst_233.eth0

第二种
这种方法的好处在于,如果uplink 做了teaming, 通过这个方法也可以获取到使用的uplink 
esxcli network vm list 列出worldID
[root@localhost:/tmp] esxcli network vm list
World ID  Name              Num Ports  Networks
-------- ----------------  ---------  --------------
  711273  linux_mirror              1 dvportgroup-43
  711281  linux_source_231          1 dvportgroup-43
  714723  linux_dst_233             1  dvportgroup-43



  esxcli network vmport list -w worldID


[root@localhost:/tmp] esxcli network vm port list -w 711273
   Port ID: 67108874
   vSwitch: dvSwitch
   Portgroup:dvportgroup-43
   DVPort ID: 18
   MAC Address:00:50:56:96:5b:99
   IP Address: 0.0.0.0
   Team Uplink: vmnic2
   Uplink Port ID:67108866
   Active Filters:

运行以下命令抓取 por tid 上流量注意port ID 需要和实际一致,proto 参数是制定协议号,0x01 icmp 协议号
一些常用的协议列表
TCP  0x06
UDP 0x11
OSPF 0x59
ISIS    0x7C
完整的列表
https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers

命令含义,是抓取vswitch VM收到的icmp 报文,并存储在tmp文件夹下33554437_in.pcap
pktcap-uw --switchport 33554437  --dir 0 --proto 0x01 -o /tmp/33554437_in.pcap

命令含义,是抓取vswitch VM发出的icmp 报文,并存储在tmp文件夹下33554437_out.pcap
pktcap-uw --switchport 33554437 --dir 1 --proto 0x01 -o/tmp/33554437_out.pcap

抓取物理网卡vmnic6 出方向的icmp 报文,并存在tmp 文件夹下面vmnic6_out.pcap
pktcap-uw --uplink vmnic6 --dir 1 --proto 0x01 -o/tmp/vmnic6_out.pcap
抓取物理网卡vmnic6 入方向的icmp 报文,并存在tmp 文件夹下面vmnic6_in.pcap

pktcap-uw --uplink vmnic6 --dir 0 --proto 0x01 -o/tmp/vmnic6_in.pcap

如果有三层vdr 参与后在esxihost 内部的data path,图片来自nsx trouble shooting guide



三层跨host数据的逻辑路径
VM<—>vswich port< --->vdr port< --->uplink

Switch port 同样是用 net-state –l  拿到

获取vdrport
[root@localhost:~] net-vdr -C -l

Host locale Id:            4236bed1-638a-8c8a-4e44-f9b2b0de8aa7

Connection Information:
-----------------------

DvsName          VdrPort           NumLifs  VdrVmac
-------          -------           ------- -------
dvSwitch         vdrPort           4        02:50:56:56:44:52
    Vdr Switch Port: 100663301
    Teaming Policy:Default Teaming
    Uplink   : dvUplink1(100663298):00:50:56:f7:6a:ce(Team member)


   Stats : PktDropped      Pkt Replaced     Pkt Skipped
   Input : 0                0                1102180957
  Output : 33               0                103174


需要注意的是在最后的命令在官方的图片是错误的,就是在pnic处的抓包命令。正确抓取带有vxlan 封装的报文命令格式如下

Pktcap-uw –uplink vmnic0 –capture UplinkSnd
Pktcap-uw –uplink vmnic0 –capture UplinkRcv


命令列表:
esxcli network vm list 
esxcli network vm port list -w worldID
net-stats -l
net-vdr -C -l

参考资料
https://docs.vmware.com/en/VMware-NSX-for-vSphere/6.3/nsx_63_troubleshooting.pdf
https://docs.vmware.com/en/VMware-vSphere/6.0/com.vmware.vsphere.networking.doc/GUID-5CE50870-81A9-457E-BE56-C3FCEEF3D0D5.html