KVM虚拟化的四种简单网络模型介绍及实现(二)

接上篇,介绍NAT网络模型和桥接模型。

三、NAT模型

NAT模型其实就是SNAT的实现,路由中虚拟机能将报文发送给外部主机,但是外部主机因找不到通往虚拟机的路由因而无法回应请求。但是外部主机能同宿主机通信,所以在宿主机上添加一个NAT转发,从而在外部主机请求虚拟机时,将虚拟机的IP地址转换为宿主机上的某个地址,从而实现外部网络与虚拟机的通信,其实际上只是通过iptables的nat表的POSTROUTING链实现地址转换罢了。

实现方法:
1、编写虚拟机启动脚本
[[email protected] ~]# 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、编写虚拟机停止脚本
[[email protected] ~]# 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、创建虚拟机启动脚本
[[email protected] 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、创建虚拟机停止脚本
[[email protected] 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的网关地址)
至此,桥接模型实现完成。

原文地址:http://blog.51cto.com/jerry12356/2132246

时间: 2024-08-30 14:24:25

KVM虚拟化的四种简单网络模型介绍及实现(二)的相关文章

四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT。

四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient region detec显著性检测 laviewpbt  2014.8.3 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享.      先从最简单的最容易实现的算法说起吧: 1

四种简单的sql语句(增删改查语句)

四种简单的sql语句(增删改查语句) 一.插入语句 insert into [table] ([column],[column],[column]) values(?,?,?) 二.删除语句 delete from [table] where column = ? 三.修改语句 update [table] set column = ? where column = ? 四.查询语句 1)查询单条记录的所有字段 select * from [table] where [column] = ? 2

四种简单的排序算法

我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF.Asp.Net MVC.AJAX等,熟练应用一些已经比较成熟的技术,比如Asp.Net.WinForm.还应该有着牢固的计算机基础知识,比如数据结构.操作系统.编译原理.网络与数据通信等.有的朋友可能觉得这方面的东西过于艰深和理论化,望而却步,但我觉得假日里花上一个下午的时间,研究一种算法或者一种数据结构,然后写写心得,难道不是一件乐事么?所以,我打算将一些常见的数据结构和算法总结一下,不一定要集中一段时间花费很大精力

kvm 虚拟化 SMP(对称多处理器)介绍及配置

一.SMP(对称多处理器)介绍 1)SMP简介 在计算机技术非常普及和日益发达的今天,以 Intel.IBM 为代表的一些大公司推动着中央处理器(CPU)技术的飞速发展和更新换代,在现在计算机系统中,多处理器.多核.超线程等技术得到了广泛应用.无论是在企业级和科研应用的服务器领域中:还是个人消费者使用的台式机.笔记本甚至只能手机上,随处可见 SMP(Symmetric Multi-Processor 对称多处理器)系统.在 SMP 系统中,多个程序(进程)可以做到真正的并行执行,而且单个进程的多

四种简单的排序算法的php实现

无聊,用php写几个排序算法,算法介绍请移步这里,这里使用php实现了几个简单的,如下 //选择排序 function selection_sort($arr){ $len = count($arr); if($len <= 1) return $arr; for($i=0; $i<$len; $i++){ $min = $arr[$i]; $pos = $i; for($j=$i+1; $j<$len; $j++){ if($min > $arr[$j]){ $min = $ar

生产环境下戴尔 R820 kvm虚拟化部署四(kvm虚拟机克隆)

五.克隆一台虚拟机 前提: 1.模版机的网卡配置文件中的UUID.MAC地址已经删除([[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0) 2.网卡配置文件已经被清空([[email protected] ~]# > /etc/udev/rules.d/70-persistent-net.rules) 3.模版机处于关机状态 查看克隆的详细信息 克隆过程 raid10的情况下,24G大小克隆需要4分钟左右,具体

Android 四种简单的动画(淡入淡出、旋转、移动、缩放效果)

最近在Android开发当中,用到的动画效果. public void onClick(View arg0) { // TODO 自动生成的方法存根 switch (arg0.getId()) { case R.id.danru://淡入淡出 AnimationSet aset=new AnimationSet(true); AlphaAnimation aa=new AlphaAnimation(1,0); aa.setDuration(2000); aset.addAnimation(aa)

MySQL中四种常用存储引擎的介绍

MySQL常用的四种引擎的介绍 (1):MyISAM存储引擎: 不支持事务.也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 支持3种不同的存储格式,分别是:静态表:动态表:压缩表 静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复:缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把

Android中多线程的使用四种方式最全总结

当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread.通常一个应用的所有组件都运行在这一个Process中,当然,你可以通过修改四大组件在Manifest.xml中的代码块(<activity><service><provider><receiver>)中的android:process属性指定其运行在不同的process中.当一个组件在启动的