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