首頁 > 軟體

Linux虛擬化網路模型及使用qemu-kvm建立隔離模型

2020-06-16 17:40:45

第一種隔離模型:

Guest1和Guest2都為虛擬機器。

首先要了解在Linux中的虛擬機器的網絡卡都包含前半段和後半段,前半段在虛擬機器上,後半段在宿主機上,這裡以CentOS6為例,上圖eth0為Guest1虛擬機器上的網絡卡,對應的後半段為vnet0,在Guest1上所有發往eth0的資料就直接發往vnet0了,也可以將vnet0看作一塊網絡卡

Guest1如何跟Guest2通訊?

很簡單在宿主機中做一個虛擬交換機,讓vnet0和vnet1分別為虛擬交換機的一個介面,交換機也可叫做bridge,只要兩個虛擬機器網絡卡的前半段的ip地址在同一個網段中,就可以相互通訊了,這就是隔離模型

第二種路由模型:

交換機中多了virnet1網絡卡,將eth0和eth1的閘道器指向virnet1,再開啟linux的核心轉發功能,虛擬機器就可以和外部通訊了

開啟核心轉發功能的方法sysctl -w net.ipv4.ip_ipforward=1

第三種NAT模型:

在路由模型中雖然虛擬機器的ip報文能夠發出去跟外部通訊了,但外部主機可能找不到通往虛擬機器的路由卻能跟宿主機通訊,為了虛擬機器能得到外部主機的響應,將發出去跟外部主機通訊的ip報文的源地址都轉換成宿主機物理網絡卡的地址,這就是NAT模型,也是使用得最多的模型

最後一種橋接模型:

在宿主機中建立一個橋裝置,把宿主機的eth0放在橋上,這樣Guest1上的eth0將報文發給vnet0,再直接發給宿主機上的eth0,將源地址改為宿主機上的eth0的地址

當響應報文到達物理機上的eth0時如何判斷此響應報文是發給虛擬機器的還是物理機自己的?

物理機會先建立一個虛擬網絡卡,在物理機上開啟混雜模式(無論mac地址是不是自己的都將接收響應報文),如果mac地址是自己的則轉發給虛擬網絡卡,如果不是自己的則轉發給vnet0,這就是橋接模型,因為物理機的網絡卡具有橋的功能所以叫做橋接模型

如何在linux上建立一個橋裝置?

橋裝置是在核心中實現

modinfo bridge檢視核心是否安裝此模組

建立橋的命令為brctl,使用brctl -h檢視命令幫助,使用brctl addbr br0就建立了一個叫br0的網路介面

brctl show 顯示當前主機上的所有橋

ifconfig br0 up 啟用br0介面

qemu-kvm net選項介紹

nic、tap和user三種型別網路介面的屬性,nic就是虛擬機器網絡卡的前半段,而tap就是對應的後半段

net nic: 建立一個新的虛擬機器網絡卡介面,使用方法:

    -net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]

    建立一個新的網絡卡裝置並連線至指定的vlan中,macaddr用於為其指定MAC地址

    model指定網絡卡型別,qemu可以模擬多個型別的網絡卡裝置,如virtio,PC架構上預設的NIC為e1000,可以使用“qemu-kvm -net nic,model=?”來獲取當前平台支援的類      

    name用於指定一個在監控時顯示的網絡卡裝置名稱

    -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]

    通過物理機的TAP網路介面連線至指定vlan中,ifname指定網絡卡後半段的名字

    虛擬機器啟動時,網絡卡的後半段不會自動新增,需要一個指令碼來新增,使用script=file指定的指令碼(預設為/etc/qemu-ifup)來

    設定當前網路介面,並使用downscript=file指定的指令碼(預設為/etc/qemu-ifdown)來撤消介面設定,使用script=no和  

    downscript=no可分別用來禁止執行指令碼

qemu-kvm -m 128 -cpu host -smp 2 -name "first" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vnet0.0,script=no

啟動一個虛擬機器,不指定tap指令碼

回到物理機上執行ifconfig -a

虛擬機器網絡卡後半段被自動新增了,但因為沒有指定指令碼而沒有生效

啟動指令碼範例:vim /etc/qemu-ifup

    #!/bin/bash
    #
    bridge=br0

    if [ -n "$1" ]; then
        ip link set $1 up
        sleep 1
        brctl addif $bridge $1
    [ $? -eq 0 ] && exit 0 || exit 1
        else
        echo "Error: no interface specified."
    exit 1
    fi

qemu-kvm會在建立啟動虛擬機器時自動把虛擬機器網絡卡的後半段的名字當作引數傳遞給此指令碼

關閉指令碼範例:vim /etc/qemu-ifdown

    #!/bin/bash
    #
    bridge=br0

    if [ -n "$1" ];then
        brctl delif $bridge $1
        ip link set $1 down
        exit 0
    else
        echo "Error: no interface specified."
        exit 1
    fi

qemu-kvm -m 128 -cpu host -smp 2 -name "first" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vnet0.0,script=/etc/qemu-ifup

驗證:

vnet0.0已經被新增到物理機的橋上了    

再啟動一個虛擬機器,兩個虛擬機器中將網絡卡地址設定到同一網段,兩台虛擬機器就可以通訊了,不過記得建立虛擬機器時,指定MAC地址因

為不指定的話兩台虛擬機器的MAC地址是相同的,導致無法通訊,設定MAC時前三位不要動固定:52:54:00後三位自己更改

例如:    

qemu-kvm -m 128 -cpu host -smp 2 -name "second" -drive file=/root/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic,macaddr=52:54:00:11:22:33 -net tap,ifname=vnet0.1,script=/etc/qemu-ifup    

到此一個隔離模型的虛擬網路就建立完成了

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-05/131830.htm


IT145.com E-mail:sddin#qq.com