kvm網絡模式


隔離模型

虛擬機網卡被分成前半段和后半段,彼此之間存在對應關系。前半段在虛擬機上通常表現為eth0、eth1等接口,后半段是物理主機上是一個虛擬接口,通常表現為vnet0、vnet1,與網橋關聯(vnet0、vnet1通常稱為tap設備)。任何時候guest1發往eth0的報文都發往vnet0,guest2發往eth0的報文都發往vnet1,vnet0和vnet1是網橋(虛擬交換機)上的接口,guest1和guest2通信則通過網橋才能進行通信,實現二層通信。(即相當於guest1和guest2連接至同一個網橋上)
網橋上沒有關聯物理網卡,所有隔離模型無法與外部網絡進行通信也無法與主機自身通信。隔離模型類似於vmware中的VMnet2、VMnet3等虛擬通道。
 
僅主機模式
隔離模型中在物理機上添加一個虛擬網卡並將該虛擬網卡后半段關聯至網橋,只要虛擬機中網卡和該虛擬網卡后半段IP地址設置成同一個網段,guest1和guest2和物理機的虛擬網卡就能夠通信了,但是還是無法與物理機之外的網絡通信。
 
路由模型

隔離模型中在物理機上添加一個虛擬網卡並將該虛擬網卡后半段關聯至網橋,只要虛擬機中網卡和該虛擬網卡后半段IP地址設置成同一個網段,guest1和guest2和物理機的虛擬網卡就能夠通信了,但是還是無法與物理機之外的網絡通信。可以將guest的網關指向物理機虛擬網卡的地址,並且在物理機上打開核心轉發功能,guest就能夠實現與外部網絡進行通信。
這樣存在一個問題:guest收不到外部網絡回應的報文,路由模型需要在外部網絡中為guest網段添加回程路由,這樣會相當麻煩。即路由模型可以與外部網路進行通信了,但是無法作為通信目標使用。

 
NAT模型

為了解決路由模型中存在的問題,在物理主機上添加一個nat server,所有來自內部的報文通過物理網卡出去之前都將源地址轉化成物理網卡的地址,所有的回應報文也都將回應給物理網卡,物理網卡由nat會話表再將物理網卡的地址轉化回內部主機的地址。

 
橋接模型

橋接即在物理機上創建一個網橋並關聯物理網卡至網橋,一旦將網卡設置為網橋可以將物理網卡看成是一台交換機,同時也會在物理機上為該物理網卡創建一個虛擬網卡(br0)並將物理網卡原本使用的MAC地址放至br0(物理網卡的IP地址配置在網橋上),同時物理網卡打開混雜模式(不管報文的目標mac地址是不是自身,該網卡將報文全部接收)。這樣所有guest通過eth*發往vnet*的報文直接發往該網橋,而網橋有上關聯了物理網卡,從而來自guest的報文直接從物理網卡發出;當網卡收到回應報文時,因為開啟了混雜模式會接收所有的報文,報文目標MAC如果是的物理網卡就會將回應報文轉交給br0,報文目標MAC如果是虛擬機就會將回應報文轉虛擬機對應的網卡。(即物理網卡本身就相當於一個交換機,這種網橋一般稱為物理網橋)

 
測試環境 
虛擬機網段:10.0.100.0/24;物理主機ip地址:192.168.1.230(eth3);用於測試的外部網絡地址:192.168.1.25。
 
添加一個網橋
依賴的軟件包是bridge-utils

依賴的模塊:即在內核級別軟件模擬一個軟交換機,即使用bridge-utils向內核發指令,由內核創建網橋設備,網橋是在內核中實現的。

#brctl -h     查看幫助信息
#brctl addbr br0     添加網橋設備,命名為br0
#brctl stp br0 off    關閉stp
#ifconfig -a

表現為一個網絡接口,使用ifconfig無法查看,原因是br0未激活。

#brctl show  查看當前主機上的所有橋設備
 
#ip link set dev br0 up   激活接口
注意:以上添加網橋的方式,重啟后就消失了。要想永久生效,需要自定義腳本,創建kvm虛擬機時同時指定腳本路徑。
#!/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
/etc/qemu-ifup
#!/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
/etc/qemu-ifdown

#chmod +x /etc/qemu-ifup

#chmod +x /etc/qemu-ifdown

 
設置隔離模型
#brctl addbr br0
#ip link set dev br0 up    激活網橋
添加第一台虛擬機至網橋
#qemu-kvm -m 128 -cpu host -smp 2 -name "test1" -drive file=/image/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeba
ck -nographic -net nic -net tap,ifname=vif0.0,script=/etc/qemu-ifup
 
  添加第二台虛擬機至同一網橋
#qemu-kvm -m 128 -cpu host -smp 2 -name "test2" -drive file=/image/cirros-no_cloud-0.3.0-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeba
ck -nographic -net nic,macaddr=52:54:00:12:34:57 -net tap,ifname=vif1.0,script=/etc/qemu-ifup
#ifconfig    在物理機上查看創建的tap設備(即后半段)
#brctl show    查看網橋關聯的tap設備

 

分別為創建的虛擬機網卡設置ip地址,兩台虛擬機就可以正常通信:
虛擬機1:
#ifconfig eth0 10.0.100.1/24
虛擬機2:
ifconfig eth0 10.0.100.2/24d
 
設置路由模型
在上述隔離模式的基礎上執行以下操作。
在物理機上添加一塊虛擬網卡(前半段和后半段):
#ip link add veth1.0 type veth peer veth1.1
#ifconfig -a     查看生成的虛擬網卡
激活網卡:
#ip link set veth0 up
#ip link set veth0.1 up
將veth1:0(后半段)關聯至網橋:
#brctl addif br0 veth1.0
查看網橋上關聯的接口:
#brctl show
為veth0(前半段)配置ip地址:
#ifconfig veth0 10.0.100.3/24
此時虛擬機1和虛擬機2能夠與veth0虛擬接口進行通信,要實現虛擬機能夠與物理機物理網卡通信,要在虛擬機上指定網關(網關為veth0):
虛擬機1:
#route add default gw 10.0.100.3
虛擬機2:
#route add default gw 10.0.100.3
此時虛擬機能夠與網絡主機通信,要實現虛擬機與外部網絡通信,主機要開啟核心轉發功能:
#echo 1 > /proc/sys/net/ipv4/ip_forward
存在的問題是:無法收到回包,可以通過在外部網絡中添加路由實現(這種方式不太現實),也可以通過NAT模式實現(這種方式比較理想)。
 
設置NAT模型
 添加iptables規則:
#iptables -t nat -A POSTROUTING -s 10.0.100.0/24 -o eth3 -j SNAT --to-source 192.168.1.230
#iptables -t nat -L -n
#tcpdump -i veth0 -nn icmp    抓包查看ping過程
測試發現虛擬機無法ping通外部網絡,導致的原因是通信鏈太長,如下圖:
在上述的網絡模式中,br0作為一個網橋,在主機上顯示的是一個虛擬網卡即ifconfig查看是一個虛擬網卡,同時主機又添加了一張虛擬網卡(虛擬網卡的前半段關聯至網橋,即在物理機上多了兩個虛擬接口)。這樣會導致整個通信鏈過長。由於br0本身就是虛擬網卡,可以直接在br0設置一個ip地址作為虛擬機的網關,完全沒有必要在物理機上再生成一張虛擬網卡。
 
刪除虛擬網卡:
#ip link delete veth1.0 type veth
為br0配置IP地址:
#ifconfig br0 10.0.100.3
這時就可以ping通外部網絡了。可以通過抓包查看地址轉換過程:
#tcpdump -i br0 -nn icmp
 #tcpdump -i eth3 -nn icmp
 
 
設置橋接模型

在橋接模型下,需要將物理網卡關聯至網橋而且網橋上不能配置地址,再上述的環境中實現要先拆除網橋上配置的地址:

#ip addr del 10.0.100.3/24 dev br0

刪除物理網卡上的IP地址;將物理網卡添加至br0上;為br0配置地址(原先eth3的地址配置在br0上):

#ip addr del 192.168.1.230 dev eth3; brctl addif br0 eth3; ip addr add 192.168.1.230 dev br0;

#ifconfig   此時的地址在br0上,物理網卡eth3無地址

#brctl show  網橋上關聯了一張物理網卡和兩個虛擬機網卡的后半段即虛擬網卡的后半段直接關聯至物理網卡

設置虛擬機地址:

虛擬機1:

#ifconfig eth0 192.168.1.67/24 

虛擬機2:

#ifconfig eth0 192.168.1.68/24

測試:虛擬機可以直接ping通外部網絡

虛擬機1:

#ping 192.168.1.230  通

#ping 192.168.1.25  通

 

 

 
 
 
 
 
 
 

 

 

 

 

 


免責聲明!

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



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