1. 程式人生 > >KVM虛擬化的四種簡單網絡模型介紹及實現(一)

KVM虛擬化的四種簡單網絡模型介紹及實現(一)

_for only 應該 code eth tun x86_64 信息 dock

KVM中的四種簡單網絡模型,分別如下:
1、隔離模型:虛擬機之間組建網絡,該模式無法與宿主機通信,無法與其他網絡通信,相當於虛擬機只是連接到一臺交換機上。
2、路由模型:相當於虛擬機連接到一臺路由器上,由路由器(物理網卡),統一轉發,但是不會改變源地址。
3、NAT模型:在路由模式中,會出現虛擬機可以訪問其他主機,但是其他主機的報文無法到達虛擬機,而NAT模式則將源地址轉換為路由器(物理網卡)地址,這樣其他主機也知道報文來自那個主機,在docker環境中經常被使用。
4、橋接模型:在宿主機中創建一張虛擬網卡作為宿主機的網卡,而物理網卡則作為交換機。

下面分別對四種網絡模型進行解讀和實現,在之前,首先還是先交待一下環境:

宿主機:VMware虛擬機,2CPU,4G內存,40G存儲
宿主機操作系統:CentOS 6.5 x86_64
網卡1:192.168.49.10 (NAT模式) 默認網關:192.168.49.2 可訪問外網
網卡2:172.28.88.100 (Host-Only模式)

一、隔離模型

技術分享圖片

如上圖(圖片搜集於網絡)所示,Guest1和Guest2都是在宿主機上創建的虛擬機,虛擬機的網卡分為前半段和後半段,前半段位於虛擬機上,後半段在宿主機上,按照圖中所示,前半段就是eth0,它是在虛擬機內部看到的網卡名字,而後半段就是vnet0和vnet1,它們是在宿主機上看到的網卡名字。實際上,在Guest1上所有發往eth0的數據就是直接發往vnet0,是由vnet0進行數據的傳送處理。

在隔離模式下,宿主機創建一個虛擬交換機vSwitch,然後把vnet0和vnet1接入到該虛擬交換機,交換機也可以叫做bridge,因為vnet0和vnet1在一個網橋內,所以可以互相通信,而虛擬機的eth0是通過後半段進行數據傳輸,所以只要虛擬機的前半段ip在一個網段內,就可以互相通信,這就是隔離模式。

實現方式:
1、創建虛擬網橋br0
[root@kvm-node1 ~]# yum -y install bridge-utils
[root@kvm-node1 ~]# brctl addbr br0
[root@kvm-node1 ~]# ifconfig br0 up
[root@kvm-node1 ~]# brctl show

bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
2、編寫一個網卡啟動腳本
[root@kvm-node1 ~]# vi /opt/tools/qemu-ifup
[root@kvm-node1 ~]# cat /opt/tools/qemu-ifup

#!/bin/bash

BRIDGE=br0
if [  -n $1 ];then
    ip link set $1 up
    sleep 2
    brctl addif $BRIDGE $1
    [ $? -eq 0 ] && exit 0 || exit 1
else
    echo -e "\033[1;31mYou must give an interface.\033[0m"
    exit 3
fi

3、使用qumu-kvm創建2臺虛擬機
創建第一臺名為centos5-1的kvm虛擬機:
qemu-kvm -name "centos5-1" -smp 1 -m 512 -drive file=/images/kvm/centos5.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=00:0c:29:86:4e:1a -net tap,ifname=vnet0.0,script=/opt/tools/qemu-ifup
創建第二臺名為centos5-2的kvm虛擬機:
qemu-kvm -name "centos5-2" -smp 1 -m 512 -drive file=/images/kvm/centos5_2.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=00:0c:29:86:4e:6a -net tap,ifname=vnet0.1,script=/opt/tools/qemu-ifup
這裏我使用了之前安裝過的虛擬機鏡像文件,跳過安裝過程,可以直接進入系統,安裝過程可參照之前的文章。
4、到宿主機上查看虛擬機的網卡後半段
待兩臺虛擬機都啟動後,我們在宿主機中可以看到有2章虛擬網卡vnet0.0和vnet0.1,這就是兩臺虛擬機網卡的後半段。
[root@kvm-node1 ~]# ifconfig
...........
vnet0.0 Link encap:Ethernet HWaddr D2:65:97:7B:15:00
inet6 addr: fe80::d065:97ff:fe7b:1500/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:4993 (4.8 KiB) TX bytes:468 (468.0 b)

vnet0.1 Link encap:Ethernet HWaddr 82:94:C0:92:18:34
inet6 addr: fe80::8094:c0ff:fe92:1834/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:5329 (5.2 KiB) TX bytes:468 (468.0 b)

查看虛擬網橋信息:
技術分享圖片

5、登錄虛擬機中進行查看
技術分享圖片
由於我並沒有dhcp服務,所以虛擬機獲取不到IP地址,我選擇手動配置兩個IP地址,
技術分享圖片
此時,兩個虛擬機的eth0已經配好了IP地址,我們嘗試在每臺虛擬機上ping對方的IP地址,
技術分享圖片
兩臺虛擬機可以互相通信了,那麽虛擬機和宿主機之間呢?
技術分享圖片
虛擬機無法ping通宿主機
技術分享圖片
宿主機也無法ping通虛擬機。
這就是隔離模型,虛擬機之間可以互相通信,宿主機和虛擬機之間的網絡是隔離開的。

二、路由模型

技術分享圖片

在隔離模型的基礎上,將宿主機的一塊虛擬網卡virnet0加入到虛擬網橋中,這樣virnet0就可以和虛擬機通信,通過將虛擬機的默認網關設置為virnet0的IP地址,然後在宿主機中打開IP地址轉發,使得虛擬機可以訪問宿主機。不過此時虛擬機僅僅可以將報文發送到外部網絡,因為外部網絡沒有路由到虛擬機中,所以外部網絡無法將報文回傳給虛擬機。

實現方式:
1、在宿主機上創建一個虛擬網卡
[root@kvm-node1 ~]# yum -y install tunctl
[root@kvm-node1 ~]# tunctl -b
tap0
[root@kvm-node1 ~]# ifconfig tap0
tap0 Link encap:Ethernet HWaddr 12:37:6E:87:3C:A8
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
2、將tap0網卡加入到虛擬網橋br0中
[root@kvm-node1 ~]# ifconfig tap0 192.168.220.100 up
[root@kvm-node1 ~]# brctl addif br0 tap0
[root@kvm-node1 ~]# ifconfig tap0 0.0.0.0
[root@kvm-node1 ~]# ifconfig br0 192.168.220.100 netmask 255.255.255.0 up
技術分享圖片
3、進入虛擬機並將虛擬機的默認網關設置為tap0的IP地址
技術分享圖片
4、打開宿主機的ip轉發功能
[root@kvm-node1 ~]# sed -i ‘/ip_forward/s/0/1/‘ /etc/sysctl.conf
[root@kvm-node1 ~]# sysctl -p
5、嘗試在虛擬機中ping宿主機的IP地址
技術分享圖片
可以ping通宿主機的IP地址
6、嘗試ping宿主機的網關的ip地址
技術分享圖片
無法ping通宿主機的網關的IP地址
之所以無法ping通,是因為報文發到網關後,網關找不到回包的路由,所以報文無法回復,這時候,我們通過在宿主機上添加一條iptables規則,使得網關可以回包。
iptables -t nat -A POSTROUTING -s 192.168.220.0/24 -j MASQUERADE
技術分享圖片
此時,我們再次嘗試在虛擬機上ping宿主機網關地址
技術分享圖片
已經可以ping通宿主機的網關了
7、在宿主機外的主機上ping虛擬機的地址
比如,我在運行VMware的主機上,當然宿主機的網關也在該主機上(熟悉VMware的應該了解),此時我的windows主機的IP地址有192.168.49.1和172.28.88.1,我嘗試在windows主機上去ping虛擬機的地址。
技術分享圖片
此時,外部主機(windows主機)也無法ping通虛擬機,那麽為了能ping通,我們還需要添加一條路由,
route add 192.168.220.0 mask 255.255.255.0 192.168.49.10
技術分享圖片
添加該路由後,外部主機已經可以和虛擬機通信了。

通過上述實踐,也可以發現路由模型的缺陷,雖然虛擬機能同宿主機通信,也能將數據包發到外部網絡,但是外部網絡無法回傳數據包,要想外部網絡能與虛擬機通信,就要添加對應的路由規則。這對於大規模的虛擬環境,顯然是不切實際的。

KVM虛擬化的四種簡單網絡模型介紹及實現(一)