QEMU虚拟机以桥接网络模式启动后,虚拟机的ip会与主机网卡处于同一个网段,但是具体ip是无法确定的,需要一定的方法去探测到。

 

方法1:查看主机的arp表。

这种方法简单,但是得要主机与靶机之间有过通信才会在arp表里留下记录。如下,启动靶机后并没有对应的表项,在靶机中ping一下主机后就有了。

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_mac地址

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_QEMU kvm隐藏虚拟机信息_02

那么要触发主机与靶机之间的通信,要么让靶机启动时自动执行ping命令,要么如果网络比较小的话,让主机对当前网段的所有可能ip进行探测,这样也能触发通信。

 

方法2:使用QEMU Guest Agent

在靶机中安装QEMU Guest Agent,然后传输信息,这个方法不太优雅。

 

方法3:使用virsh啥的,libvirt那些高层的组件支持这些功能了。

 

不打算用太多其他高级的组件,只用qemu。

因此采用的思路是:让靶机开机启动时执行ping命令,然后主机的arp表就肯定有记录了,然后主机中根据arp表来

编辑 /etc/rc.local 文件

vim /etc/rc.local

在文件底部加入需要执行的命令,示例如下:

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_网络_03

保存,然后reboot 重启。

如下,在主机中监听ens33网卡,启动靶机后会有挺多报文发送到主机中。

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_QEMU kvm隐藏虚拟机信息_04

则arp表中必定会有相应的条目了。

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_网络_05

 

执行如下命令即可探测到mac对应的ip是多少了。

ip neigh | grep 52:54:6b:c7:82:dc | awk '{print $1}'

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_linux_06

这种方法有时候也会失灵,可以使用nmap -sn 192.168.150.0/24进行ping扫描。

或者使用python scapy来自动化探测。

如果当前主机的arp表还没有当前ip的mac地址,则会默认使用广播包来发送。

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_网络_07

但是这样需要scapy查询一下arp表再设置使用广播mac地址发送,会大大增加时延,因此直接设置mac dst为ff:ff:ff:ff:ff:ff。

因为注定会有大量ping是没有回复的,因此设置timeout参数为1,只等待1秒即可。

但是执行如下命令,却只收到两个ping回复!?

ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/IP(dst="192.168.150.0/24")/ICMP(),timeout=1)

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_linux_08

 

具体原因不分析了,直接使用arp ping来探测吧,这是最快的方法了!

ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.150.0/24"),timeout=2)

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_linux_09

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_mac地址_10

 

编写python脚本,输入mac地址,输出对应的ip地址。

QEMU kvm隐藏虚拟机信息 qemu查看虚拟机_tcp/ip_11