下面介绍在一个物理机上通过几个虚拟机使用软件模拟实现VLAN
的具体步骤
更多具体的概念可查看博文 http://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/-Linux上基础设备详解
准备工作
物理主机:Ubuntu 16.04
KVM
安装(安装后可自行检测):
sudo apt-get install qemu-kvm qemu-system libvirt-bin virt-manager bridge-utils vlan
虚拟机创建:
启动虚拟系统管理器
sudo virt-manager
将Linux镜像文件放入KVM默认查找目录
/var/lib/libvirt/images
中,随后按提示步骤创建即可(如果担心自己的物理机配置不够支撑,可以将虚拟机配置分配低一点,或者你可以选择更小的实验用Linux镜像,如cirros,可以在http://download.cirros-cloud.net/下载.img文件,创建时选择导入现有磁盘映像)配置VLAN*
VLAN结构图(其中的eth0为物理网卡名,我的为wlp3s0b1
)
编辑/etc/network/interface
,配置wlp3s0b1.10、wlp3s0b1.20、brvlan10和brvlan20,添加下列配置(其中的wlp3s0b1是我的物理网卡名,因人而异)
# auto wlp3s0b1.10 iface wlp3s0b1.10 inet manual vlan-raw-device wlp3s0b1 auto brvlan10 iface brvlan10 inet manual bridge_stp off bridge_waitport 0 bridge_fd 0 bridge_ports wlp3s0b1.10 auto wlp3s0b1.20 iface wlp3s0b1.20 inet manual vlan-raw-device wlp3s0b1 auto brvlan20 iface brvlan20 inet manual bridge_stp off bridge_waitport 0 bridge_fd 0 bridge_ports wlp3s0b1.20
重启网络后ifconfig
,可以看到配置生效
使用brctl show
查看Bridge
情况,可以看到wlp3s0b1.10与brvlan10相连,wlp3s0b1.20与brvlan20相连。
配置VM1虚拟网卡与brvlan10相连,再启动VM1(如未在列表找到桥接,可重启管理器)
同理配置VM2虚拟网卡与brvlan20相连,我们再额外配置一个VM3与brvlan20相连。分别启动VM2、VM3。
再使用brctl show
查看Bridge情况(brvlan10连着两个设备wlp3s0b1.10和vnet0,而brvlan20连着三个设备wlp3s0b1.20、vnet1、vnet2)
使用virsh
确认各个虚拟机的虚拟网卡
可知现在VM1处于VLAN10,而VM2、VM3处于VLAN20
为VM1、VM2、VM3配置同一网段的IP))
验证VLAN
连通性(VM2 与 VM3 互能 ping通))
验证VLAN隔离性(VM1不能 ping 通 VM2、VM3)
原因如下:
- VM1向VM2发 Ping 包之前,需要知道VM2的IP 192.168.100.10 所对应的 MAC 地址。VM2 会在网络上广播 ARP 包,其作用就是问 “谁知道 192.168.100.10 的 MAC 地址是多少?”
- ARP是二层协议,VLAN 的隔离作用使得ARP只能在VLAN10 范围内广播,只有 brvlan10 和wlp3s0b1.10 能收到,VLAN20 里的设备是收不到的。VM2 无法应答 VM1 发出的ARP包。
- VM1拿不到VM2 vnet0的MAC地址,也就Ping不到VM2。
验证VLAN原理
用各个虚拟机ping物理机,发现均显示不可达(无网关且处于不同网段)。
之后将虚拟机的IP手动改成与物理机同一网段,依然无法ping通,虽然在虚拟网卡中能抓包到ARP包,但是物理网卡却并没有接受到。
在用物理机ping各个虚拟机,一直处于等待,虽然能在物理网卡上抓到发出去的ICMP,但是并没有返回的ICMP包。且虚拟网卡也没有收到。
看起来物理网卡wlp3s0b1就相当于虚拟交换机上的 trunk
口,允许 vlan10 和 vlan20 的数据通过,而VLAN
和Bridge
一起实现了隔离和交换的功能。
参考博文:
Linux上基础设备详解:http://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/
动手实现Linux VLAN
:http://www.cnblogs.com/CloudMan6/p/5326737.html