我想知道我将如何继续为正在创建的每个 vm 分配一个公共 ipv4。
设置:使用 libvirt 和 kvm 在 CentOS8 上具有 3 个 IP 的主机服务器使用 eth0 作为接口虚拟化 Bridge br0。
经过大量的试验和错误后,我设法通过使用网桥并将 IP 地址分配给来宾操作系统网络文件的接口来手动完成。
虽然我希望这将是自动的,考虑到如果我现在重新安装操作系统,它将回到没有 IP 地址和 id 必须连接到访客并每次手动编辑网络文件中的 ipv4 地址。我怎样才能避免这种情况?
目标:每个 IPv4 都被硬锁定到虚拟机,并且无论操作系统是否重新安装都将保留。
可选目标:如果主机操作系统中的任何 IPv4 未被使用,则应将其分配给下一个创建的 VM。
我每次都必须编写自己的软件来执行此操作还是有更简单的方法?
这就是 DHCP 的用途。
你可以自由选择他们的MAC地址,对吧?在与 VM 相同(可能是虚拟的)以太网段中的系统上设置 DHCP 服务器,并将您的 IP 绑定到某些 MAC。
您还需要分发一些路由(使用 DHCP 选项 121 和 249)。自带DHCP服务器的机器本身不需要公网IP或者IP与所有客户端在同一个网络;当客户端上仍然没有配置地址时,与 DHCP 服务器的通信就会发生。
如果您使用 ISC DHCP,则需要执行以下操作。我假设您的主机是您的路由器和虚拟机的 NAT 盒,它还将托管您的 DHCP 服务器。如果您想做其他方式,则需要稍作调整:
dhcpd.conf
:可能,新版本不需要这个,但我的需要。
shared-network
块,将您的动态私有子网和您的公共地址作为掩码 32 的“子网”:我假设您在 NAT 后面的机器的“专用”网络将是 192.168.210.0/24,并且该网络中的主机将是 0.1(分配给网桥)。静态无类路由(选项 121 和 249)设置将添加以下路由:
尽管没有包含 192.0.2.1/32 和 192.168.210.1 的子网,但一切都需要它;如果您不确定此路由的工作原理,最好在实验室环境中尝试此类设置
/etc/ethers
(在主机上):然后确保将这些 MAC 分配给 libvirt 配置中的重要虚拟机。其他 VM(其 MAC 未绑定)将照常从配置的范围中获取其地址。
实际上,我在甚至“更复杂”的设置(DHCP、主机和路由器都是不同的系统)中实现并测试了这个设置,我也不使用 libvirt,我的主机是 PVE。即使是 PXE 引导也适用于“普通”子网机器(如示例中的 192.168.210.0)和“公共 IP”机器(如 192.0.2.1)。
要允许所有虚拟机访问 Internet,您必须将 NAT 用于私有 IP,并且不要将其用于公共 IP;这不是问题,使用类似的规则
iptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE
。这样,您的私有范围将被转换为主机本身的面向公众的地址,但公共地址不会被转换,而是会按原样路由。同样,在同一个网段上拥有公共和私有地址并通过同一个虚拟 NIC 是没有问题的。