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

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

str drive 51cto -c water -a return dfa 模型

接上篇,介紹NAT網絡模型和橋接模型。

三、NAT模型

技術分享圖片

NAT模型其實就是SNAT的實現,路由中虛擬機能將報文發送給外部主機,但是外部主機因找不到通往虛擬機的路由因而無法回應請求。但是外部主機能同宿主機通信,所以在宿主機上添加一個NAT轉發,從而在外部主機請求虛擬機時,將虛擬機的IP地址轉換為宿主機上的某個地址,從而實現外部網絡與虛擬機的通信,其實際上只是通過iptables的nat表的POSTROUTING鏈實現地址轉換罷了。

實現方法:
1、編寫虛擬機啟動腳本
[root@kvm-node1 ~]# cat /opt/tools/qemu-natup

#!/bin/bash

bridge=br0
net="192.168.122.1/24"

checkbr(){
    if brctl show |grep -i $1;then
        return 0
    else
        return 1
        fi
}

initbr(){
    brctl addbr $bridge
    ip link set $bridge up
    ip addr add $net dev $bridge
}

enable_ip_forward(){
    sysctl -w net.ipv4.ip_forward=1
    sysctl -p
}

setup_nat(){
    checkbr $bridge
    if [ $? -eq 1 ];then
        initbr
        enable_ip_forward
        iptables -t nat -A POSTROUTING -s $net ! -d $net -j MASQUERADE
    fi
}

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

2、編寫虛擬機停止腳本
[root@kvm-node1 ~]# cat /opt/tools/qemu-natdown

#!/bin/bash

bridge=br0
net="192.168.122.0/24"

remove_rule() {
    iptables -t nat -F
}

isalone_bridge() {
    if ! brctl show | awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &> /dev/null; then
        ip link set $bridge down
        brctl delbr $bridge
        remove_rule
    fi
}

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

3、啟動虛擬機
qemu-kvm --name "centos5-nat" -smp 1 -m 512 -cpu host --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-natup,downscript=/opt/tools/qemu-natdown -daemonize
4、進入虛擬機,配置網絡
技術分享圖片
5、給虛擬機添加默認網關,將br0的IP地址設置為虛擬機的默認網關

技術分享圖片
可以看到,添加了默認網關之後,虛擬機已經可以ping通宿主機了。另外,因為宿主機上添加了iptables規則,所以此時也可以ping通外部網絡(192.168.49.1)了,NAT模型的實現完成。

四、橋接模型

技術分享圖片

在宿主機中創建一個橋設備,把宿主機的eth0放在橋上,這樣Guest1上的eth0將報文發給vnet0,再直接發給宿主機上的eth0,將源地址改為宿主機上的eth0的地址。
當響應報文到達物理機上的eth0時如何判斷此響應報文是發給虛擬機的還是物理機自己的?
物理機會先創建一個虛擬網卡,在物理機上打開混雜模式(無論mac地址是不是自己的都將接收響應報文),如果mac地址是自己的則轉發給虛擬網卡,如果不是自己的則轉發給vnet0,這就是橋接模型,因為物理機的網卡具有橋的功能所以叫做橋接模型。

實現方式:
1、創建虛擬機啟動腳本
[root@kvm-node1 tools]# cat qemu-brup

#!/bin/bash

bridge=br0
device=eth1
device_ip=`ifconfig eth1|awk ‘/inet addr/ {print $2}‘ |cut -d: -f2`

checkbr(){
    if brctl show |grep -i $1;then
        return 0
    else
        return 1
    fi
}

initbr(){
    brctl addbr $bridge
    ip link set $bridge up
    brctl addif $bridge $device
    ifconfig $device 0.0.0.0
    ifconfig $bridge ${device_ip} netmask 255.255.255.0 up
}

setup_nat(){
    checkbr $bridge
    if [ $? -eq 1 ];then
        initbr
    fi
}

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

2、創建虛擬機停止腳本
[root@kvm-node1 tools]# cat qemu-brdown

#!/bin/bash

bridge=br0
device=eth1

isalone_bridge() {
    if ! brctl show | awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &> /dev/null; then
        ip link set $bridge down
        brctl delbr $bridge
        remove_rule
    fi
}

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

3、使用qemu-kvm創建虛擬機
qemu-kvm --name "centos5-bridge" -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:6a -net tap,ifname=vnet0.0,script=/opt/tools/qemu-brup,downscript=/opt/tools/qemu-brdown --daemonize
4、登錄虛擬機,檢查虛擬機網絡
技術分享圖片
虛擬機的ip段和宿主機上的eth1在一個網段(因為使用宿主機的eth0的IP地址進行ssh,所以這裏使用eth1進行橋接)
5、在虛擬機上ping宿主機測試
技術分享圖片
虛擬機可以ping通宿主機的IP地址(eth1的IP地址),也可以ping通外部網絡(eth1的網關地址)
至此,橋接模型實現完成。

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