橋接還是 NAT? KVM 網路配置的最優解

在KVM虛擬化裡,網路設定對於虛擬機器的連線速度和效能至關重要。 libvirt這個工具透過簡化網路管理,提供了兩種主要的網路類型:橋接網路和NAT網路。這兩種方式適合不同的使用場景,例如橋接網路更適合正式的生產環境,而NAT網路則更適合開發或測試環境。


NAT網絡
裝了KVM之後,它會自動設定一個預設的NAT網路。這樣,你的虛擬機器就能透過這個NAT網路上網了。這個NAT網路其實就是一個虛擬的交換器加上一些網路規則組成的。聽起來可能有點複雜,我們可以透過一張圖來更清楚地理解。
在KVM的NAT網路中,虛擬機器透過虛擬交換器與宿主機器連接。透過iptables的SNAT規則,將虛擬機器的IP位址轉換為宿主機器的IP位址後,虛擬機器就能利用宿主機器的實體網路卡存取外部網路了。由於只設定了SNAT而沒有設定DNAT,因此虛擬機器可以存取外部網絡,但外部網路無法直接存取虛擬機器。若要讓外部網路能夠存取虛擬機器的服務,則需手動設定DNAT。 "外部網路"在這裡指的是區域網路(如辦公室環境內的網路),而非網際網路。
enp6s18是電腦的真實網路卡,而virbr0則是KVM設定為預設NAT網路的虛擬交換器。使用預設NAT時,虛擬機會連接到virbr0。由於目前沒有運行虛擬機,因此看不到網路卡變化。如果啟動一個虛擬機器(如ubuntu-cloud),KVM會為其建立一個新的虛擬網路卡。接下來我們透過啟動這台虛擬機器來看看會發生什麼。
當你啟動了ubuntu-cloud虛擬機器之後,再次執行ip a指令來檢查網路介面的資訊時,你會發現比之前多了一個新的網路介面。這個變化如下圖所示:
當你啟動ubuntu-cloud虛擬機器時,會發現多了一個名為vnet0的網路卡。這個vnet0網路卡的作用是連接ubuntu-cloud虛擬機器到virbr0交換器。可以想像成一條網線,一端連接ubuntu-cloud虛擬機器(透過其內部的虛擬網路卡),另一端連接virbr0交換器(透過vnet0)。簡而言之,vnet0是為了讓ubuntu-cloud能夠與virbr0通訊而專門設定的虛擬網路卡。執行brctl show指令可以幫助你更清楚地看到virbr0和vnet0之間的關係。
現在有一個叫做virbr0的虛擬交換器。它有兩個接口,一個是virbr0-nic,另一個是vnet0。 virbr0-nic這個介面是用來連接宿主機器上的實體網卡(eth網卡)的,而vnet0這個介面是用來連接ubuntu-cloud虛擬機器裡的虛擬網卡(eth網卡)的。這樣應該可以想像出它們是怎麼連結起來的了吧?

了解了上面的知識,我們可以把nat網路的模型圖細化一下,理解成下面的樣子:
橋接網路
在我們的生產環境中,我選擇了橋接網路模型。這種模式讓虛擬機器和宿主機器在網路層面上處於同一層級。例如,我們公司的伺服器位於192.168.99.0/24網段,其中一台伺服器A的IP位址是192.168.99.66。在這台伺服器上,我們使用KVM建立了兩台虛擬機器A1和A2,並透過橋接網路配置分別分配給它們192.168.99.67和192.168.99.68作為IP位址。
從實體交換器的角度來看,宿主機A和虛擬機器A1、A2被視為獨立設備,直接連接到交換器。這意味著在網路層面,這三者被視為獨立個體。因此,公司內部其他電腦可以直接透過A1或A2的IP位址存取其上的服務,就像存取普通網路節點一樣。這樣的設定簡化了網路管理,提高了資源利用率和服務可存取性。
設定橋接網路
在建立橋接網路前,建議先查看目前的網路資訊。

從virbr0橋接設備移除enp6s18網路介面:

配置橋指向br0:

配置br0:

新增一個網路介面到橋接設備:

成功配置後,透過以下命令查看結果如下:

到這裡我們創建的網橋br0就可以使用了,我們創建的虛擬機器就可以使用這兩個網橋,其中br0就是橋接模式,virbr0就是nat模式。