KVM虚拟化之四种网络模型

KVM虚拟化之四种网络模型

1. 四种网络模型简要说明:

1.1 隔离模型

该模型的特点是宿主机上的所有虚拟机之间可以组建网络,但是虚拟机无法与宿主机进行通信,也无法与其他网络的主机或其他宿主机上的虚拟机进行通信;相当于将虚拟机只是连接到一个交换机上,而这个交换机是在宿主机上虚拟出来的,即我们通常所说的网桥设备

1.2 路由模型

该模型的特点是在隔离模型的基础上,在宿主机开启了ip路由转发功能,此时的宿主机相当于路由器,完成虚拟机与宿主机的数据报文转发。因此,虚拟机可以宿主机的物理网卡进行通信,但是无法与宿主机之外的主机进行通信,因为宿主机没有对源地址转换,报文可以送到外部主机,但是外部主机无法回应。

1.3 NAT模型

该模型的特点是当虚拟机需要与外部进行通信时,需要将源IP地址转换为物理网卡的IP地址,这样外部主机接收到报文后可以正确的将响应报文发送给目标IP地址(宿主机的物理网卡IP地址),因此,实现虚拟机与外部的通信;

注意:该模型仅仅是实现了源地址转换,实现虚拟机与外部网络的通信,但那是外部网络无法访问虚拟机,如果要实现,则需要在宿主机做目标地址转换。

1.4 桥接模型

该模型的特点是通过创建一个虚拟网卡,为该虚拟机网卡分配可以访问外部网络的IP地址;此时的物理网卡相当于一台交换机设备;虚拟机可以分配与外部网络通信的IP地址实现与外部网络的通信;此时,虚拟机相当于宿主机所在的局域网内单独的一台主机,它宿主机的地位是同等的,没有依存关系。

2. 前期准备

2.1 环境说明

本次测试在VMware workstation 12版本的虚拟机环境中进行,注意开启cpu虚拟化功能;

网络适配器使用仅主机模型,共享主机网络的internet。

OS:centos-6.5_x86-64

eth0: 10.241.96.176/24

采用kvm部署虚拟机,磁盘映像文件使用 cirros-0.3.5-x86_64-disk.img

2.2 安装qemu-kvm及解决依赖关系

## 装载kvm模块:
[root@C65-201 ~]# modprobe kvm
[root@C65-201 ~]# modprobe kvm-intel

## 安装qemu-kvm、bridge-utils
[root@C65-201 ~]# yum install qemu-kvm bridge-utils

## 确保CPU支持HVM
[root@C65-201 ~]#  grep -E --color=auto "(vmx|svm)" /proc/cpuinfo

3. 隔离模型

在这里插入图片描述

3.1 隔离模型中的虚拟机网络

同一宿主机中,虚拟机如何与宿主机中的网桥通信?

隔离模型中的虚拟机无法与宿主机的物理网卡通信,但是可以与宿主机中的网桥通信;

图中VM表示虚拟机,每个虚拟机的网卡包含前半段和后半段;前半段vNIC在虚拟机上,后半段VIF在宿主机上。图中虚拟机中vNIC网卡对应的后半段为VIF网卡,VM虚拟机中发往vNIF网卡的数据报文都会发往后半段网卡VIF;

同一宿主机中,虚拟机如何与虚拟机通信?

图中br-in是宿主机上的桥设备,也称之为Virtual Switch或者Bridge;在隔离模型中,相当于一个二层的虚拟交换机,要想实现同一宿主机中的虚拟机互相通信,需要满足几个条件:

1)需要在宿主机中创建一个Bridge,图中为br-in

2)需要互相通信的每个虚拟机的前半段IP地址必须在同一网段内;

3)需要互相通信的每个虚拟机的后半段网卡VIF网卡设备添加至br-in这个桥设备n桥。

注意:如果要实现同网段虚拟机不能通信,即虚拟机之间隔离,则需要创建不同的网桥,并将虚拟机的后半段添加至不同的网桥设备,即可实现隔离。

虚拟机如何与宿主机的物理网卡通信?

隔离模型中的虚拟机无法与宿主机的物理网卡通信。

虚拟机如何与外部网络通信?

隔离模型中的虚拟机无法与外部进行通信。

3.2 使用qemu-kvm创建虚拟机并实现隔离模型

3.2.1 创建br-in网桥
## 创建网桥
[root@C65-201 ~]# brctl addbr br-in

## 查看网桥
[root@C65-201 ~]# brctl show
bridge name    bridge id           STP enabled     interfaces
br-in         8000.000000000000       no             

## 激活网桥,使之为启动状态
[root@C65-201 ~]# ip link set br-in up
3.2.2 创建脚本qemu-ifup

创建虚拟机并启动时,通过qemu-kvm命令的启动参数,添加VM的前半段网卡,后半段网卡指定ifname参数自动创建,但是需要手动激活并且添加至桥br-in中;通常这部分操作由qemu-ifup这额脚本完成。

[root@kvm ~]# vim /etc/qemu-ifup
#!/bin/bash
BRIDGE=br-in
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

保存后给该脚本添加执行权限并检查语法

[root@C65-201 ~]# chmod +x /etc/qemu-ifup      # 添加执行权限
[root@C65-201 ~]# bash -n /etc/qemu-ifup           # 检查语法是否有误

当虚拟机停止时,虚拟机网卡的后半段会自动从宿主机中down掉,所以不需要编写down脚本

3.2.3 创建第一个虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-ifup -daemonize

## 配置guest01的ip地址
# ip addr add 10.0.1.1/24 dev eth0
3.2.4 创建第二个虚拟机guest02并启动
## 创建guest02并启动
[root@C65-201 ~]# qemu-kvm -name guest02 -m 128 -smp 1 --drive file=/images/kvm/guest02.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:bb -net tap,ifname=vif2.0,script=/etc/qemu-ifup -daemonize 

## 配置guest02的ip地址
# ip addr add 10.0.1.2/24 dev eth0
3.2.5 通信测试

在宿主机上查看桥设备,可以看到两台虚拟机的网卡后半段都已经添加至br-in网桥中了

在这里插入图片描述

测试guest01和guest02之间的通信

在这里插入图片描述
测试宿主机访问虚拟机

在这里插入图片描述

根据以上结果,虚拟机与虚拟机之间可以访问,宿主机无法访问虚拟机,实现了隔离模型

4. 路由模型

在这里插入图片描述

4.1 路由模型模型中的虚拟机网络

同一宿主机中,虚拟机如何与宿主机中的网桥通信?

路由模型中的虚拟机与宿主机的网桥的通信机制,参考隔离模型

同一宿主机中,虚拟机如何与虚拟机通信?

路由模型中的虚拟机与虚拟机的通信机制,参考隔离模型

虚拟机如何与宿主机的物理网卡通信?

路由模型中的虚拟机要与宿主机的物理网卡进行通信,要满足以下几个条件:

1) 宿主机必须在内核打开IP转发功能,即net.ipv4.ip_forward = 1;

2) 宿主机中的网桥br-in需要添加一个与虚拟机同网段的IP地址;

3) 虚拟机需要添加一条路由,下一跳地址设置为网桥br-in的ip;

虚拟机如何与外部网络通信?

路由模型中的虚拟机无法与外部进行通信;因为虚拟机发送到外部网络的主机时,源地址内网地址,内网地址无法与外部直接通信,且没有对源地址转换为物理网卡的IP地址,因此,外部网络发送的响应报文中的目标地址为虚拟机的IP地址时,无法到达宿主机的物理网卡,故虚拟机无法收到响应报文。

4.2 使用qemu-kvm创建虚拟机并实现路由模型

4.2.1 创建脚本qemu-rtup和qemu-rtdown

创建虚拟机并启动时,通过qemu-kvm命令的启动参数,添加VM的前半段网卡,后半段网卡指定ifname参数自动创建,但是需要手动激活并且添加至桥br-in中;通常这部分操作由qemu-rtup这额脚本完成;关闭虚拟机时由qemu-rtdown完成移除后半段网卡等;

## 添加VM的前半段网卡脚本
[root@C65-201 ~]# vim /etc/qemu-rtup
#!/bin/bash
bridge="br-in"
ifaddr=192.168.1.254      # 网桥br-in的IP地址
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 $ifaddr/24 dev $bridge
}
enable_ip_forward() {
    sysctl -w net.ipv4.ip_forward=1
}
setup_rt() {
    checkbr $bridge
    if [ $? -eq 1 ]; then
        initbr
        enable_ip_forward
    fi
}

if [ -n "$1" ]; then
    setup_rt
    ip link set $1 up
    brctl addif $bridge $1
    exit 0
else
    echo "Error: no interface specified."
    exit 1
fi

## 删除VM的后半段网卡脚本
[root@C65-201 ~]# vim /etc/qemu-rtdown
#!/bin/bash

bridge="br-in"

isalone_bridge() {
    if ! brctl show | awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &> /dev/null; then
        ip link set $bridge down
        brctl delbr $bridge
    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 

## 保存后给该脚本添加执行权限并检查语法
[root@C65-201 ~]# chmod +x /etc/{qemu-rtup,qemu-rtdown}   # 添加执行权限
[root@C65-201 ~]# bash -n /etc/qemu-rtup                  # 检查语法是否有误
[root@C65-201 ~]# bash -n /etc/qemu-rtdown                # 检查语法是否有误
4.2.2 创建第一个虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-rtup,downscript=/etc/qemu-rtdown -daemonize

## 在guest01配置其ip地址
# ip addr add 192.168.1.1/24 dev eth0

## 给guest01添加路由
# ip route add default via 192.168.1.254
4.2.3 创建第二个虚拟机guest02并启动
## 创建guest02并启动
[root@C65-201 ~]# qemu-kvm -name guest02 -m 128 -smp 1 --drive file=/images/kvm/guest02.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:bb -net tap,ifname=vif2.0,script=/etc/qemu-rtup,downscript=/etc/qemu-rtdown -daemonize

## 在guest02配置其ip地址
# ip addr add 192.168.1.2/24 dev eth0

 
## 给guest02添加路由
# ip route add default via 192.168.1.254
 
4.2.4 通信测试

在这里插入图片描述

在这里插入图片描述

无法与外部网络的主机进行通信

在这里插入图片描述

根据以上结果,虚拟机与宿主机之间可以互相访问,但无法与外部网络通信,实现了路由模型

5. NAT模型

在这里插入图片描述

5.1 NAT模型中的虚拟机网络

NAT模型与路由模型的通信机制基本一致,唯一不同的就是,NAT模型可以使虚拟机直接与外部网络进行通信;即只需要在NAT模型中,在宿主机SNAT地址转换,将虚拟机的源地址IP转换为物理网卡的IP地址,发送报文至外部网络的主机;外部网络的主机收到报文后构建的响应报文的目标IP地址,为宿主机的物理网卡的IP地址,而后宿主机在将报文发送至虚拟机,实现了虚拟机与外部网络的通信。

5.2 使用qemu-kvm创建虚拟机并实现NAT模型

5.2.1 创建脚本qemu-natup和qemu-natdown

创建虚拟机并启动时,通过qemu-kvm命令的启动参数,添加VM的前半段网卡,后半段网卡指定ifname参数自动创建,但是需要手动激活并且添加至桥br-in中;通常这部分操作由qemu-natup这额脚本完成;关闭虚拟机时由qemu-natdown完成移除后半段网卡、删除nat规则等;

## 添加脚本
[root@C65-201 ~]# vim /etc/qemu-natup 
#!/bin/bash
bridge="br-in"
net="192.168.1.0/24"
ifaddr=192.168.1.254

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 $ifaddr 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

## 删除脚本
[root@C65-201 ~]# vim /etc/qemu-natdown 
#!/bin/bash
bridge="br-in"
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

 

## 保存后给该脚本添加执行权限并检查语法
[root@C65-201 ~]# chmod +x /etc/{qemu-natup,qemu-natdown}       # 添加执行权限
[root@C65-201 ~]# bash -n /etc/qemu-natup                       # 检查语法是否有误
[root@C65-201 ~]# bash -n /etc/qemu-natdown                     # 检查语法是否有误
5.2.2 创建第一个虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-natup,downscript=/etc/qemu-natdown -daemonize

## 在guest01配置其ip地址
# ip addr add 192.168.1.1/24 dev eth0 

## 给guest01添加路由
# ip route add default via 192.168.1.254
5.2.3 创建第二个虚拟机guest02并启动
## 创建guest02并启动
[root@C65-201 ~]# qemu-kvm -name guest02 -m 128 -smp 1 --drive file=/images/kvm/guest02.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:bb -net tap,ifname=vif2.0,script=/etc/qemu-natup,downscript=/etc/qemu-natdown -daemonize 

## 在guest02配置其ip地址
# ip addr add 192.168.1.2/24 dev eth0

## 给guest02添加路由
# ip route add default via 192.168.1.254
5.2.4 通信测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

根据以上结果,虚拟机与宿主机之间可以互相访问,也可以与外部网络通信,实现了NAT模型

6. 桥接模型

在这里插入图片描述

6.1 桥接模型中的虚拟机网络

桥接模型不同于隔离模型、路由模型和NAT模型;在模型下,宿主机会虚拟出一块网卡作为该宿主机的通信网卡,而宿主机的物理网卡则成为桥接设备(也可称为交换机),此时,虚拟机相当于宿主机所在的局域网内单独的一台主机,它宿主机的地位是同等的,没有依存关系。

6.2 使用qemu-kvm创建虚拟机并实现桥接模型

6.2.1 创建br-in网桥并将eth0添加至br-in桥
## 为宿主机创建虚拟网卡,并将物理网卡eth0作为桥设备
[root@C65-201 ~]# cd /etc/sysconfig/network-scripts/
[root@C65-201 network-scripts]# cp ifcfg-eth0 ifcfg-br-in

##修改br-in
[root@C65-201 network-scripts]# vim ifcfg-br-in 
DEVICE=br-in
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=10.241.96.176
NETMASK=255.255.255.0
GATEWAY=10.241.96.1
DNS1=10.241.96.1
 
## 修改eth0
[root@C65-201 network-scripts]# vim ifcfg-eth0 
DEVICE=eth0
HWADDR=00:0C:29:64:9C:CD
TYPE=Ethernet
UUID=62a2f66a-754e-4c46-810c-fd23abff3d5a
ONBOOT=yes
BRIDGE=br-in
NM_CONTROLLED=yes
BOOTPROTO=static 

## 重启网络服务
[root@C65-201 network-scripts]# service network restart

查看ip

在这里插入图片描述

查看桥设备

在这里插入图片描述

此时,物理网卡eth0已经添加至br-in中

6.2.2 创建脚本qemu-ifup

该脚本与隔离模型的qemu-ifup脚本一致,参照3.2.2即可

6.2.3 创建虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-ifup -daemonize

## 在guest01配置其ip地址
# ip addr add 10.241.96.90/24 dev eth0

## 在guest01添加路由
# ip route add default via 10.241.96.1
6.2.4 通信测试

在这里插入图片描述

以上是KVM最简单的四种网络模型,在生产环境中使用的最多的是桥接模型,但是桥接模型的安全性是最低的,因为虚拟机直接暴露给了外部网络;而现在的容器技术中,NAT网络模型使用的较多,比如docker

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值