kvm的4中网络模型(qemu-kvm)

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

 

一. 隔离模式:centos

Guest1 和 Guest2 均是虚拟机缓存


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

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

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

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

添加网卡脚本:centos7

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

#!/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:指定启动时,须要执行的脚本,该脚本是将虚拟机的后半段网卡添加到网桥中

 

启动第二台虚拟机3d

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两台虚拟机一次




2、 路由模型及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



3、桥接模式

在该模式下,宿主机会虚拟出来一张虚拟网卡做为宿主机自己的通讯网卡(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