linux中的虛擬化網絡模型及各種模型實現


第一種隔離模型:

 

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    

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

 

 在此基礎上實現基於路由的NAT模型也簡單了,首先配置br0的ip地址,在虛擬機中添加路由,將網關指向br0,打開核心轉發功能(net.ipv4.ip_forward),添加

一條iptables規則,例如:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.238.150 

192.168.1.0/24:虛擬機所在網段  192.168.238.150:物理網卡地址

 

補充:如果在centos6上此步免去,centos7需安裝安裝iptables,步驟如下

service iptables status 檢查是否安裝了iptables

yum -y install iptables

yum -y install iptables-services

 

systemctl stop firewalld

systemctl mask firewalld  禁用firewalld

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM