我想知道如何繼續為正在建立的每個虛擬機器分配公共 ipv4。
設定:在 CentOS8 上使用 libvirt 和 kvm 託管具有 3 個 IP 的伺服器,以使用 eth0 作為介面虛擬化 Bridge br0。
經過大量試驗和錯誤後,我設法透過使用橋並將 IP 位址分配給來賓作業系統網路檔案的介面來手動完成此操作。
雖然我希望這是自動的,但考慮到如果我現在重新安裝作業系統,它將返回到沒有 IP 位址和 id 的情況,每次都必須連接到來賓並手動編輯網路檔案中的 ipv4 位址。我怎樣才能避免這種情況?
目標:每個 IPv4 都被硬鎖定到虛擬機,並且無論作業系統是否重新安裝都會保留。
可選目標:如果主機作業系統中的任何 IPv4 未使用,則應將其指派給下一個建立的 VM。
我是否必須每次都編寫自己的軟體來執行此操作,還是有更簡單的方法?
答案1
這就是 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,主機將是該網路中的 .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 配置中的重要虛擬機器。其他虛擬機器(其 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
。這樣,您的私人範圍將被轉換為主機本身的面向公眾的地址,但公共地址不會被轉換,但將按原樣路由。同樣,公共位址和私人位址位於同一網段並通過同一虛擬網卡是沒有問題的。