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

一. 隔离模式:

Guest1 和 Guest2 均是虚拟机

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

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

1.1 使用qemu-kvm创建隔离模式网络的虚拟机

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

添加网卡脚本:

cat >>/etc/qemu-ifup<<end

#!/bin/bash
BRIDGE=br0
if [ -n $1 ]; then
ip link set $1 up
sleep 1
brctl addif $BRIDGE $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi sh -n /etc/qemu-ifup # 检测有无语法错误
chmod +x /etc/qemu-ifup # 给与执行权限
当虚拟机停止时,网卡会自动从网桥中down掉,所以不用编写停止网卡脚本

执行如下指令启动虚拟机:

qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:33 \
-net tap,ifname=vnet0.0,script=/etc/qemu-ifup \
-daemonize 参数说明:
-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.0
script:指定启动时,需要执行的脚本,该脚本是将虚拟机的后半段网卡添加到网桥中

启动第二台虚拟机

qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:34 \
-net tap,ifname=vnet0.1,script=/etc/qemu-ifup \
-daemonize 两个虚拟机启动后,分别登录,互ping一次
然后在从宿主机分别ping两台虚拟机一次 二、 路由模型及NAT模型

NAT模式
该模式网桥要作为路由器对虚拟机地址进行转发。

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

 yum install iptables-services  -y     # 安装需要的程序包,使用iptables规则对报文进行转发。
编写虚拟机开启执行脚本:
cat >> /etc/qemu-natup<<end

#!/bin/bash
#
bridge=br0
net="192.168.100.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
}

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

end

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

cat  >>/etc/qemu-natdown <<end

#!/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 $1 ]; then
  ip link set $1 down
  brctl delif $bridge $1
  isalone_bridge
  exit 0
else
  echo "Error: no interface specified."
  exit 1
fi

end

chmod  +x  /etc/{qemu-natup,qemu-natdown}

ll   /etc/{qemu-natup,qemu-natdown}

上述2个脚本对于nat模式的网络很重要

创建虚拟机:
qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:33 \
-net tap,ifname=vnet0.0,script=/etc/qemu-natup,downscript=/etc/qemu-natdown \
-daemonize
qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:34 \
-net tap,ifname=vnet0.1,script=/etc/qemu-natup,downscript=/etc/qemu-natdown \
-daemonize
查看两台虚拟机的后半段网卡(vnetX)是否都连接在桥br0上,在通过POSTROUTING链进行源地址转换
brctl show
ip a 
iptables -nL -t nat

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

ip addr add 192.168.100.20/24   dev eth0
ip addr add 192.168.100.30/24 dev eth0
两台虚拟机之间实现互通了,配置默认路由为br0地址,实现公网的访问
路由配置如下:
ip route add default via 192.168.100.1

三、桥接模式

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

使用qemu-kvm创建桥接模式

为宿主机创建虚拟网卡,并将物理网卡作为桥设备
cd /etc/sysconfig/network-scripts/
cp -a ifcfg-eno16777736 ifcfg-br0
cat >>ifcfg-eno16777736<<end
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=eno16777736
UUID=9f0bf158-e598-4309-8c0c-7609174ff212
DEVICE=eno16777736
ONBOOT=yes
BRIDGE=br0
end
cat >>ifcfg-br0 <<end
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
end
systemctl restart network
ip a brctl show
物理网卡eno16777736 将作为交换机使用,没有ip地址

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

cat   >>  /etc/qemu-ifup<<end

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

end

启动虚拟机:

qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:34 \
-net tap,ifname=vnet0.1,script=/etc/qemu-ifup \
-daemonize

												

kvm的4中网络模型(qemu-kvm)的更多相关文章

  1. KVM(七)使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照

    本文将梳理 QEMU/KVM 快照相关的知识,以及在 OpenStack Nova 中使用 libvirt 来对 QEMU/KVM 虚机做快照的过程. 1. QEMU/KVM 快照 1.1 概念 QE ...

  2. KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  3. KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机

    1. QEMU/KVM 迁移的概念 迁移(migration)包括系统整体的迁移和某个工作负载的迁移.系统整理迁移,是将系统上所有软件包括操作系统完全复制到另一个物理机硬件机器上.虚拟化环境中的迁移, ...

  4. KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  5. QEMU KVM Libvirt(12): Live Migration

    由于KVM的架构为 Libvirt –> qemu –> KVM 所以对于live migration有两种方式,一种是qemu + KVM自己的方式,一种是libvirt的方式,当然li ...

  6. Qemu/kvm虚拟化源码解析学习视频资料

    地址链接:tao宝搜索:Linux云计算KVM Qemu虚拟化视频源码讲解+实践​https://item.taobao.com/item.htm?ft=t&id=646300730262 L ...

  7. Linux 桌面玩家指南:07. Linux 中的 Qemu、KVM、VirtualBox、Xen 虚拟机体验

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  8. 理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称

    本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...

  9. 理解 Linux 网络栈(3):QEMU/KVM + VxLAN 环境下的 Segmentation Offloading 技术(发送端)

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

随机推荐

  1. sublime text3 注册码

    —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...

  2. bzoj 5496: [2019省队联测]字符串问题【SAM+拓扑】

    有一个想法就是暴力建图,把每个A向有和他相连的B前缀的A,然后拓扑一下,这样的图是n^2的: 考虑优化建图,因为大部分数据结构都是处理后缀的,所以把串反过来,题目中要求的前缀B就变成了后缀B 建立SA ...

  3. hdu 1521 排列组合【指数型生成函数】

    根据套路列出式子:\( \prod_{i=1}^{n}\sum_{j=0}^{c[i]}\frac{x^j}{j!} \),然后暴力展开即可 #include<iostream> #inc ...

  4. bzoj 4551: [Tjoi2016&Heoi2016]树【并查集】

    看起来像是并查集,但是是拆集合,考虑时间倒流,先把标记都打上,然后把并查集做出来 每次到一个修改点就把这个点的计数s[u]--,当这个s为0时就把这个点和他的父亲合并(因为可能有多次标记) #incl ...

  5. Luogu P4139 上帝与集合的正确用法【扩展欧拉定理】By cellur925

    题目传送门 题目中的式子很符合扩展欧拉定理的样子.(如果你还不知扩展欧拉定理,戳).对于那一堆糟心的2,我们只需要递归即可,递归边界是模数为1. 另外,本题中好像必须要用快速乘的样子...否则无法通过 ...

  6. android 带checkbox的List

    可实现点击内容即可选中 http://blog.csdn.net/harvic880925/article/details/40475367

  7. Oracle 正则化

    摘抄自:http://www.cnblogs.com/scottckt/archive/2012/10/11/2719562.html ORACLE中的支持正则表达式的函数主要有下面四个: 1,REG ...

  8. CSS3向外扩散的圆

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. UOJ #35 后缀排序 哈希做法

    题面 http://uoj.ac/problem/35 题解 后缀数组当然可以 这里用哈希做 首先排序的问题在哪里 在于比较两个后缀的复杂度是O(length)的 但是我们可以通过找LCP来优化比较 ...

  10. 爬虫中动态的POST参数

    爬虫的过程中,有的网站提交POST数据时候每次都会带上不懂POST参数,要想爬到数据首先的知道怎么构造这些动态的参数. 1.分析提交POST数据的最原始网页,分析原始网页的源代码,查找里面是否包含有你 ...