每天5分钟玩转openstack跟学(五)KVM虚拟化原理之网络虚拟化

1.Linux Bridge

1. 基本概念

假设宿主机有1块与外网连接的物理网卡eth0,上面跑了1个虚机VM1,现在有个问题是如何让VM1能够访问外网?

至少有两种方案:

(1)将物理网卡ens33直接分配给VM1。

  • 但实施这个方案随之带来的问题很多:宿主机就没有网卡,无法访问了;新的虚机,比如VM2也没有网卡。

(2)给VM1分配一个虚拟网卡vnet0,通过Linux Bridge br0ens33vnet0连接起来,如下图所示。这个是我们推荐的方案。
在这里插入图片描述

  • Linux Bridge是Linux上用来做TCP/IP二层协议交换的设备,其功能大家可以简单地理解为是一个二层交换机或者Hub。多个网络设备可以连接到同一个Linux Bridge,当某个设备收到数据包时,Linux Bridge会将数据转发给其他设备
  • 在上面这个例子中,当有数据到达ens33时,br0会将数据转发给vnet0,这样VM1就能接收到来自外网的数据。
  • 反过来,VM1发送数据给vnet0,br0也会将数据转发到ens33,从而实现了VM1与外网的通信

(3)现在我们再给虚拟机VM2分配一个虚拟网卡vnet1,通过Linux Bridge br0ens33vnet1连接起来
在这里插入图片描述

  • VM2的虚拟网卡vnet1也连接到了br0上。现在VM1和VM2之间可以通信,同时VM1和VM2也都可以与外网通信

2.动手下图实践虚拟网络
在这里插入图片描述
3.配置Linux Bridge br0

  1. 查看网卡名
    在这里插入图片描述

  2. 编辑/etc/network/interfaces,配置br0

    原文件

    # interfaces(5) file used by ifup(8) and ifdown(8)
    auto lo
    iface lo inet loopback
    
    auto ens33
    iface ens33 inet dhcp
    

    编辑后的文件

    # interfaces(5) file used by ifup(8) and ifdown(8)
    auto lo
    iface lo inet loopback
    
    auto ens33
    iface ens33 inet manual
    
    auto br0
    iface br0 inet dhcp
            bridge_stp off
            bridge_waitport 0
            bridge_fd 0
            bridge_ports ens33
    
  3. 有两点需要注意

    之前宿主机的IP是通过dhcp配置在ens33上的;创建Linux Bridge之后,IP就必须放到br0上了

    在br0的配置信息中请注意最后一行bridge_ports ens33,其作用就是将ens33挂到br0上

  4. 重启网络,查看IP配置,可以看到IP已经放到br0上了

    systemctl restart networking
    

    在这里插入图片描述

  5. brctl show查看当前Linux Bridge的配置。ens33已经挂到br0上了

    brctl show
    

    在这里插入图片描述

    除了br0,大家应该注意到还有一个virbr0的Bridge,而且virbr0上已经配置了IP地址192.168.122.1

    virbr0的作用我们会在后面介绍

  6. 在宿主机中,查看创建好的虚机VM1和VM2,确保都处于关机状态

    virsh list --all
    

    在这里插入图片描述

4.配置VM1

  1. 使用virt-manager图形管理界面对VM1的网卡进行配置
    在这里插入图片描述

    此处选择的是我们刚刚添加的Linux Bridge br0

  2. 下面我们启动VM1,看会发生什么?

    virsh start VM1
    

    在这里插入图片描述

    我们可以看到此时 ens33 和 vnet0 都成功的挂载到 br0上了

  3. brctl show告诉我们,br0下面添加了一个vnet0设备,通过virsh确认这就是VM1的虚拟网卡

    virsh domiflist VM1
    

    在这里插入图片描述

  4. VM1的IP是DHCP获得的,通过virt-manager控制台登录VM1,查看IP
    在这里插入图片描述

  5. VM1通过DHCP拿到的IP是192.168.102.207,与宿主机(IP为192.168.102.209)是同一个网段。Ping一下外网
    在这里插入图片描述

    没问题,可以访问。

    在VM1中虚拟网卡是eth0,并不是vnet0

    vnet0是该虚拟网卡在宿主机中对应的设备名称,其类型是TAP设备,这里需要注意一下

5.配置VM2

  1. 将VM2的虚拟网卡也挂在br0上,启动VM2,查看网卡信息
    在这里插入图片描述
  2. br0下面多了vnet1,通过virsh确认这就是VM2的虚拟网卡
    在这里插入图片描述
  3. VM2通过DHCP拿到的IP是10.10.102.206,登录VM2,验证网络的连通性Ping VM1
    在这里插入图片描述

    我们可以看到两台虚拟机目前可以相互ping通,且可以访问外网和ping通宿主机10.10.102.209

  4. 通过br0这个Linux Bridge,我们实现了VM1、VM2、宿主机和外网这四者之间的数据通信

6.理解virbr0

  1. virbr0是KVM默认创建的一个Bridge,其作用是为连接其上的虚机网卡提供NAT访问外网的功能

  2. virbr0默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供DHCP服务

  3. 下面我们演示如何使用virbr0

    在virt-manager打开VM1的配置界面,网卡Source device选择“default”,将VM1的网卡挂在virbr0上,如下图所示
    在这里插入图片描述
    启动VM1,brctl show可以查看到vnet0已经挂在了virbr0上在这里插入图片描述
    用virsh命令确认vnet0 就是VM1的虚拟网卡
    在这里插入图片描述
    virbr0使用dnsmasq提供DHCP服务,可以在宿主机中查看该进程信息
    在这里插入图片描述
    在/var/lib/libvirt/dnsmasq/目录下有一个default.leases文件(不知道是不是由于我使用的是ubuntu18.04,没有看到该文件,不过有另一个文件virbr0.macs),当VM1成功获得DHCP的IP后,可以在该文件中查看到相应的信息
    在这里插入图片描述
    在这里插入图片描述
    使用该IP:192.168.122.97访问VM1
    在这里插入图片描述在这里插入图片描述
    没有问题,可以访问外网,说明NAT起作用了。
    需要说明的是,使用NAT的虚机VM1可以访问外网,但外网无法直接访问VM1
    因为VM1发出的网络包源地址并不是192.168.122.97,而是被NAT替换为宿主机的IP地址了
    在这里插入图片描述
    这个与使用br0不一样,在br0的情况下,VM1通过自己的IP直接与外网通信,不会经过NAT地址转换

2. VLAN

和我一样对网络没有概念的朋友建议先看一遍湖南科技大学出品的这个视频讲解
虚拟局域网VLAN:http://mooc1.hnust.edu.cn/nodedetailcontroller/visitnodedetail?courseId=204353963&knowledgeId=172451795

1.基本概念

  1. LAN表示Local Area Network,本地局域网,通常使用Hub(集线器)Switch(交换机)来连接LAN中的计算机
  2. 一般来说,两台计算机连入同一个Hub或者Switch时,它们就在同一个LAN中
  3. 一个LAN表示一个广播域,其含义是:LAN中的所有成员都会收到任意一个成员发出的广播包
  4. VLAN表示Virtual LAN。一个带有VLAN功能的switch能够将自己的端口划分出多个LAN
  5. 计算机发出的广播包可以被同一个LAN中其他计算机收到,但位于其他LAN的计算机则无法收到
  6. 简单地说,VLAN将一个交换机分成了多个交换机,限制了广播的范围,在二层上将计算机隔离到不同的VLAN中

2. 需求

  1. 比方说,有两组机器,Group A和B。我们想配置成Group A中的机器可以相互访问,Group B中的机器也可以相互访问,但是A和B中的机器无法互相访问。

    一种方法是使用两个交换机,A和B分别接到一个交换机,使用物理设备将A和B划分到不同的LAN中,不同LAN中的设备可以相互通信

    另一种方法是使用一个带VLAN功能的交换机,将A和B的机器分别放到不同的VLAN中

    请注意,VLAN的隔离是二层上的隔离,A和B无法相互访问指的是二层广播包(比如arp)无法跨越VLAN的边界

    但在三层上(比如IP)是可以通过路由器让A和B互通的。概念上一定要分清

    现在的交换机几乎都是支持VLAN的

  2. 交换机的端口配置模式:AccessTrunk
    在这里插入图片描述

    Access口:被打上了VLAN的标签,表明该端口属于哪个VLAN,不同VLAN用VLAN ID来区分,VLAN ID的范围是1~4096
    Access口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入Access口后,就会被打上了所在VLAN的标签
    Access口只能属于一个VLAN

    Trunk口:实现交换机互联通信的接口
    假设有两个交换机A和B
    A上有VLAN1(红)、VLAN2(黄)、VLAN3(蓝)
    B上也有VLAN1、VLAN 2、VLAN 3
    如果想让A和B上相同VLAN之间能够通信,就需要将A和B连起来,而且连接A和B的端口要允许VLAN1、2、3三个VLAN的数据都能够通过。这样的端口就是Trunk口了

  3. 了解了VLAN的概念之后,我们来看KVM虚拟化环境下是如何实现VLAN的
    在这里插入图片描述

    ens33是宿主机上的物理网卡,有一个命名为ens33.10的子设备与之相连
    ens33.10就是VLAN设备了,其VLAN ID就是VLAN 10
    ens33.10挂在命名为brvlan10的Linux Bridge上,虚机VM1的虚拟网卡vent0也挂在brvlan10上

    这样的配置,其效果就是
    宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个VLAN10
    ens33.10,brvlan10和vnet0都分别接到VLAN10的Access口上。而ens33就是一个Trunk口
    VM1通过vnet0发出来的数据包会被打上VLAN10的标签
    ens33.10的作用是:定义了VLAN10。
    brvlan10的作用是:Bridge上的其他网络设备自动加入到VLAN10中

  4. 我们再增加一个VLAN20
    在这里插入图片描述

    ens33相当于trunk口
    ens33.10、ens33.20相当于access口
    brvlan10、brvlan20相当于不通的VLAN
    相同VLAN ID之间可以相互通信
    所以虚拟机VM1发送的数据可以通过brvlan10转发给ens33.10端口,然后再通过ens33trunk口转发出去,VM2一样

    这样虚拟交换机就有两个VLAN了,VM1和VM2分别属于VLAN10和VLAN20
    对于新创建的虚机,只需要将其虚拟网卡放入相应的Bridge,就能控制其所属的VLAN
    VLAN设备总是以母子关系出现,母子设备之间是一对多的关系
    一个母设备(ens33)可以有多个子设备(ens33.10,ens33.20 ……),而一个子设备只有一个母设备

3.配置VLAN

  1. 编辑/etc/network/interfaces,配置ens33.10brvlan10ens33.20brvlan20

    配置前
    在这里插入图片描述
    配置后
    在这里插入图片描述

    # interfaces(5) file used by ifup(8) and ifdown(8)
    auto lo
    iface lo inet loopback
    
    auto ens33
    iface ens33 inet dhcp
    
    auto ens33.10
    iface ens33.10 inet manual
        vlan-raw-device ens33
    
    auto brvlan10
    iface brvlan10 inet manual
            bridge_stp off
            bridge_waitport 0
            bridge_fd 0
            bridge_ports ens33.10  # 将ens33.10挂载到brvlan10
    
    auto ens33.20
    iface ens33.20 inet manual
        vlan-raw-device ens33
    
    auto brvlan20
    iface brvlan20 inet manual
            bridge_stp off
            bridge_waitport 0
            bridge_fd 0
            bridge_ports ens33.20  # 将ens33.20挂载到brvlan20
    
  2. 重启宿主机,ifconfig查看各个网络接口
    在这里插入图片描述

  3. 用brctl show查看当前Linux Bridge的配置

    ens33.10和ens33.20分别挂在brvlan10和brvlan20上了

    brctl show
    

    在这里插入图片描述

  4. 配置VM1

    在virt-manager中,将VM1的虚拟网卡挂到brvlan10上
    在这里插入图片描述
    启动VM1,查看Bridge,发现brvlan10已经连接了一个vnet0设备
    在这里插入图片描述
    通过virsh确认这就是VM1的虚拟网卡
    在这里插入图片描述

  5. 配置VM2

    在virt-manager中,将VM2的虚拟网卡挂到brvlan20上,同VM1,此处不再重复演示
    启动VM2,查看Bridge,发现brvlan20已经连接了一个vnet1设备
    在这里插入图片描述
    通过virsh确认这就是VM1的虚拟网卡
    在这里插入图片描述

  6. 验证VLAN的隔离性

    当前虚拟机VM1、VM2都没有ip地址
    在这里插入图片描述
    为了验证VLAN10和VLAN20之间的隔离,我们为VM1和VM2配置同一网段的IP
    配置VM1的IP
    切换超级用户:sudo -i
    设置网络:ifconfig eth0 192.168.100.10 netmask 255.255.255.0 up
    查看网络是否设置成功:ifconfig在这里插入图片描述
    配置VM2的IP
    在这里插入图片描述
    VM1和VM2互ping,发现ping不通,说明VLAN的隔离性生效
    在这里插入图片描述
    原因如下:
    (1)VM2向VM1发Ping包之前,需要知道VM1的IP 192.168.100.10所对应的MAC地址。VM2会在网络上广播ARP包,其作用就是询问“谁知道192.168.100.10的MAC地址是多少?”
    (2)ARP是二层协议,VLAN的隔离作用使得ARP只能在VLAN20范围内广播,只有brvlan20和eth0.20能收到,VLAN10里的设备是收不到的。VM1无法应答VM2发出的ARP包。
    (3)VM2拿不到VM1 vnet0的MAC地址,也就Ping不到VM1。

  7. Linux Bridge + VLAN =虚拟交换机

    1)物理交换机存在多个VLAN,每个VLAN拥有多个端口。
    同一VLAN端口之间可以交换转发,不同VLAN端口之间隔离。所以交换机包含两层功能:交换与隔离

    2)Linux的VLAN设备实现的是隔离功能,但没有交换功能。
    一个VLAN母设备(比如eth0)不能拥有两个相同ID的VLAN子设备,因此也就不可能出现数据交换情况

    3)Linux Bridge专门实现交换功能。
    将同一VLAN的子设备都挂载到一个Bridge上,设备之间就可以交换数据了

    总结起来,Linux Bridge加VLAN在功能层面完整模拟现实世界里的二层交换机
    ens33相当于虚拟交换机上的trunk口,允许vlan10和vlan20的数据通过。
    ens33.10,vnet0和brvlan10都可以看着vlan10的access口。
    ens33.20,vnet1和brvlan20都可以看着vlan20的access口。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值