Networking

將公共 IPv4 自動分配給正在創建的每個 KVM 虛擬機?

  • April 18, 2022

我想知道我將如何繼續為正在創建的每個 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 伺服器。如果您想做其他方式,則需要稍作調整:

  • 在頂部附近定義選項 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,並且該網路中的主機將是 0.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 的子網,但一切都需要它;如果您不確定此路由的工作原理,最好在實驗室環境中嘗試此類設置

  • 使用綁定到靜態 IP 地址的所需 MAC 地址創建主機定義:
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
...

然後確保將這些 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 是沒有問題的。

引用自:https://serverfault.com/questions/1098802