情况
我有两个 QEMU KVM(名为掌握和工人分别)在我的笔记本电脑上运行。虚拟机使用 Ubuntu 22.04 的无头服务器版本,笔记本电脑运行的是 Mint。
目标
我想要三个 IP 地址或名称(主机和两个虚拟机),我可以使用它们从另一个连接到其中任何一个,并且这三个的所有端口都应该对其他端口可见,因为我正在尝试使用此迷你设置试验一些 kubernetes 概念。我不想求助于端口转发。
选修的
如果 IP 地址是静态的,那就最好了,这样我就不必在每次重新启动笔记本电脑时查找它们。
我尝试查阅 QEMU 网络文档,它确实给了我很多信息,但由于我的网络基础不好,我想知道是否有一种相对简单的方法来设置它。
答案1
我想要三个 IP 地址或名称(主机和两个虚拟机),我可以使用它们从另一个连接到其中任何一个,并且这三个的所有端口都应该对其他端口可见,因为我正在尝试使用此迷你设置试验一些 kubernetes 概念。我不想求助于端口转发。
需要指出的是,“端口转发”(NAT)是不是使数据包正常传输的一般方法。相反,它是一种额外的工具——一种解决某些问题的变通方法——可以应用后数据包已由路由器转发。
您的家用路由器使用 NAT 的原因有多种,Kubernetes 使用 NAT 的原因也有多种,但这两种情况都只用于常规 IP 路由无法实现的特定目的。对于您而言,常规 IP 路由就足够了,根本不需要使用“端口转发”。
我尝试查阅 QEMU 网络文档,它确实给了我很多信息,但由于我的网络基础不好,我想知道是否有一种相对简单的方法来设置它。
在最简单的选项中,-net tap
QEMU 为每个虚拟机提供一个“tap#”网络接口——您可以将它们视为直接连接到两台机器的两个以太网端口。
你可以通过两种方式配置这些以太网(tap)接口:要么作为两个独立的子网(你的主机充当路由器或作为单个子网(您的主机充当桥又名在它们之间切换)。
(也就是说你应该复习一下网络基础知识,因为这样就会发现“1 台主机、2 台虚拟机”几乎等于最简单的“1 台路由器、2 台计算机”设置;例如 libvirt 可能做的其他一切都是在此基础上分层的可选内容。)
桥接通常是更简单的选项,因为它几乎不需要启用任何配置;就像将所有东西都连接到同一个以太网交换机一样。如果您不使用 libvirt(它会为您创建一个“virbr0”),则可能需要手动创建一个空桥,但之后 QEMU -net bridge
(而不是“-net tap”)会自动将 VM 的“tap”接口添加到其中。
网桥本身并不关心 IP,但通常你会想为“br0”分配一个地址,以便主机操作系统可以加入网络并与虚拟机通信。Libvirt 在创建“virbr0”桥时会自动执行此操作。
路由稍微复杂一点,因为它需要在主机操作系统系统范围内启用(通过“IP 转发” sysctl),然后你需要确保主机系统的防火墙(iptables)允许转发。一旦启用,分配每个非桥接的“tap”接口有来自不同子网(无重叠)的自己的 IP 地址,它就可以工作。
(两者可以混合使用;例如,您可以创建两个网桥,每个网桥有多个虚拟机,并在网桥之间进行路由。)