最近有需要在 VMware 的两个虚拟机之间进行数据包的抓取,本来直接在虚拟机上开个 Wireshark 就行了,但是目标软件傲娇的很,检测到有 pcap 之类的服务后会进行错误的运算,所以需要在母鸡上进行抓包操作。

于是向往常一样在母鸡上打开了 Wireshark,接口点在了 eth0 的 WiFi 上。好的,虚拟机上运行了软件后,执行……母鸡的 Wireshark 上没有出现任何可疑的数据包……我就不信邪了,我把接口全部勾上后再试试……还是没有任何可疑的数据包。

这是什么问题……于是不信邪的看了下ifconfig,发现了这两个接口

vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:50:56:c0:00:01 inet 192.168.198.1 netmask 0xffffff00 broadcast 192.168.198.255
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:50:56:c0:00:08 inet 172.16.145.1 netmask 0xffffff00 broadcast 172.16.145.255

这两个应该就是 VMware 虚拟出来的接口吧,可是 Wireshark 上根本没有啊,请教了下 G 娘,找到了这个link,etung 回答到他不清楚 Wireshark 的底层是怎么工作的,但是 VMware 的接口没有像 BPF 一样的特性(?),这可能就是 Wireshark 不能工作的原因,不过你可以试试vmnet-sniffer来帮助你工作。

我在 Mac 下用的是 VMware Fusion,对应的vmnet-sniffer/Applications/VMware Fusion.app/Contents/Library下,你可以 cd 到对应目录或者直接把他 ln 到 /usr/bin 下。

你可以直接看见它的 usage

[[email protected] /Applications/VMware Fusion.app/Contents/Library]$ ./vmnet-sniffer
usage: ./vmnet-sniffer [-eP] [-w file] if
       -e: show ethernet header
       -w: output in raw format to specified file
           (readable by tcpdump/ethereal)

这里要提一点的坑是,我不清楚到底是什么原因,ifconfig下看见的vmnet1vmnet8并不是我虚拟机真正使用的接口,我在对这两个接口进行 sniff 的时候也没有什么可疑的数据包出现,那么虚拟机真正使用的接口到底是什么呢……

之后摸索了一下,来到了虚拟机文件的目录,有一个.vmx文件,这应该是虚拟机的配置文件(?),把他用编辑器打开后,翻到最下面,你可以看见类似下面的内容:

checkpoint.vmState.readOnly = "FALSE"
checkpoint.vmState = "Windows XP Professional-bf7a100f.vmss"
cleanShutdown = "TRUE"
ethernet0.vnet = "vmnet2"
ethernet0.bsdName = "en1"
ethernet0.displayName = "Wi-Fi"

我们找到了一个野生的端口vmnet2,马上试试:

 [[email protected] /Applications/VMware Fusion.app/Contents/Library]$ sudo ./vmnet-sniffer -e -w ~/Desktop/vmnet2.pcap vmnet2
Password: 
len 89 src 88:1f:a1:1a:3a:c4 dst 01:00:5e:00:00:fb IP src 192.168.1.148 dst 224.0.0.251 UDP src port 5353 dst port 5353
len 109 src 88:1f:a1:1a:3a:c4 dst 33:33:00:00:00:fb IPv6 src fe80::8a1f:a1ff:fe1a:3ac4 dst ff02::fb UDP src port 5353 dst port 5353
len 110 src 00:0c:29:27:07:12 dst ff:ff:ff:ff:ff:ff IP src 192.168.1.136 dst 192.168.1.255 UDP src port 137 dst port 137
len 175 src 88:1f:a1:1a:3a:c4 dst 01:00:5e:00:00:fb IP src 192.168.1.148 dst 224.0.0.251 UDP src port 5353 dst port 5353

恩,这下看见的内容就是我们需要的了。

还有一点要提的是不要忘记chown $USER下输出的文件,因为我们之前是用sudo来做的(为什么要用sudo呢,因为不是root的话是没有权限访问那些接口的)。