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 $ up
sleep
brctl addif $bridge $
[ $? -eq ] && exit || exit
else
echo "Error: no interface specified."
exit
fi
qemu-kvm会在创建启动虚拟机时自动把虚拟机网卡的后半段的名字当作参数传递给此脚本
关闭脚本示例:vim /etc/qemu-ifdown
#!/bin/bash
#
bridge=br0 if [ -n "$1" ];then
brctl delif $bridge $
ip link set $ down
exit
else
echo "Error: no interface specified."
exit
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
linux中的虚拟化网络模型及各种模型实现的更多相关文章
- 聊聊 Linux 中的五种 IO 模型
本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538919&idx=1&sn=6013c451 ...
- Linux中安装配置KVM虚拟化
KVM 概述: KVM 即 Kernel-based Virtual Machine 基于内核的虚拟机. KVM,是一个开源的系统虚拟化模块,自 Linux 2.6.20 之后集成在 Linux 的各 ...
- Linux 中的五种 IO 模型
Linux 中的五种 IO 模型 在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一 ...
- Java基础(一):I/O多路复用模型及Linux中的应用
IO多路复用模型广泛的应用于各种高并发的中间件中,那么区别于其他模式他的优势是什么.其核心设计思想又是什么.其在Linux中是如何实现的? I/O模型 I/O模型主要有以下五种: 同步阻塞I/O:I/ ...
- 浅谈Linux下的五种I/O模型 两篇别人的博客
http://blog.csdn.net/sinat_34990639/article/details/52778562 http://www.cnblogs.com/chy2055/p/5220 ...
- Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机
(1).虚拟化产品对比介绍 虚拟化技术有以下三种:仿真虚拟化,这是一种对系统硬件没有要求,但性能最低的虚拟化技术:半虚拟化,这是一种直接使用物理硬件,性能高,但需要修改内核的虚拟化技术:全虚拟化,这是 ...
- 【转】windows和linux中搭建python集成开发环境IDE
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
随机推荐
- 软件开发过程文档-cgaowei
鸡肋——食之无味,弃之可惜”,软件开发过程文档遭遇了鸡肋一样的境遇. 目前敏捷软件开发过程非常流行.相对于软件开发过程文档,敏捷软件开发过程更加重视可运行的程序.关于软件开发过程文档,两个极端都是不可 ...
- VisualVM 的 OQL 的一些例子
Visual VM的OQL语言是对HeapDump进行查询,类似于SQL的查询语言,它的基本语法如下: select <JavaScript expression to select> [ ...
- 虚拟机与CentOS的安装设置。
点击下一步: 点击稍后安装操作系统. 选择Linux系统,继续下一步 为了方便以后查找文件我们在这把虚拟机的名称改成自己喜欢的, 位置也是在大点的磁盘重新建一个专门存放的文件夹,做到规范. 在这推荐N ...
- .NET连接池的配置 【转】
ADO.Net 在数据库操作过程中默认打开了连接池,不需要再进行手工配置.这个特性可以使数据库操作时效率提高,但也要有相应的代码配合,才能真正提高程序效率. 1.连接字符串 ADO.Net 中的连接池 ...
- Sqlserver中存储过程,触发器,自定义函数(一)
Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. ...
- springMVC整合spring和hibernate4(适合于框架的搭建)
基础的东西不再详细说明,只在这里说明一下主要的配置文件,如何通过配置文件取得sessionFactory . 步骤: 1:在web.xml中引入springmvc的配置文件springmvc.xml( ...
- Socket网络编程例子
1.为了安全的进行通信,基于ACK确认机制----重传机制 使用selector机制的多路复用的IO通信机制,此外还有epoll控制 业务挂接点或者接入点: 常见的接入点: RDBMS进行CRUD M ...
- Flex 医疗行程图
================================================ 病案的质量控制: 1.医生自检,主任检测,病案室检测达到三级检测 2.人工检测,自动检测 3.抽检(采 ...
- C# UserControl 判断DesignMode
C# UserControl 判断DesignMode .Net开发UserControl时,我们经常需要得知当前是Design Mode还是Runtime Mode. 在Design Mode时 ...
- 通过weka.jar包来进行数据预处理
前言:注意首先要将weka.jar包加载到相应的路径中去.程序中的数据也是用的weka自带的数据. 扩展:eclipse添加jar包的操作方法: 打开eclipse ,在对应的工程下右击,选择Buil ...