手把手教你 Linux 是如何实现 VLAN 的

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「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

我们的实验拓扑如下:

clipboard.png

图中创建了 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 查看网络接口:

clipboard.png

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 上:

clipboard.png

同样的方式配置 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 通。

clipboard.png

验证完毕。

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


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

阅读 928

推荐阅读
Linux云计算网络
用户专栏

分享云计算+网络的技术栈,由公众号「Linux云计算网络( id: cloud_dev )」维护

37 人关注
28 篇文章
专栏主页