本文首发于我的公众号 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++编程技术等内容,欢迎大家关注。

Linux 系统下实践 VLAN的更多相关文章

  1. Linux系统下DHCP服务安装部署和使用详解

    一.概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或 ...

  2. Jmeter(五十四) - 从入门到精通高级篇 - 如何在linux系统下运行jmeter脚本 - 上篇(详解教程)

    1.简介 上一篇宏哥已经介绍了如何在Linux系统中安装Jmeter,想必各位小伙伴都已经在Linux服务器或者虚拟机上已经实践并且都已经成功安装好了,那么今天宏哥就来介绍一下如何在Linux系统下运 ...

  3. 在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...

  4. Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)

    Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...

  5. linux系统下的权限知识梳理

    下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...

  6. linux系统下修改文件夹目录权限

    linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...

  7. Linux系统下配置JDK环境变量

    刚申请了阿里云,平时很少接触Linux,特此记录一下Linux系统下安装JDK的步骤. 1.进入usr:cd /usr: 2.创建java文件夹:mkdir java: 3.将下载好的文件拷贝至jav ...

  8. Linux系统下远程文件拷贝scp命令

    在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...

  9. linux系统下的软连接与硬链接

    前几天在linux系统下安装mongoDB,然后运行脚本导入数据的时候遇到了链接库查询不到的情况,如图 1所示.当时是通过创建软连接的方式解决的这个问题.虽然,通过网上的教程解决了这个问题,但是对于软 ...

随机推荐

  1. MybatisMapper 动态映射(增删改查)

    //接口内容以及注意事项 package cn.jy.mybatis.mapper; import java.util.List; import cn.jy.mybatis.pojo.User; pu ...

  2. ----关于JS中迭代的三个“FOR”----

    for each...in 使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行. 一些对象的内置属性是无法被遍历到的,包括所有的内置方法,例如String对象的index ...

  3. 阿里巴巴Java编码规范插件安装使用指南

    编码规范插件安装使用指南 阿里技术公众号公布的<阿里巴巴Java开发规约>,瞬间引起全民代码规范的热潮,后又发布了PDF的终极版,大家踊跃留言,期待配套的静态扫描工具开放出来. 为了让开发 ...

  4. 图解HTTP第十章

    Web 的攻击技术 1>在客户端即可篡改请求 2>针对 Web 应用的攻击模式 3>因输出值转义不完全引发的安全漏洞 [1]跨站脚本攻击 [2]SQL 注入攻击 [3]OS 命令注入 ...

  5. js做的轮播图

    以下那些注释呢,都是要靠自己理解才是最重要的, <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  6. UWP作业(一)XAML Controls Gallery

    作为一个编程能力不是很好的uwp初学者,在控件库里看到种类繁多的选项时,需要查资料,最后决定出几种性能各方面可能不是那么出色的控件,内心也是非常纠结的.但当我把自己当成一个用户时,通过分析自己的需求, ...

  7. Python Day 12

    阅读目录: 内容回顾 函数默认值的细节 三元表达式 列表与字典推导式 函数对象 名称空间 函数嵌套的定义 作用域 ##内容回顾 # 字符串的比较 -- 按照从左往右比较每一个字符,通过字符对应的asc ...

  8. Python Day 10

    阅读目录: 函数 函数的使用 函数的分类 函数的返回值 ##函数 ##函数的定义-----what?----什么是函数: # 函数:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就 ...

  9. Ajax基本语法

    案例代码: $(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.jso ...

  10. BERT(Bidirectional Encoder Representations from Transformers)

    BERT的新语言表示模型,它代表Transformer的双向编码器表示.与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示.因此,预训练的BERT表示可以通过 ...