![是否自动为正在创建的每个 KVM VM 分配一个公用 IPv4?](https://linux22.com/image/776545/%E6%98%AF%E5%90%A6%E8%87%AA%E5%8A%A8%E4%B8%BA%E6%AD%A3%E5%9C%A8%E5%88%9B%E5%BB%BA%E7%9A%84%E6%AF%8F%E4%B8%AA%20KVM%20VM%20%E5%88%86%E9%85%8D%E4%B8%80%E4%B8%AA%E5%85%AC%E7%94%A8%20IPv4%EF%BC%9F.png)
我想知道如何为每个正在创建的虚拟机分配一个公共 IPv4。
设置:在 CentOS8 上使用 libvirt 和 kvm 托管具有 3 个 IP 的服务器,以使用 eth0 作为接口虚拟化 Bridge br0。
经过多次反复尝试后,我终于能够通过使用网桥并将 IP 地址分配给客户操作系统网络文件的接口来手动完成此操作。
尽管我希望这是自动的,但考虑到如果我现在重新安装操作系统,它将回到没有 IP 地址的状态,并且每次都必须连接到 Guest 并手动编辑网络文件中的 ipv4 地址。我该如何避免这种情况?
目标:每个 IPv4 都被硬锁定到虚拟机,并且无论操作系统是否重新安装都会保留。
可选目标:如果主机操作系统的任何 IPv4 未使用,则应将其分配给下一个创建的虚拟机。
我每次都必须编写自己的软件来执行此操作吗?或者有没有更简单的方法?
答案1
这就是 DHCP 的用途。
您可以自由选择它们的 MAC 地址,对吗?在与虚拟机相同的(可能是虚拟的)以太网段中的系统上设置 DHCP 服务器,并将您的 IP 绑定到某些 MAC。
您还需要分配一些路由(使用 DHCP 选项 121 和 249)。具有 DHCP 服务器本身的机器不需要具有公共 IP 或与所有客户端位于同一网络中的 IP;无论如何,当客户端上仍未配置地址时,就会与 DHCP 服务器进行通信。
如果您使用 ISC DHCP,则需要执行以下操作。我假设您的主机是您的路由器和虚拟机的 NAT 盒,它还将托管您的 DHCP 服务器。如果您想以其他方式操作,则需要进行轻微调整:
- 在顶部某处定义选项 121 和 249
dhcpd.conf
:
option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;
可能新版本不需要这个,但我的版本需要。
- 创建一个
shared-network
块,将您的动态私有子网和公共地址作为带有掩码 32 的“子网”:
option routers 192.168.210.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
shared-network libvirt-vm-net {
subnet 192.168.210.0 netmask 255.255.255.0 {
range 192.168.210.2 192.168.210.254;
}
subnet 192.0.2.1 netmask 255.255.255.255 {
option rfc3442-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;
option ms-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;
}
...
}
我假设 NAT 后面的机器的“私有”网络为 192.168.210.0/24,主机为该网络中的 .1(分配给网桥)。静态无类路由(选项 121 和 249)设置将添加以下路由:
ip route add 192.168.210.1 dev eth0
ip route add default via 192.168.210.1
尽管没有包含 192.0.2.1/32 和 192.168.210.1 的子网,但这些对于一切正常工作都是必需的;如果你不确定此路由如何工作,最好在实验室环境中尝试这种设置
- 创建主机定义,将所需的 MAC 地址绑定到静态 IP 地址:
host public-server-1 { hardware ethernet 00:11:22:33:44:55; fixed-address 192.0.2.1; }
...
- 将这些 MAC 地址的静态邻居(“ARP”)条目添加到
/etc/ethers
(主机上):
00:11:22:33:44:55 192.0.2.1
...
- 通过相应的桥接接口添加到这些地址的静态路由;我不知道如何使用你的操作系统发行版的标准网络配置来执行此操作,但通用的 Linux 方式是这样的:
ip route add 192.0.2.1 dev br0
...
然后确保在 libvirt 配置中将这些 MAC 分配给重要的虚拟机。其他虚拟机(其 MAC 未绑定)将照常从配置的范围中获取其地址。
实际上,我在“更复杂”的设置中实施并测试了此设置(DHCP、主机和路由器都是不同的系统),而且我不使用 libvirt,我的主机是 PVE。甚至 PXE 启动也完美适用于“普通”子网机器(例如示例中的 192.168.210.0)和“公共 IP”机器(例如 192.0.2.1)。
要允许所有虚拟机访问互联网,您必须对私有 IP 使用 NAT,而不要将其用于公共 IP;这没问题,请使用类似 的规则iptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE
。这样,您的私有范围将被转换为主机本身面向公众的地址,但公共地址不会被转换,而是按原样路由。同样,在同一网络段上拥有公共和私有地址并通过同一个虚拟 NIC 是没有问题的。