QEMU虚拟机以桥接网络模式启动后,虚拟机的ip会与主机网卡处于同一个网段,但是具体ip是无法确定的,需要一定的方法去探测到。
方法1:查看主机的arp表。
这种方法简单,但是得要主机与靶机之间有过通信才会在arp表里留下记录。如下,启动靶机后并没有对应的表项,在靶机中ping一下主机后就有了。
那么要触发主机与靶机之间的通信,要么让靶机启动时自动执行ping命令,要么如果网络比较小的话,让主机对当前网段的所有可能ip进行探测,这样也能触发通信。
方法2:使用QEMU Guest Agent
在靶机中安装QEMU Guest Agent,然后传输信息,这个方法不太优雅。
方法3:使用virsh啥的,libvirt那些高层的组件支持这些功能了。
不打算用太多其他高级的组件,只用qemu。
因此采用的思路是:让靶机开机启动时执行ping命令,然后主机的arp表就肯定有记录了,然后主机中根据arp表来
编辑 /etc/rc.local 文件
vim /etc/rc.local
在文件底部加入需要执行的命令,示例如下:
保存,然后reboot 重启。
如下,在主机中监听ens33网卡,启动靶机后会有挺多报文发送到主机中。
则arp表中必定会有相应的条目了。
执行如下命令即可探测到mac对应的ip是多少了。
ip neigh | grep 52:54:6b:c7:82:dc | awk '{print $1}'
这种方法有时候也会失灵,可以使用nmap -sn 192.168.150.0/24进行ping扫描。
或者使用python scapy来自动化探测。
如果当前主机的arp表还没有当前ip的mac地址,则会默认使用广播包来发送。
但是这样需要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)
具体原因不分析了,直接使用arp ping来探测吧,这是最快的方法了!
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.150.0/24"),timeout=2)
编写python脚本,输入mac地址,输出对应的ip地址。