对于网络问题,抓包一直是一个比较简单方便的“大招”。由于在esxi环境下可以在不同的层面下抓包,因此在什么地方抓包,怎么抓包一直让我觉得很复杂,于是每次操作之前我都要再检查一次手册。这次正好遇到了非常好的文档,借机会总结一下。
了解ESXi中交换机的架构
==========================
-
我们先研究下标准交换机的结构:
下面这张图是一台ESXi主机使用标准交换机的网络架构。简单来说分为四部分:
-
物理上联网卡
-
标准交换机
-
虚拟机网络
-
vmk网络
-
我们再来看下分布式交换机的架构图
(清晰图请从文章后参考文档下载)
https://blogs.vmware.com/vsphere/files/2018/12/pktcap-overview-1024x923.png
其实也是这四部分:
-
物理上联网卡
-
分布式交换机
-
虚拟机网络
-
vmk网络
确定抓包的位置
==========================
根据上面的图所示,我们可以在六个地方抓包,每个地方抓包都单独分为进/出两个方向。
-
虚拟机网络
对虚拟机可以进行两个地方的抓包
虚拟机虚拟机网卡-vnic (标1处)
虚拟机端口组(分布式交换机侧) (标2处)
-
vmk网络
vmk 网口 (标3处)
vmk端口组(分布式交换机侧) (标4处)
-
物理上联网卡:
物理上联网卡端口(分布式交换机侧) (标5处)
物理上联网卡 (标6处)
对虚拟机网络抓包
======================
(第一步)虚拟机准备工作
在虚拟机里ping 某一个IP地址,例如网关。
这里使用IP为10.117.23.254
(第二步)确定虚拟机使用的Port ID和物理上联网卡
方法一(推荐):
使用esxtop,按n找到虚拟机使用的port number和物理上联网卡。
但是这种方法有一个弊端:当一台主机上的VM很多的时候,有可能esxtop一个屏幕无法显示,但是esxtop又无法滚屏,因此我们使用另外一种方法。
方法二:
(1)获取vm的Port number 和 端口组名称
net-stats -l | grep 虚拟机名称
例如 :
可以得到这台VM的三个虚拟机网卡对应的三个Port number以及端口组名称
(2)搜索端口组对应的物理上联我网卡
esxcfg-info |grep 端口组名称
例如:
esxcfg-info |grep DvsPortset-0 -A1|grep Uplinks
得到上联网卡是vmnic1
(第三步)抓包操作:
当我们拿到port number和物理上联网卡后,就可以进行抓包的操作
-
虚拟机虚拟机网卡-vnic (标1处)
pktcap-uw --switchport 83886102 --ip 10.117.23.254 --capture VnicTx -o /tmp/vnic_Tx.pcap & pktcap-uw --switchport 83886102 --ip 10.117.23.254 --capture VnicRx -o /tmp/vnic_Rx.pcap &
-
虚拟机端口组(分布式交换机侧) (标2处)
pktcap-uw --switchport 83886102 --ip 10.117.23.254 --capture PortInput -o /tmp/VMname_PortInput.pcap & pktcap-uw --switchport 83886102 --ip 10.117.23.254 --capture PortOutput -o /tmp/VMname_PortOutput.pcap &
(第四步)终止抓包:
开启另外的终端,执行以下命令
kill $(lsof |grep pktcap-uw |awk ‘{print $1}’| sort -u)
对vmk网络抓包
======================
(第一步)vmk准备工作
使用vmkping命令ping目标地址
在主机上使用vmk2,ping 地址 192.168.22.76
vmkping -I vmk2 -c 1000 192.168.22.76
(第二步)获得port-number和上联网卡信息
与虚拟机抓包类似,vmk网络抓包也要先或者vmk使用的端口组和物理上联网口。这里esxtop的方法就不说了。我们使用命令行的方式来尽心:
net-stats -l|grep vmk端口
例如 net-stats -l|grep vmk2
获取port number和端口组号
获取端口组对应的物理上联网卡
esxcfg-info |grep 端口组名称
例如:
esxcfg-info |grep DvsPortset-1 -A1|grep Uplinks
(第三步)抓包操作:
当我们拿到port number和物理上联网卡后,就可以进行抓包的操作
这里以ICMP为例( --proto 0x01 )其他协议请参考:
https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
-
vmk 网口 (标3处)
pktcap-uw --vmk vmk2 --ip 192.168.22.76 --proto 0x01 --capture TcpipTx -o /tmp/vmk2_TcpipTx.pcap & pktcap-uw --vmk vmk2 --ip 192.168.22.76 --proto 0x01 --capture TcpipRx -o /tmp/vmk2_TcpipRx.pcap &
-
vmk端口组(分布式交换机侧) (标4处)
pktcap-uw --vmk vmk2 --ip 192.168.22.76 --proto 0x01 --capture PortInput -o /tmp/vmk2_PortInput.pcap & pktcap-uw --vmk vmk2 --ip 192.168.22.76 --proto 0x01 --capture PortOutput -o /tmp/vmk2_PortOutput.pcap &
(第四步)终止抓包:
开启另外的终端,执行以下命令
kill $(lsof |grep pktcap-uw |awk ‘{print $1}’| sort -u)
对物理上联网卡抓包
======================
物理上联网卡抓包相对比较简单
第一步和第二步依旧是ping一个地址,并且确认物理上联网口
(第三步)抓包操作:
-
物理上联网卡端口(分布式交换机侧) (标5处)
pktcap-uw --uplink vmnic1 --ip 10.117.23.254 --capture PortOutput -o /tmp/vmnic1_PortOutput.pcap & pktcap-uw --uplink vmnic1 --ip 10.117.23.254 --capture PortInput -o /tmp/vmnic1_PortInput.pcap &
-
物理上联网卡 (标6处)
pktcap-uw --uplink vmnic1 --ip 10.117.23.254 --capture UplinkRcvKernel -o /tmp/vmnic1_Rcv.pcap & pktcap-uw --uplink vmnic1 --ip 10.117.23.254 --capture UplinkSndKernel -o /tmp/vmnic1_Snd.pcap &
(第四步)终止抓包:
开启另外的终端,执行以下命令
kill $(lsof |grep pktcap-uw |awk '{print $1}'| sort -u)
后续分析:
======================
最常用的使用工具是wireshark,需要单独的下载。
或者在ESXi主机上使用
tcpdump-uw -enr 输出文件
参考文档:
======================
https://blogs.vmware.com/vsphere/2018/12/esxi-network-troubleshooting-tools.html
https://blogs.vmware.com/vsphere/2018/12/understanding-the-esxi-network-iochain.html
http://www.vmwarearena.com/esxtop-limiting-your-view-no-need-to-scrollpagedown-your-esxtop-output/
https://www.virten.net/2015/10/esxi-network-troubleshooting-with-tcpdump-uw-and-pktcap-uw/
https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
====================