1. 程式人生 > 其它 >kvm總結(6) : 橋接網路和nat網路

kvm總結(6) : 橋接網路和nat網路

先來看看kvm的nat網路模型是什麼樣的

nat網路

在安裝kvm後,會自動建立一個預設的nat網路,虛擬機器可以使用這個nat網路訪問外部網路,這個nat網路由一個虛擬交換機和若干iptables規則組成,這樣說可能不太容易理解,我們來看一張示意圖。

從上述示意圖中可以看出,在kvm的nat網路中,虛擬機器連線到虛擬交換機,經過iptables規則的nat處理,通過宿主機的物理網絡卡與物理交換機所在的網路通訊,但是需要注意,這裡的iptables規則只是對虛擬機器的ip地址進行了snat(源地址轉換)處理,並沒有進行dnat(目標地址轉換)處理,所以,虛擬機器可以直接訪問物理交換機所在的網路,但是物理交換機所在網路的其他主機,無法直接訪問虛擬機器,如果想要在物理交換機所在的網路直接訪問虛擬機器中的服務,則需要手動的進行dnat,為了方便描述,下文將物理交換機所在的網路稱之為”外部網路”,這裡說的外部網路不是公網,而是辦公環境的網路,也就上圖中物理交換機所在的網路,”外部網路”的”外部”是針對kvm虛擬機器而言的。

為了更加具象化的理解上面的示意圖,我們可以通過命令,檢視一下這些設定。

在宿主機中,執行ip a命令,可以看到如下資訊

  [root@cos7 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever
inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1c:42:65:41:f2 brd ff:ff:ff:ff:ff:ff inet 10.211.55.10/24 brd 10.211.55.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever inet6 fdb2:2c26:f4e4:0:21c:42ff:fe65:41f2/64 scope global mngtmpaddr dynamic valid_lft 2591989sec preferred_lft 604789sec inet6 fe80::21c:42ff:fe65:41f2/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:32:ab:9a brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:32:ab:9a brd ff:ff:ff:ff:ff:ff

上述資訊中,eth0是宿主機的物理網絡卡,virbr0是kvm為預設nat網路建立的虛擬交換機,當使用預設nat網路時,虛擬機器會連線到virbr0交換機,由於我沒有啟動任何虛擬機器,所以不太容易觀察到對應網絡卡的變化,如果我們啟動一個虛擬機器,kvm會自動創建出一個新的虛擬網絡卡,我們來做個實驗,啟動一個提前配置好的虛擬機器,kvm1,如下所示:

  [root@cos7 ~]# virsh list --all Id Name State ---------------------------------------------------- 1 kvm1 running - kvm2 shut off - kvm3 shut off - kvm4 shut off - kvm5 shut off - kvm6 shut off

啟動kvm1虛擬機器後,再次使用ip a命令檢視網絡卡資訊,可以看到比沒有啟動虛擬機器之前,多出了一個網絡卡,如下

  [root@cos7 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1c:42:65:41:f2 brd ff:ff:ff:ff:ff:ff inet 10.211.55.10/24 brd 10.211.55.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fdb2:2c26:f4e4:0:21c:42ff:fe65:41f2/64 scope global mngtmpaddr dynamic valid_lft 2591894sec preferred_lft 604694sec inet6 fe80::21c:42ff:fe65:41f2/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:32:ab:9a brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:32:ab:9a brd ff:ff:ff:ff:ff:ff 5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:60:e4:6a brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe60:e46a/64 scope link valid_lft forever preferred_lft forever

如上所示,啟動kvm1後,多出了一個vnet0網絡卡,vnet0網絡卡的作用就是為了讓kvm1虛擬機器能夠連線到virbr0交換機,我們可以這樣想象,有一根網線,網線的一頭插在kvm1虛擬機器上,另一頭插在virbr0上,如果網線想要插在主機或者交換機上,總要有網線口吧,kvm1虛擬機器的網線口在虛機內部的虛擬網絡卡上,交換機的網線口就是vnet0這個虛擬網絡卡,只不過,vnet0這個網絡卡(網線口)是單獨為了kvm1準備的,執行brctl show命令,可以更加清楚的看到virbr0和vnet0的關係,如下:

  注:執行brctl命令前,需要安裝bridge-utils包 [root@cos7 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.52540032ab9a yes virbr0-nic vnet0

可以看到,當前有一個橋裝置,名字叫virbr0,也就是virbr0虛擬交換機,他有兩個介面(網線口),virbr0-nic和vnet0,其中,virbr0-nic介面負責和宿主機的eth網絡卡連,vnet0介面負責和kvm1虛擬機器的eth網絡卡連,這樣想象就應該有畫面了吧。

我們還可以模擬一下拔網線和插網線,驗證一下我們的想法,用ifconfig vnet0 down命令和ifconfig vnet0 down命令,模擬拔下和插上虛擬交換機這頭的網線,然後觀察kvm1虛擬機器中的網路是否通暢。

如果再啟動一個虛擬機器,還能夠看到宿主機又多出了一個網絡卡,比如,我又啟動了一個kvm5,然後宿主機又多出了一個vnet1網絡卡,再次使用brctl命令檢視,資訊如下

  [root@cos7 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.52540032ab9a yes virbr0-nic vnet0 vnet1

細心如你可能已經發現了,似乎有一個規律,就是虛擬機器的網絡卡的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宿主機“插上網線了”,網線的另一頭連的物理交換機。

  [root@cos7 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1c:42:65:41:f2 brd ff:ff:ff:ff:ff:ff inet 10.211.55.10/24 brd 10.211.55.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fdb2:2c26:f4e4:0:21c:42ff:fe65:41f2/64 scope global mngtmpaddr dynamic valid_lft 2591981sec preferred_lft 604781sec inet6 fe80::21c:42ff:fe65:41f2/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1c:42:4c:13:4a brd ff:ff:ff:ff:ff:ff inet 192.168.100.239/24 brd 192.168.100.255 scope global noprefixroute dynamic eth1 valid_lft 85940sec preferred_lft 85940sec inet6 fe80::3def:65e6:8c09:1fa1/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:32:ab:9a brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:32:ab:9a brd ff:ff:ff:ff:ff:ff

剛才說過,如果想要使用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配置檔案內容如下:

  [root@cos7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr1 DEVICE="virbr1" TYPE="Bridge" ONBOOT="yes" BOOTPROTO="static" IPADDR="192.168.100.239" NETMASK="255.255.255.0" GATEWAY="192.168.100.254" DNS1=8.8.8.8

如上所示,我們建立了一個virbr1的網絡卡,網絡卡型別是Bridge,是一個橋裝置,配置了開機啟用網絡卡和靜態IP,IP地址設定的是192.168.100.239,設定子網掩碼、閘道器和DNS,到這一步,虛擬交換機就算配置完了,現在需要把物理網絡卡eth1連線到這個裝置上,由於我的eth1網絡卡也是新新增的網絡卡,所以再建立一個eth1的配置檔案,配置內容如下:

  [root@cos7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes BRIDGE=virbr1

eth1的網絡卡配置也非常簡單,裝置型別就是Ethernet網絡卡,只需要指定連線的橋裝置是virbr1即可。
配置完成後,重啟KVM宿主機。

連入KVM宿主機以後,橋接網路就算設定完成了,我們可以先用brctl show命令檢視一下橋裝置,如下

  [root@cos7 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.52540032ab9a yes virbr0-nic virbr1 8000.001c424c134a no eth1

可以看到,eth1已經變成virbr1的介面了。
如果你和我的測試環境一樣,可以先把eth0網絡卡(對應pd的nat網路使用的網絡卡)停了,只留下eth1網絡卡和virbr1橋裝置,應該是可以正常訪問外部網路的。

現在,我們來讓虛擬機器連線到KVM的橋接網路,測試一下能否正常聯網,為了方便測試,我就不建立新的虛擬機器了,直接將原來使用nat網路的虛擬機器的配置檔案修改一下,讓其連線到新建的橋接網路,目前已經建立的虛擬機器如下:

  [root@cos7 ~]# virsh list --all Id Name State ---------------------------------------------------- - kvm1 shut off - kvm2 shut off - kvm3 shut off - kvm4 shut off - kvm5 shut off - kvm6 shut off

這些虛擬機器都是使用的預設的nat網路,我們把kvm6的配置修改一下,執行virsh edit kvm6命令,找到kvm6網絡卡配置的如下部分

  <interface type='network'> <mac address='52:54:00:12:0e:f7'/> <source network='default'/> <model type='rtl8139'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>

我們需要修改interface標籤和source標籤中的配置,修改後內容如下:

  <interface type='bridge'> <mac address='52:54:00:12:0e:f7'/> <source bridge='virbr1'/> <model type='rtl8139'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>

如上所示,我們將虛擬機器的網路模型改為了橋接,橋接的裝置指向了virbr1(注意:source後面的network改成了bridge),也就是新建立的橋裝置的名字,修改完成後,啟動kvm6並登入進入kvm6,檢視虛擬機器IP,由於我的kvm6之前設定了靜態IP,所以虛擬機器的IP並沒有自動變成192.168.100.0/24網段的IP,如果你的虛擬機器使用了DHCP獲取IP,應該已經能夠自動獲取到物理網段的IP地址了,我修改了kvm6,讓其自動獲取IP地址,重啟網路後,獲取瞭如下IP地址。

  [root@kvm6 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:12:0e:f7 brd ff:ff:ff:ff:ff:ff inet 192.168.100.226/24 brd 192.168.100.255 scope global noprefixroute dynamic ens3 valid_lft 86342sec preferred_lft 86342sec inet6 fe80::5054:ff:fe12:ef7/64 scope link valid_lft forever preferred_lft forever

可以看到kvm6的IP地址已經變為了192.168.100.226,經過測試,已經可以正常訪問物理網路了,證明KVM宿主機的橋接網路模型是沒有問題的,當然,我們也可以手動的把KVM6的IP設定為192.168.100.0/24網段的靜態IP,就看具體需要了,此時使用brctl show命令再檢視一下橋裝置的介面,驗證一下之前的理論,就會更加清晰的理解KVM橋接網路了。

示例中,我們修改了現有虛擬機器的網路配置,如果想要通過命令在建立虛擬機器時,就指定使用橋接的網路,可以使用”–network”引數,指定對應的橋接裝置,比如

  virt-install --name=kvm7 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2 --network bridge=virbr1 --graphics none --extra-args='console=ttyS0'

關於KVM的內容,就先總結到這裡,歡迎關注微信公眾號,回覆 kvm常用命令腦圖 即可獲取部落格中總結的KVM常用命令思維導圖。