橋接還是 NAT?KVM 網(wǎng)絡配置的最優(yōu)解
在KVM虛擬化里,網(wǎng)絡設置對于虛擬機的連接速度和性能至關重要。libvirt這個工具通過簡化網(wǎng)絡管理,提供了兩種主要的網(wǎng)絡類型:橋接網(wǎng)絡和NAT網(wǎng)絡。這兩種方式適合不同的使用場景,比如橋接網(wǎng)絡更適合正式的生產(chǎn)環(huán)境,而NAT網(wǎng)絡則更適合開發(fā)或測試環(huán)境。
NAT網(wǎng)絡
裝了KVM之后,它會自動設置一個默認的NAT網(wǎng)絡。這樣,你的虛擬機就能通過這個NAT網(wǎng)絡上網(wǎng)了。這個NAT網(wǎng)絡其實就是一個虛擬的交換機加上一些網(wǎng)絡規(guī)則組成的。聽起來可能有點復雜,我們可以通過一張圖來更清楚地理解。
在KVM的NAT網(wǎng)絡中,虛擬機通過虛擬交換機與宿主機相連。通過iptables的SNAT規(guī)則,將虛擬機的IP地址轉(zhuǎn)換為宿主機的IP地址后,虛擬機就能利用宿主機的物理網(wǎng)卡訪問外部網(wǎng)絡了。由于只設置了SNAT而沒有設置DNAT,因此虛擬機可以訪問外部網(wǎng)絡,但外部網(wǎng)絡不能直接訪問虛擬機。若要讓外部網(wǎng)絡能夠訪問虛擬機的服務,則需手動配置DNAT。"外部網(wǎng)絡"在這里指的是局域網(wǎng)(如辦公環(huán)境內(nèi)的網(wǎng)絡),而非互聯(lián)網(wǎng)。
enp6s18是電腦的真實網(wǎng)卡,而virbr0是KVM為默認NAT網(wǎng)絡設置的虛擬交換機。使用默認NAT時,虛擬機會連接到virbr0。由于當前沒有運行虛擬機,因此看不到網(wǎng)卡變化。如果啟動一個虛擬機(如ubuntu-cloud),KVM會為其創(chuàng)建一個新的虛擬網(wǎng)卡。接下來我們通過啟動這臺虛擬機來看看會發(fā)生什么。
當你啟動了ubuntu-cloud虛擬機之后,再次運行ip a命令來檢查網(wǎng)絡接口的信息時,你會發(fā)現(xiàn)比之前多了一個新的網(wǎng)絡接口。這個變化如下所示:
當你啟動ubuntu-cloud虛擬機時,會發(fā)現(xiàn)多了一個名為vnet0的網(wǎng)卡。這個vnet0網(wǎng)卡的作用是連接ubuntu-cloud虛擬機到virbr0交換機。可以想象成一根網(wǎng)線,一端連接ubuntu-cloud虛擬機(通過其內(nèi)部的虛擬網(wǎng)卡),另一端連接virbr0交換機(通過vnet0)。簡而言之,vnet0是為了讓ubuntu-cloud能夠與virbr0通信而專門設置的虛擬網(wǎng)卡。運行brctl show命令可以幫助你更清楚地看到virbr0和vnet0之間的關系。
[root@kylin-node3 ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.5254002285d4 yes virbr0-nic
vnet0
現(xiàn)在有一個叫virbr0的虛擬交換機。它有兩個接口,一個是virbr0-nic,另一個是vnet0。virbr0-nic這個接口是用來連接宿主機上的物理網(wǎng)卡(eth網(wǎng)卡)的,而vnet0這個接口是用來連接ubuntu-cloud虛擬機里的虛擬網(wǎng)卡(eth網(wǎng)卡)的。這樣應該能想象出它們是怎么連接起來的了吧?
了解了上面的知識,我們可以把nat網(wǎng)絡的模型圖細化一下,理解成下面的樣子:
橋接網(wǎng)絡
在我們的生產(chǎn)環(huán)境中,我選擇了橋接網(wǎng)絡模型。這種模式讓虛擬機和宿主機在網(wǎng)絡層面上處于同一級別。例如,我們公司的服務器位于192.168.99.0/24網(wǎng)段,其中一臺服務器A的IP地址是192.168.99.66。在這臺服務器上,我們使用KVM創(chuàng)建了兩臺虛擬機A1和A2,并通過橋接網(wǎng)絡配置分別分配給它們192.168.99.67和192.168.99.68作為IP地址。
從物理交換機的角度來看,宿主機A和虛擬機A1、A2被視為獨立設備,直接連接到交換機。這意味著在網(wǎng)絡層面,這三者被視為獨立個體。因此,公司內(nèi)部其他計算機可以直接通過A1或A2的IP地址訪問其上的服務,就像訪問普通網(wǎng)絡節(jié)點一樣。這樣的設置簡化了網(wǎng)絡管理,提高了資源利用率和服務可訪問性。
配置橋接網(wǎng)絡
在創(chuàng)建橋接網(wǎng)絡前,建議先查看一下當前的網(wǎng)絡信息。
[root@kylin-node1 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.5254002285d4 yes enp6s18
virbr0-nic
從virbr0橋接設備中移除enp6s18網(wǎng)絡接口:
brctl delif virbr0 enp6s18
配置橋指向br0:
[root@kylin-node1 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@kylin-node1 network-scripts]# cat ifcfg-enp6s18
DEVICE=enp6s18
BOOTRPOTO=none
ONBOOT=yes
BRIDGE="br0"
配置br0:
[root@kylin-node1 network-scripts]# cat ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="static"
IPADDR=192.168.31.231
NETMASK=255.255.255.0
GATEWAY=192.168.31.1
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
STP="on"
DELAY="0"
添加一個網(wǎng)絡接口到橋接設備:
brctl addlif br0 enp6s18
成功配置后,通過以下命令查看結(jié)果如下:
[root@kylin-node2 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.bc2411a871b4 no enp6s18
virbr0 8000.5254002285d4 yes virbr0-nic
到這里我們創(chuàng)建的網(wǎng)橋br0就可以使用了,我們創(chuàng)建的虛擬機就可以使用這兩個網(wǎng)橋,其中br0就是橋接模式,virbr0就是nat模式。