本文首发于我的公众号 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. 七、PyQT5控件——QSlider,QSpinBox

    一.Qslider QSlider是一个滑动条,可以设置成水平或垂直放置.最常用的方法允许用户在某一范围内互动该滑块,并将滑块的位置转换成一个整数值(int类型),这种方式可以在某一个范围内平顺的变动 ...

  2. 关于git的一些命令

    git命令 1.git init 初始化仓库 2.git status 查看当前状态 3.git add -A(提交所有的) 提交本地文件到缓存区 4.git commit -m"提交信息& ...

  3. Oracle获取异常的具体出处dbms_utility.format_error_backtrace

    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE :返回当前异常相应的描述,通过它就能知道异常的最初生成处.   系统为最近一次生成的异常设置了一个栈,并跟踪它的传递过程,而这个 ...

  4. Java性能优化的50个细节(珍藏版)

    原文地址:https://www.toutiao.com/i6595499804082569742/ 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重 ...

  5. 前台js接收后台的json数据

    后台返回的json数据,如php的: return json_encode($data); 在前台 js接收如下: function json2object(str){ var jsstr = str ...

  6. python迭代器与生成器详解

    迭代器与生成器 迭代器(iterator)与生成器(generator)是 Python 中比较常用又很容易混淆的两个概念,今天就把它们梳理一遍,并举一些常用的例子. for 语句与可迭代对象(ite ...

  7. 收集几个html和element-ui的录入控件

    我希望有一个控件去显示或输入账本的金额 先做一些资料收集,也希望大家给个建议 输入银行账号会设置每四位添加一个空格 https://blog.csdn.net/wkx18330698534/artic ...

  8. winform中TextBox只能输入字母

    private void txtTestPerson_KeyPress(object sender, KeyPressEventArgs e) { if ((e.KeyChar >= 'a' & ...

  9. java基础0615

    1. 1)2)   1)输出:Base  2)编译成功,但没有输出. 2. 编译成功,但没有输出. 3. 只有12行的话,不会新建文件.需要create~~ 4. public static void ...

  10. access纯jdbc连接

    Class.forName("com.hxtt.sql.access.AccessDriver"); String url = "jdbc:Access:///c:/a/ ...