KVM虛擬化的四種簡單網絡模型介紹及實現(二)
三、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虛擬化的四種簡單網絡模型介紹及實現(二)