1. 隔离模式:虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上。
    2. 路由模式:相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转发,但是不会改变源地址。
    3. NAT模式:在路由模式中,会出现虚拟机可以访问其他主机,但是其他主机的报文无法到达虚拟机,而NAT模式则将源地址转换为路由器(物理网卡)地址,这样其他主机也知道报文来自那个主机,在docker环境中经常被使用。
    4. 桥接模式:在宿主机中创建一张虚拟网卡作为宿主机的网卡,而物理网卡则作为交换机。

1. 隔离模型:

Guest1 和 Guest2 都为虚拟机。
        Linux在虚拟机中的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上。上图eth0在Guest1虚拟机上的网卡,对应的后半段为vnet0,在Guest1上所有发往eth0的数据就直接发往vnet0了,也可以将vnet0看作一张网卡

Guest1和Guest2如何通信:
            在宿主机中创建一个虚拟交换机,让vnet0和vnet1分别为虚拟交换机的一个接口,交换机也可以叫做bridge,只要两个虚拟网卡的前半段ip地址在同一个网段内,就可以相互通信,这就是隔离模式。

1.1 使用qemu-kvm创建隔离模式

[root@kvm ~]# yum install bridge-utils qemu-kvm -y         # 安装所需软件包

# 创建网桥

[root@kvm ~]# brctl addbr br0
[root@kvm ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
[root@kvm ~]# ip link set br0 up # 必须保持桥接网卡的活跃状态,否则虚拟机之间无法互通

虚拟机启动时,网卡的后半段不会自动添加到虚拟网桥,需要一个脚本来实现,首先编写脚本

添加网卡脚本:

[root@kvm ~]# vim /etc/qemu-ifup

#!/bin/bash
#
BRIDGE=br0
if [ -n $ ]; then
ip link set $ up
sleep
brctl addif $BRIDGE $
[ $? -eq ] && exit || exit
else
echo "Error: no interface specified."
exit
fi [root@kvm ~]# sh -n /etc/qemu-ifup # 检测有无语法错误
[root@kvm ~]# chmod +x /etc/qemu-ifup # 给与执行权限 当虚拟机停止时,网卡会自动从网桥中down掉,所以不用编写停止网卡脚本 [root@kvm ~]# qemu-kvm -smp -m -cpu host -drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=::::: -net tap,ifname=vnet0.,script=/etc/qemu-ifup -daemonize
VNC server running on `127.0.0.1:' -smp: 虚拟机cpu线程数
-cpu: cpu的类型;host为虚拟机使用物理机cpu类型
-drive: 驱动设备
file: 驱动设备目录
if: 驱动设备类型,virtio为半虚拟化类型,性能较好
media:驱动设备是disk还是cdrom
cache:设备缓存,writeback为回写
-net
nic:虚拟机网卡前半段,这是在虚拟机中使用的网卡
macaddr:设置虚拟机网卡mac地址,在使用qemu-kvm创建虚拟机时,需要手动指定mac地址,否则会出现相同的mac地址虚拟机
model:网卡类型,virtio为半虚拟化类型,性能较好
tap:为虚拟网卡后半段,需要连接到网桥上
ifname:系统中网卡名称,比如:vnet0.
script:指定启动时,需要执行的脚本,该脚本是将虚拟机的后半段网卡添加到网桥中

启动第二台虚拟机

[root@kvm ~]# qemu-kvm -smp  -m  -cpu host -drive file=/images/centos7-.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=::::: -net tap,ifname=vnet0.,script=/etc/qemu-ifup -daemonize
VNC server running on `127.0.0.1:'

通过上图,虚拟主机之间能相互连通。

宿主机是无法访问到虚拟机,这就是kvm隔离模式

2. 路由模型及NAT模型

NAT模式
        该模式网桥要作为路由器对虚拟机地址进行转发,路由模式是无法修改源地址ip,因此虚拟机可能会成功的将报文发送给目标地址ip,而目标地址ip无法将报文回传给源地址ip;
                                                           NAT模式则是将源地址ip改为物理网卡ip发送给目标地址,目标地址ip回传给物理网卡,在将报文发送至虚拟主机。

2.1 使用qemu-kvm创建NAT模式

[root@kvm ~]# yum install qemu-kvm iptables-services bridge-utils -y     # 安装需要的程序包,使用iptables规则对报文进行转发。

编写虚拟机开启执行脚本:

[root@kvm ~]# vim /etc/qemu-natup 

#!/bin/bash
#
bridge=br0
net="192.168.100.1/24" checkbr() {
if brctl show | grep -i $; then
return
else
return
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=
} setup_nat() {
checkbr $bridge
if [ $? -eq ]; then
initbr
enable_ip_forward
iptables -t nat -A POSTROUTING -s $net ! -d $net -j MASQUERADE
fi
} if [ -n $ ]; then
setup_nat
ip link set $ up
brctl addif $bridge $
exit
else
echo "Error: no interface specified."
exit
fi

编写虚拟机关闭执行脚本:

[root@kvm ~]# vim /etc/qemu-natdown 

#!/bin/bash
#
bridge=br0
net='192.168.100.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 $ ]; then
ip link set $ down
brctl delif $bridge $
isalone_bridge
exit
else
echo "Error: no interface specified."
exit
fi

以上两个脚本对于NAT模型来说非常重要。

使用qemu-kvm 创建虚拟机

[root@kvm ~]# qemu-kvm -smp  -m  -cpu host -drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=::::: -net tap,ifname=vnet0.,script=/etc/qemu-natup,downscript=/etc/qemu-natdown -daemonize
net.ipv4.ip_forward =
VNC server running on `127.0.0.1:' [root@kvm ~]# qemu-kvm -smp -m -cpu host -drive file=/images/centos7-.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=::::: -net tap,ifname=vnet0.,script=/etc/qemu-natup,downscript=/etc/qemu-natdown -daemonize
br0 .9acac824e624 no vnet0.
VNC server running on `127.0.0.1:'

查看两台虚拟机的后半段网卡都连接在桥br0上,在通过POSTROUTING链进行源地址转换。

[root@kvm ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 .9acac824e624 no vnet0.
vnet0. [root@kvm ~]# ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::7b:9f:8c brd ff:ff:ff:ff:ff:ff
inet 10.0.0.11/ brd 10.0.0.255 scope global eno16777736
valid_lft forever preferred_lft forever
: vnet0.: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast master br0 state UNKNOWN qlen
link/ether 9a:ca:c8::e6: brd ff:ff:ff:ff:ff:ff
: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP
link/ether 9a:ca:c8::e6: brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/ scope global br0
valid_lft forever preferred_lft forever
: vnet0.: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast master br0 state UNKNOWN qlen
link/ether f6:6c:f7:::d4 brd ff:ff:ff:ff:ff:ff [root@kvm ~]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination Chain INPUT (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.100.0/ !192.168.100.0/

分别给两台虚拟机配置ip地址,命令如下:

ip addr add 192.168.100.20/ dev eth0
ip addr add 192.168.100.30/ dev eth0

两台虚拟机之间实现互通了,配置默认路由为br0地址,实现公网的访问。

路由配置如下:

ip route add default via 192.168.100.1

kvm-nat模型实现成功。

3. 桥接模式

在该模式下,宿主机会虚拟出来一张虚拟网卡作为宿主机本身的通信网卡,而宿主机的物理网卡则成为桥设备(交换机),所以虚拟机相当于在宿主机所在局域网内的一个单独的主机,他的行为和宿主机是同等地位的,没有依存关系。

3.1 使用qemu-kvm创建桥接模式

为宿主机创建虚拟网卡,并将物理网卡作为桥设备

[root@kvm ~]# cd /etc/sysconfig/network-scripts/
[root@kvm network-scripts]# cp -a ifcfg-eno16777736 ifcfg-br0
[root@kvm network-scripts]# vim ifcfg-eno16777736 TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=eno16777736
UUID=9f0bf158-e598--8c0c-7609174ff212
DEVICE=eno16777736
ONBOOT=yes
BRIDGE=br0 [root@kvm network-scripts]# vim ifcfg-br0 TYPE=Bridge
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS1=10.0.0.1
DNS2=114.114.114.114 [root@kvm network-scripts]# systemctl restart network
[root@kvm network-scripts]# ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast master br0 state UP qlen
link/ether :0c::7b:9f:8c brd ff:ff:ff:ff:ff:ff
: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP
link/ether :0c::7b:9f:8c brd ff:ff:ff:ff:ff:ff
inet 10.0.0.11/ brd 10.0.0.255 scope global br0
valid_lft forever preferred_lft forever [root@kvm network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 .000c297b9f8c no eno16777736

物理网卡eno16777736 将作为交换机使用,没有ip地址

编写虚拟机启动脚本,该脚本和隔离模式脚本一致:

[root@kvm network-scripts]# vim /etc/qemu-ifup 

#!/bin/bash
#
BRIDGE=br0
if [ -n $ ]; then
ip link set $ up
sleep
brctl addif $BRIDGE $
[ $? -eq ] && exit || exit
else
echo "Error: no interface specified."
exit
fi

启动虚拟机

[root@kvm network-scripts]# qemu-kvm -smp  -m  -cpu host -drive file=/images/centos7-.img,if=virtio,media=disk,cache=writeback -net nic,model=virtio,macaddr=::::: -net tap,ifname=vnet0.,script=/etc/qemu-ifup -daemonize
VNC server running on `127.0.0.1:'

桥接模式完成。  以上为KVM最简单是4种网络模型,最为常见的是桥接模型。虚拟化环境中,目前见过最多的就是使用桥接模型。现在流行的docker一般是基于nat模型实现的。

[ kvm ] 四种简单的网络模型的更多相关文章

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

    四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient regio ...

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

    四种简单的sql语句(增删改查语句) 一.插入语句 insert into [table] ([column],[column],[column]) values(?,?,?) 二.删除语句 dele ...

  3. JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)

    // 对象:特指的某个事物,具有属性和方法(一组无序的属性的集合) // 特征------>属性 // 行为------>方法 // 创建对象的四种方式 1 // 1.字面量的方式,就是实 ...

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

    无聊,用php写几个排序算法,算法介绍请移步这里,这里使用php实现了几个简单的,如下 //选择排序 function selection_sort($arr){ $len = count($arr) ...

  5. python3-函数的参数的四种简单用法:

    def print_two(*args):     arg1, arg2 = args     print "arg1: %r, arg2: %r" % (arg1,arg2)   ...

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

    最近在Android开发当中,用到的动画效果. public void onClick(View arg0) { // TODO 自动生成的方法存根 switch (arg0.getId()) { c ...

  7. python四种简单排序

    #!/usr/bin/python #排序方法 #冒泡排序 def buble(l): for i in range(len(l)): for j in range(len(l)-i-1): if l ...

  8. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。

    laviewpbt  2014.8.4 编辑 Email:laviewpbt@sina.com   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以 ...

  9. [转]分享php中四种webservice实现的简单架构方法及实例

    FROM : http://www.itokit.com/2012/0417/73615_2.html 本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的P ...

随机推荐

  1. [HDU6212]Zuma

    题目大意: 祖玛游戏. 给你一个01串,你可以往里面加一些0或1,如果连续的0或1超过3个,那么就可以消去.问消去所有的珠子至少要加几个珠子. 思路: 区间DP. 首先把原来的01串,改成存储连续的同 ...

  2. Linux下gcc与g++用法以及编写makefile

    1.         gcc与g++编译流程: 1)         编译流程: 2)         预处理:生成.i的预处理文件. Ø 只激活预处理,这个不生成文件,需要把它重定向一个输出文件. ...

  3. LeetCode:删除排序数组中的重复项 (Remove Duplicates from Sorted Array)

    public class RemoveDuplicates { /** * 修改数组,使数组有序不重复.超出长度不考虑. * @param 排序数组 * @return 数组不重复数的个数 */ pu ...

  4. bzoj 1312 最大密度子图

    晕,m=0是要输出1(弄的我还找管理员要数据,但明显题意是叫我们输出0呀) 最大密度子图,把边转换成点,然后二分答案,跑最大权闭合子图判定是否可行. #include <cstdio> # ...

  5. POJ 1654 Area 计算几何

    #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> usi ...

  6. opencv+vs2012环境搭建教程

    1. 安装OpenCV和VS. 本人电脑安装的是opencv2.4.10和vs2012 2.配置环境变量 以下以win8 64位系统为例: 计算机->属性->高级系统设置->环境变量 ...

  7. IOS webView学习

    本文简单介绍下在IOS中,webView的基本用法,也顺便强化下自己的基础知识----天明少羽爬楼梯 一.加载外部HTML 显示webView 报错:NSURLSession/NSURLConnect ...

  8. js的栈与堆

    JavaScript中基本数据类型和引用数据类型的区别  这是我引用别人的  觉得很好   1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本 ...

  9. weblogic部署异常: cvc-enumeration-valid: string value '3.0' is not a valid enumeration value for web-app-versionType in namespace http://java.sun.com/xml/ns/javaee:<null>

    尝试使用weblogic部署一个Demo应用,在选择应用目录后,报出下面的异常: VALIDATION PROBLEMS WERE FOUND problem: cvc-enumeration-val ...

  10. 重温PHP之插入排序

    插入排序基本思路:将数组分为两个区(已排序区和未排序区),假定数组的第一个元素处于已排序区, 第一个元素之后的所有元素都处于未排序部分.排序时用到双层循环,外层循环用于从未排序部分中取出待排序元素,并 ...