如何找到KVM虚拟机的IP地址?
当您有一个用KVM管理程序创建的虚拟机(VM)时,在某些情况下,您想知道它的IP地址。例如,您在远程无头服务器上运行虚拟机,但您无法访问虚拟机的登录控制台,原因是服务器没有启用远程VNC控制台访问功能,或者是服务器上的virsh控制台因某种原因无法工作。在不知道虚拟机的IP地址的情况下,你无法SSH到虚拟机。
在这种情况下,假设你唯一能访问的是虚拟机运行的KVM管理程序服务器。那么如何才能知道虚拟机的IP地址呢?
当然可以在不通过控制台或SSH登录虚拟机的情况下找出虚拟机的IP地址。根据你的虚拟机使用的是什么类型的客体网络,说明有所不同。NAT网络或桥接网络。在下文中,我将分别介绍如何在这些情况下使用KVM管理程序发现虚拟机的IP地址。
NAT网络
在基于KVM/libvirt的虚拟化中,基于NAT的网络通常用于客体虚拟机,因为虚拟机的默认网络(除非你另外指定)是基于NAT的虚拟网络。在大多数Linux系统中,libvirt会自动创建一个名为virbr0的默认NAT网桥。如果你愿意,你也可以使用libvirt工具(如virsh、virt-manager)为你的虚拟机创建自定义的虚拟网络,它将创建相应的NAT桥。每一个NAT桥(无论是否默认)都有自己的私有子网(例如,Ubuntu上的virbr0为192.168.122.0/24),您的虚拟机将从与其连接的任何一个NAT桥相关联的子网中被分配一个私有IP地址。为了分配IP地址,libvirt为每个NAT网桥运行一个专用的DHCP服务器(dnsmasq)。
如果您的虚拟机正在使用NAT网络,您可以很容易地从命令行找到它的IP地址,如下所示。
$ virsh net-dhcp-leases <network-name>

在上图中,我指定了默认的网络(该网络名为default)。命令的输出显示有两个虚拟机在运行,并且分配了192.168.122.240和192.168.122.104。
另外,你也可以先用以下方法找出虚拟机的名称。
$ virsh list
然后通过运行获取虚拟机的IP地址。

桥接网络
基于NAT的网络的缺点是,你的访客虚拟机隐藏在NAT桥后面,如果没有复杂的端口转发或IP伪装,就无法在hypervisor服务器外部访问。另一种客座网络是桥接网络,即虚拟机的虚拟接口通过KVM主机的物理接口连接到外部本地网络。在这种情况下,虚拟机的 IP 地址不在 libvirt 的 DHCP 控制之下。相反,虚拟机是由运行在桥接本地网络上的 DHCP 服务器分配一个 IP 地址。当然,这个 IP 地址对 libvirt 来说是不可见的。
要找出使用桥接网络的虚拟机的 IP 地址,您可以使用名为 dhcpdump 的命令行工具。使用该工具,您可以监控您的虚拟机与外部 DHCP 服务器交换的 DHCP 请求/响应。
例如,假设您的虚拟机通过名为br0的网桥与本地网络进行桥接。然后运行以下命令来监控您的虚拟机的DHCP通信。
$ sudo dhcpdump -i br0
当dhcpdump命令运行时,打开虚拟机电源,等待DHCP流量出现在屏幕上。

dhcpdump 的输出包括 DHCP IP 地址以及 DHCP 服务器的地址。通过DHCP分配给虚拟机的IP地址将出现在YIADDR字段,如上图所示。