• Linux 系统下实践 VLAN


    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。

    01 准备环境

    环境:ubuntu 16.04 环境(物理 or 虚拟)

    确认 CPU 是否支持虚拟化:

    # egrep -o '(vmx|svm)' /proc/cpuinfo
    # vmx
    

    如果不支持,开启 KVM 嵌套虚拟化之后再重启。

    1.1 安装 KVM 环境

    sudo apt-get install -y qemu-kvm qemu-system libvirt-bin virt-manager bridge-utils vlan
    

    1.2 安装 Ubuntu 图形化界面

    sudo apt-get install -y xinit gdm kubuntu-desktop
    

    02 创建 KVM 虚拟机

    使用 virt-manager 创建 KVM 虚拟机,方法比较简单,由于篇幅有限,大家可以查阅相关资料自行了解。

    创建完之后用 virsh list --all 查看创建的 VM:

    Id    Name                           State
    ----------------------------------------------------
     -     kvm1                           shut off
     -     kvm2                           shut off
     -     kvm3                           shut off
    

    我们的实验拓扑如下:

    图中创建了 2 个 Linux Bridge:brvlan1 和 brvlan2,宿主机的物理网卡 eth0 抽象出两个虚拟设备 eth0.1 和 eth0.2,也就是两个 VLAN 设备,它们分别定义了两个 VLAN:VLAN1 和 VLAN2。挂接到两个 Bridge 上的网络设备自动加入到相应的 VLAN 中。VLAN1 接两个 VM,VLAN 接一个 VM。

    实验的目的是要验证属于同一个 VLAN1 中 VM1 和 VM2 能 ping 通,而属于不同 VLAN 中的 VM ping 不通。

    03 实验开始

    3.1 配置 VLAN

    编辑 /etc/network/interfaces,加入两个 Bridge 和两个 VLAN 设备的配置,如下:

    # The primary network interface
    auto ens33
    iface ens33 inet dhcp
    
    auto ens33.1
    iface ens33.1 inet manual
            vlan-raw-device ens33
    
    auto brvlan1
    iface brvlan1 inet manual
            bridge_stp off
            bridge_waitport 0
            bridge_fd 0
            bridge_ports ens33.1
    
    auto ens33.2
    iface ens33.2 inet manual
            vlan-raw-device ens33
    
    auto brvlan2
    iface brvlan2 inet manual
            bridge_stp off
            bridge_waitport 0
            bridge_fd 0
            bridge_ports ens33.2
    

    注意,这里务必和自己电脑的接口名称统一,比如我这里叫 ens33,就配 ens33.1 和 ens33.2 的 VLAN 设备,当然你也可以改成 eth0 的形式。

    重启宿主机,ifconfig 查看网络接口:

    brctl show 查看当前 Linux Bridge 的配置,ens33.1 和 ens33.2 分别挂载 brvlan1 和 brvlan2 上了。

    # brctl show
    bridge name	bridge id		STP enabled	interfaces
    brvlan1		8000.000c298c57e8	no		ens33.1
    brvlan2		8000.000c298c57e8	no		ens33.2
    virbr0		8000.000000000000	yes
    

    3.2 配置 VM

    我们先配置 VM1,启动 virt-manager,在图形界面中将 VM1 的虚拟网卡挂到 brvlan1 上:

    同样的方式配置 VM2 和 VM3,VM2 也配到 brvlan1 上,VM3 配到 brvlan2 上。

    3.3 查看 VM 配置

    virsh start xxx 启动 3 个 VM:

    # virsh start kvm1
    # virsh start kvm2
    # virsh start kvm3
    

    再通过 brctl show 查看 Bridge,这时发现 brvlan1 下接了 vnet0 和 vnet1,brvlan2 下接了 vnet2:

    # brctl show
    bridge name	bridge id		STP enabled	interfaces
    brvlan1		8000.000c298c57e8	no		ens33.1
    							vnet0
    							vnet1
    brvlan2		8000.000c298c57e8	no		ens33.2
    							vnet2
    virbr0		8000.000000000000	yes
    

    通过 virsh domiflist xxx 确认这就是 VM 的虚拟网卡:

    # virsh domiflist kvm1
    Interface  Type       Source     Model       MAC
    -------------------------------------------------------
    vnet0      bridge     brvlan1    rtl8139     52:54:00:b3:dd:3a
    
    # virsh domiflist kvm2
    Interface  Type       Source     Model       MAC
    -------------------------------------------------------
    vnet1      bridge     brvlan1    rtl8139     52:54:00:b7:4f:ef
    
    # virsh domiflist kvm3
    Interface  Type       Source     Model       MAC
    -------------------------------------------------------
    vnet2      bridge     brvlan2    rtl8139     52:54:00:d8:b8:2a
    

    04 验证

    为了验证相同 VLAN 之间的连通性和不同 VLAN 之间的隔离性,我们为 3 个 VM 都配置同一网段的 IP。

    使用 virt-manager 进入 VM console 控制面。

    配置 VM1 的 IP:

    ifconfig eth0 192.168.100.10 netmask 255.255.255.0
    

    配置 VM2 的 IP:

    ifconfig eth0 192.168.100.20 netmask 255.255.255.0
    

    配置 VM3 的 IP:

    ifconfig eth0 192.168.100.30 netmask 255.255.255.0
    

    使用 VM1 ping VM2 能 ping 通,VM2 ping VM3 不能 ping 通。

    验证完毕。

    大家如果有兴趣,可以抓个包看看,在发送 ping 包之前,需要知道对方的 MAC 地址,所以会先在网络中广播 ARP 包。ARP 是二层协议,VLAN 的作用就是隔离二层的广播域,ARP 包自然就不能在不同 VLAN 中流通,所以在相同 VLAN 中,通信双方能够拿到对方的 MAC 地址,也就能 ping 通,不同 VLAN 反之。


    我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

  • 相关阅读:
    experss路由工作原理
    mongoose学习参考
    express+nodejs 个人博客
    HTML5-CSS3学习20150410(一)
    js学习20150420(七)
    js学习20150401(六)
    js学习20150401(五)
    js学习20150401(四)
    【荐】使用eval()、new Function()将JSON字符串转换为JSON对象
    HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7
  • 原文地址:https://www.cnblogs.com/bakari/p/10229010.html
Copyright © 2020-2023  润新知