先來看看kvm的nat網絡模型是什么樣的
nat網絡
在安裝kvm后,會自動創建一個默認的nat網絡,虛擬機可以使用這個nat網絡訪問外部網絡,這個nat網絡由一個虛擬交換機和若干iptables規則組成,這樣說可能不太容易理解,我們來看一張示意圖。
從上述示意圖中可以看出,在kvm的nat網絡中,虛擬機連接到虛擬交換機,經過iptables規則的nat處理,通過宿主機的物理網卡與物理交換機所在的網絡通訊,但是需要注意,這里的iptables規則只是對虛擬機的ip地址進行了snat(源地址轉換)處理,並沒有進行dnat(目標地址轉換)處理,所以,虛擬機可以直接訪問物理交換機所在的網絡,但是物理交換機所在網絡的其他主機,無法直接訪問虛擬機,如果想要在物理交換機所在的網絡直接訪問虛擬機中的服務,則需要手動的進行dnat,為了方便描述,下文將物理交換機所在的網絡稱之為”外部網絡”,這里說的外部網絡不是公網,而是辦公環境的網絡,也就上圖中物理交換機所在的網絡,”外部網絡”的”外部”是針對kvm虛擬機而言的。
為了更加具象化的理解上面的示意圖,我們可以通過命令,查看一下這些設置。
在宿主機中,執行ip a命令,可以看到如下信息
上述信息中,eth0是宿主機的物理網卡,virbr0是kvm為默認nat網絡創建的虛擬交換機,當使用默認nat網絡時,虛擬機會連接到virbr0交換機,由於我沒有啟動任何虛擬機,所以不太容易觀察到對應網卡的變化,如果我們啟動一個虛擬機,kvm會自動創建出一個新的虛擬網卡,我們來做個實驗,啟動一個提前配置好的虛擬機,kvm1,如下所示:
啟動kvm1虛擬機后,再次使用ip a命令查看網卡信息,可以看到比沒有啟動虛擬機之前,多出了一個網卡,如下
如上所示,啟動kvm1后,多出了一個vnet0網卡,vnet0網卡的作用就是為了讓kvm1虛擬機能夠連接到virbr0交換機,我們可以這樣想象,有一根網線,網線的一頭插在kvm1虛擬機上,另一頭插在virbr0上,如果網線想要插在主機或者交換機上,總要有網線口吧,kvm1虛擬機的網線口在虛機內部的虛擬網卡上,交換機的網線口就是vnet0這個虛擬網卡,只不過,vnet0這個網卡(網線口)是單獨為了kvm1准備的,執行brctl show命令,可以更加清楚的看到virbr0和vnet0的關系,如下:
可以看到,當前有一個橋設備,名字叫virbr0,也就是virbr0虛擬交換機,他有兩個接口(網線口),virbr0-nic和vnet0,其中,virbr0-nic接口負責和宿主機的eth網卡連,vnet0接口負責和kvm1虛擬機的eth網卡連,這樣想象就應該有畫面了吧。
我們還可以模擬一下拔網線和插網線,驗證一下我們的想法,用ifconfig vnet0 down命令和ifconfig vnet0 down命令,模擬拔下和插上虛擬交換機這頭的網線,然后觀察kvm1虛擬機中的網絡是否通暢。
如果再啟動一個虛擬機,還能夠看到宿主機又多出了一個網卡,比如,我又啟動了一個kvm5,然后宿主機又多出了一個vnet1網卡,再次使用brctl命令查看,信息如下
細心如你可能已經發現了,似乎有一個規律,就是虛擬機的網卡的mac地址,和其所連接的虛擬交換機的網口的mac地址,都長得特別像,比如,kvm1連得是vnet0,kvm5連的是vnet1,會發現,kvm1的mac地址和vnet0的mac地址很像,kvm5的mac地址和vnet1的mac地址很像,只有前兩位不一樣,可以動手查看一下,這里就不再演示了。
剛才說過,虛擬交換機和宿主機的物理網卡之間的連接,是要經過iptables規則處理的,iptables只進行了snat處理,所以無法直接通過外部網絡直接訪問虛擬機中的服務,除非手動添加dnat規則,我們可以通過iptables命令查看默認創建的nat規則,如果你對iptables不是特別了解,可以參考博客中的關於iptables的文章,直達連接如下:
https://www.zsythink.net/archives/tag/iptables
virbr0虛擬交換機和默認nat網絡下的虛擬機所在的網段是192.168.122.0/24,virbr0的IP地址是192.168.122.1,虛擬機的網關也是指向的192.168.122.1 查看iptables規則,會發現轉發的也都是這個網段的ip地址,最終實現了虛擬機訪問外部網絡的功能。
了解了上面的知識,我們可以把nat網絡的模型圖細化一下,理解成下面的樣子
聊完了nat網絡,現在聊聊橋接網絡
橋接網絡
在生產環境中,我使用的是橋接的網絡模型,橋接的網絡模型有一個優點,就是虛擬機和宿主機在網絡上是平級的,比如,公司有幾台服務器,服務器所在的網段是192.168.99.0/24,服務器A的IP地址是192.168.99.66,我們在服務器A上安裝了KVM,並且創建了兩台虛擬機,虛擬機A1和虛擬機A2,A1和A2使用橋接的網絡模型,A1的IP地址可以設置成192.168.99.67,A2的IP地址可以設置成192.168.99.68,對於公司的物理交換機而言,宿主機A、虛機A1和虛機A2就是三台連到物理交換機的電腦,在物理交換機眼里,它們三個是相互獨立的,如果A1或者A2上部署了某些服務,公司的電腦可以直接通過A1或者A2的IP地址訪問到對應的服務。
橋接網絡模型的示意圖如下:
如上圖所示,我們需要先在宿主機中創建一個虛擬交換機(橋設備),然后把宿主機的物理網卡連接到虛擬交換機上,此時,我們可以把宿主機的物理網卡想象成虛擬交換機的一個網口,虛擬交換機通過這個網口,插上網線,橋接到物理交換機上,如果虛擬機使用了橋接網絡,當啟動某個虛擬機時,kvm會自動創建一個虛擬網卡(相當於在虛擬交換機上創建了一個網口),以便虛擬機可以連接到虛擬交換機,從而通過虛擬交換機橋接到物理交換機上,這時,我們可以通過虛擬交換機的IP地址連接到宿主機,通過虛擬機的IP地址連接到虛擬機,就拿剛才舉例的IP地址來說,上圖中虛擬交換機的IP地址此時是192.168.99.66,虛擬機1的IP地址可能是192.168.99.67,虛擬機2的IP地址可能是192.168.99.68,對於物理交換機所在的網絡來說,此時宿主機和虛擬機是平級的,它們的網關都是指向了物理交換機所在網絡的網關。
了解完了相關概念以后,我們來動手操作一下,在實操之前,我先來描述一下我的測試環境,以便大家心里有數,前文說過,為了方便測試,我們在筆記本中通過虛擬化軟件創建了一個虛擬機,用這個虛擬機模擬KVM宿主機,我們可以使用vmware或者任何常見的虛擬化軟件來模擬KVM宿主機,此處使用的虛擬化軟件是Parallels Desktop(下文簡稱pd),無論是vmware還是pd,創建虛擬機后,通常都會默認使用自帶的NAT網絡(虛擬化軟件的NAT網絡,和KVM的網絡模型沒有直接關系),我創建的KVM宿主機也使用了pd默認的共享網絡(其實就是pd的NAT網絡),但是其實,我們不應該使用虛擬化軟件的NAT網絡,而是應該使用虛擬化軟件的橋接網絡,因為我們需要模擬KVM宿主機通過網線連接到物理交換機的這個過程(不經過nat處理,KVM宿主機直接連接到物理網絡獲取IP的過程),所以,我們需要使用橋接的方式,那么很簡單,我們只需要為KVM宿主機再創建一個網卡,使用虛擬化軟件的橋接網絡就行了,有了思路,我們來操作一下。
此處以pd的操作為例,其他虛擬化軟件操作類似,請自行根據實際情況進行操作,如果你的KVM宿主機已經使用了虛擬化軟件的橋接網絡,則可以跳過相關的操作,執行pd操作前,需要提前關閉KVM宿主機。
找到KVM宿主機的硬件配置界面,如下圖所示,KVM宿主機默認使用的是pd的共享網絡,我們再創建一個網卡,使用pd的橋接網絡,點擊下圖中的 “加號”,點擊 “網絡”
在新建的網卡中,選擇通過哪個網絡接口進行橋接,下圖中的”USB 10/100/1000 LAN”是筆記本上的有線網口(筆記本插着擴展塢,擴展塢上連的網線,所以顯示的是USB設備),這里需要根據自己的具體情況進行選擇,建議把筆記本插上網線,選擇有線接口進行橋接,因為我在進行實驗時,如果使用無線網絡橋接,會影響后面的測試,導致KVM橋接網絡不可用,我對無線橋接和pd的設置不了解,沒有找到問題在哪里,所以此處直接在pd中選擇有線接口橋接,設置完成后,啟動KVM宿主機。
進入KVM宿主機,查看網卡信息如下,可以看到已經多出了一個eth1網卡,我們就用這個網卡模擬KVM宿主機的物理網卡,這個網卡的IP地址是192.168.100.239,而我所在的辦公網絡中,三層交換機分配的IP段就是192.168.100.0/24,所以我們已經成功的把KVM宿主機“插上網線了”,網線的另一頭連的物理交換機。
剛才說過,如果想要使用KVM的橋接網絡,需要先在KVM宿主機中先創建一個橋設備,然后再把宿主機的物理網卡連接到橋設備中,我先描述一下大致步驟,然后再操作,步驟如下:
步驟1:創建一個橋設備(就是剛才說的虛擬交換機),將橋設備的IP地址設置成物理網絡網段中的一個可用IP(剛才說過此處實驗網段是192.168.100.0/24,根據實際的網絡情況進行設置),網關指向物理網絡所在的網關,此處網關是192.168.100.254。
步驟2:修改KVM宿主機的物理網卡(此處的eth1)的配置,將物理網卡連接到虛擬交換機,作為橋設備的網口使用,以便橋設備可以連接到物理交換機,此時的eth1不需要綁定任何IP地址,只需要作為橋設備的一個網口即可,所以,在步驟1中,我們也可以直接將橋設備的IP地址設置成192.168.100.239,因為最終eth1是不需要綁定IP的。
步驟說明白了,現在來操作,虛擬橋設備其實也是一個虛擬網卡,我們只需要創建一個虛擬網卡的配置文件就行了,KVM的默認nat網絡的虛擬交換機名是virbr0,我們為橋接網絡創建一個virbr1,叫別的名字也行,我就喜歡加序號,virbr1配置文件內容如下:
如上所示,我們創建了一個virbr1的網卡,網卡類型是Bridge,是一個橋設備,配置了開機啟用網卡和靜態IP,IP地址設置的是192.168.100.239,設置子網掩碼、網關和DNS,到這一步,虛擬交換機就算配置完了,現在需要把物理網卡eth1連接到這個設備上,由於我的eth1網卡也是新添加的網卡,所以再創建一個eth1的配置文件,配置內容如下:
eth1的網卡配置也非常簡單,設備類型就是Ethernet網卡,只需要指定連接的橋設備是virbr1即可。
配置完成后,重啟KVM宿主機。
連入KVM宿主機以后,橋接網絡就算設置完成了,我們可以先用brctl show命令查看一下橋設備,如下
可以看到,eth1已經變成virbr1的接口了。
如果你和我的測試環境一樣,可以先把eth0網卡(對應pd的nat網絡使用的網卡)停了,只留下eth1網卡和virbr1橋設備,應該是可以正常訪問外部網絡的。
現在,我們來讓虛擬機連接到KVM的橋接網絡,測試一下能否正常聯網,為了方便測試,我就不創建新的虛擬機了,直接將原來使用nat網絡的虛擬機的配置文件修改一下,讓其連接到新建的橋接網絡,目前已經創建的虛擬機如下:
這些虛擬機都是使用的默認的nat網絡,我們把kvm6的配置修改一下,執行virsh edit kvm6命令,找到kvm6網卡配置的如下部分
我們需要修改interface標簽和source標簽中的配置,修改后內容如下:
如上所示,我們將虛擬機的網絡模型改為了橋接,橋接的設備指向了virbr1(注意:source后面的network改成了bridge),也就是新創建的橋設備的名字,修改完成后,啟動kvm6並登錄進入kvm6,查看虛擬機IP,由於我的kvm6之前設置了靜態IP,所以虛擬機的IP並沒有自動變成192.168.100.0/24網段的IP,如果你的虛擬機使用了DHCP獲取IP,應該已經能夠自動獲取到物理網段的IP地址了,我修改了kvm6,讓其自動獲取IP地址,重啟網絡后,獲取了如下IP地址。
可以看到kvm6的IP地址已經變為了192.168.100.226,經過測試,已經可以正常訪問物理網絡了,證明KVM宿主機的橋接網絡模型是沒有問題的,當然,我們也可以手動的把KVM6的IP設置為192.168.100.0/24網段的靜態IP,就看具體需要了,此時使用brctl show命令再查看一下橋設備的接口,驗證一下之前的理論,就會更加清晰的理解KVM橋接網絡了。
示例中,我們修改了現有虛擬機的網絡配置,如果想要通過命令在創建虛擬機時,就指定使用橋接的網絡,可以使用”–network”參數,指定對應的橋接設備,比如
關於KVM的內容,就先總結到這里,歡迎關注微信公眾號,回復 kvm常用命令腦圖 即可獲取博客中總結的KVM常用命令思維導圖。