很久没碰交换机的朋友问我一个问题:公司两台交换机,接了几十台电脑,最近网络卡得离谱,一开视频会议,全楼都掉线,问我怎么救。我看了一下拓扑,二十多台设备挤在同一个二层广播域里,ARP、DHCP、NetBIOS的广播包满天飞,一台机器的网卡出点小毛病,能把整个楼层的网络拖垮。这事的解法,说穿了就四个字母:VLAN。
“学习日志13-VLAN基本原理”这条笔记,其实就是把我自己从“会敲命令”到“想明白原理”的那段过程复盘一遍。VLAN(Virtual Local Area Network,虚拟局域网)不是新东西,但它是一切的根基——你后面学三层交换、网关冗余、无线漫游、防火墙虚拟化,都绕不开VLAN这套逻辑。这篇文章不打算抄手册,就按我实际理解这个知识点的顺序来写:先想清楚它解决什么,再看它怎么实现,然后怎么配、怎么排错。新手看完能真正上手,老手也能当个梳理。
1. 为什么非学VLAN:先聊聊没有VLAN的局域网有多混乱
1.1 一个广播域的失控现场
把几十台电脑直接扔在同一个二层网络上,也就是一台交换机或者几台交换机互联,不加任何隔离,会出现什么情况?
先说广播。只要有一台设备发ARP请求(问“谁的IP是192.168.1.10,把MAC告诉我”),这个广播帧会被交换机转发给除接收端口外的所有端口。也就是说,你的一台电脑每次上网前寻址,都得“喊一嗓子”,全网都听。这在一二十台设备时还能忍,到了两百台,广播帧的占比可能达到全网流量的20%~30%,有效带宽被蚕食,终端网卡的中断频率也在飙升。更麻烦的是广播风暴——如果网上出现一个环路,或者某台设备的网卡物理层出故障疯狂发帧,广播帧会在交换机之间反复复制、转发,瞬间占满所有链路带宽,表现就是整个网络“死机”。这种故障你抓包都来不及,交换机CPU先被灌死了。
再说安全和管理。同一个二层网络里,只要插上网线,就能直接嗅探到同网段其他设备的通信流量。抓包工具一开,HTTP明文账号密码、文件共享数据全裸露。部门之间的敏感数据毫无隔离,出了事你连边界都画不出来。而且排障也痛苦:全楼一个广播域,一台设备出现问题,你根本没法缩小范围,只能一台一台拔线试。
1.2 VLAN的解决思路:在物理网络里切出逻辑隔离
VLAN的思路,是在一台(或一组)物理交换机上,通过配置把端口划分成多个逻辑上独立的局域网。每一个VLAN就是一个独立的广播域。VLAN 10里的广播帧,不会传到VLAN 20里去;反过来也一样。
这就等于你在同一台物理设备上,凭空切出了几台“虚拟交换机”,互不相通。这个隔离是数据链路层(二层)层面的,成本低、效果好,不用增加任何硬件。原来需要买多台物理交换机才能隔离的两个部门,现在一台设备上就搞定了。
不过要注意:VLAN隔离的是广播域和二层通信。默认情况下,VLAN 10的主机和VLAN 20的主机是不能直接通信的,因为它们在逻辑上是两栋楼。要跨VLAN通信,必须走三层(路由)。这个后面细说。
2. VLAN的划分方式:除了按端口,还有什么招
2.1 端口划分法:最常用、最靠谱
基于端口划分VLAN,就是给交换机的每个物理端口指定一个VLAN ID。比如把交换机的1~8号端口划给VLAN 10(技术部),9~16号端口划给VLAN 20(财务部)。接在1号口的电脑,不管是谁、不管MAC地址是什么,都默认属于VLAN 10。
这种方式最直观,配置最简单,一个端口只能属于一个VLAN(特殊的多VLAN端口后续讲Trunk)。它的缺点是:如果你把电脑从1号口挪到9号口,它的VLAN就从10变成了20,网络权限跟着变。如果办公区调整,IT得跟着去交换机上改端口配置。端口划分适用于大部分固定工位的企业内网。
2.2 基于MAC、基于IP、基于协议的划分
除了端口,还有几种划分方式,我在实际中见过,但用的场景有限。
基于MAC地址划分VLAN,是预先在交换机上建立MAC地址和VLAN ID的对应表,设备接入时根据MAC自动划入对应VLAN。好处是设备挪地方了,VLAN不变,对移动办公友好。坏处是MAC地址表维护量大,而且MAC地址可以伪造,安全性并不高。一般只在某些特定场景结合安全策略使用,全公司范围用这个的很少。
基于IP子网划分,是根据报文的源IP地址决定它属于哪个VLAN。这个适合要兼顾IP地址规划的场合,但交换机得检查三层信息,性能开销比端口划分大。基于协议划分(如IPv4流量、IPv6流量走不同VLAN)更是少见。
我的建议:刚开始学、实际项目里,八成以上的场景用基于端口划分就够了。其余的可以了解,别钻牛角尖。
3. 802.1Q标签:数据结构层面的那点事儿
3.1 交换机怎么知道一个帧属于哪个VLAN
端口划分好之后,交换机内部处理帧时,是知道每个帧属于哪个VLAN的。但问题来了:帧在交换机内部走的时候可以靠“内部记忆”,但一台交换机要把帧发给另一台交换机时,对方怎么知道这个帧属于哪个VLAN?
解决方法是:在以太网帧头的源MAC地址和类型字段之间,插入一个4字节的VLAN标签(Tag),把VLAN ID写进去。这就是IEEE 802.1Q标准。
3.2 4字节标签的字节级拆解
802.1Q标签是4字节,紧跟源MAC后面,具体拆开看是两部分:
| 部分 | 长度 | 内容 |
|---|---|---|
| TPID(Tag Protocol Identifier) | 2字节 | 固定值0x8100,相当于一个“类型标记”,告诉交换机这个帧带VLAN标签 |
| TCI(Tag Control Information) | 2字节 | 里面包含PCP、DEI、VID |
TCI这2字节里:
- VID(VLAN ID)占12bit,取值范围0~4095。0和4095保留,实际可用的是1~4094。
- PCP(Priority Code Point)占3bit,表示802.1p优先级,一共8个等级,用于QoS。
- DEI(Drop Eligible Indicator)占1bit,用于拥塞时标记可丢弃的帧。
所以VLAN ID不是随便写的,上限就是4094。为什么很多公司在规划IP时不约而同用VLAN 10、20、30?纯粹是为了好记,跟网段后面对应。比如VLAN 10对应192.168.10.0/24,VLAN 20对应192.168.20.0/24,排错时看一眼IP就能猜到在哪个VLAN。
4. 端口角色:Access和Trunk一个都不能错
4.1 Access端口:给电脑用的“单车道”
Access端口一般接终端设备——电脑、打印机、IP电话。它的特点是:这个端口只能属于一个VLAN,也就是我们常说的PVID(Port VLAN ID)。
Access端口收到从设备发来的帧时,有两种情况:
- 如果收到的是不带标签的帧(普通电脑网卡发出的都是这种),交换机就给这个帧打上这个端口的PVID,按PVID对应的VLAN来处理。
- 如果收到的是带标签的帧,而且标签里的VID等于PVID,那就正常转发;如果不等,很多交换机会直接丢弃。
Access端口向设备发帧时,会把标签剥掉,还原成普通无标签的以太网帧再发出去。电脑网卡感知不到VLAN的存在,它就是“什么标签都没有”。这也是为什么Access口在交换机上看起来是“进去打标签,出去剥标签”。
4.2 Trunk端口:交换机之间的“主干道”
Trunk端口一般接两台交换机之间,或者交换机接路由器/防火墙。它的作用是让多个VLAN的流量在一条物理链路上同时传输。
Trunk端口默认情况下允许所有VLAN通过(实际操作中厂商默认策略不同,有的默认全放行,有的默认只放行VLAN 1,配的时候务必确认)。帧从Trunk口出去时,不会去掉标签,保留着802.1Q标签发到对端交换机的Trunk口,对方一看帧里的VID,就知道该按哪个VLAN处理。
这里有个重要细节:Native VLAN(原生VLAN)。默认一般是VLAN 1。Trunk口上属于Native VLAN的帧,在链路上传输时是不打标签的。两个交换机就是为了让彼此的Native VLAN保持一致,如果不一致,VLAN 1的流量在链路上就会因为“不带标签”而被对端按对端的PVID误解处理,很可能出现奇怪的互通问题。很多“通了部分VLAN,VLAN 1不通”的怪故障,根源就在这里。
4.3 Hybrid端口:混合模式,我平时很少用
介于Access和Trunk之间还有一种Hybrid口,它允许在出方向指定某些VLAN剥标签、某些VLAN保留标签,比较灵活,但也比较绕。华为等厂商的设备上常见,用于一些特殊组网需求。我对新手说句实在话:先把Access和Trunk理解透,Hybrid等你真正遇到需要它的场景,再回来查文档不迟。绝大多数中小型网络,用不到Hybrid。
5. 配置实操:两分钟搭一个跨交换机的VLAN环境
5.1 实验拓扑与规划
假设场景:两台交换机SW-A和SW-B,需要让技术部(VLAN 10)和财务部(VLAN 20)的电脑能各自互通,且技术部的电脑可能接在SW-A上,也可能接在SW-B上。
| 交换机 | 端口 | VLAN | 说明 |
|---|---|---|---|
| SW-A | GE0/0/1 ~ GE0/0/8 | VLAN 10 | 接技术部电脑 |
| SW-A | GE0/0/9 ~ GE0/0/16 | VLAN 20 | 接财务部电脑 |
| SW-A | GE0/0/24 | Trunk | 连SW-B的GE0/0/24 |
| SW-B | GE0/0/1 ~ GE0/0/8 | VLAN 10 | 接技术部电脑 |
| SW-B | GE0/0/9 ~ GE0/0/16 | VLAN 20 | 接财务部电脑 |
| SW-B | GE0/0/24 | Trunk | 连SW-A的GE0/0/24 |
注意:交换机默认所有端口都在VLAN 1里,所以要先把相应端口从VLAN 1挪到目标VLAN。
5.2 基础配置命令(以常见CLI风格为例)
以下是我写的类命令行脚本,请结合你手头设备的具体语法微调、确认:
# SW-A 上创建VLAN vlan 10 description Tech_Dept exit vlan 20 description Finance_Dept exit # 将端口从默认VLAN 1改划到VLAN 10 interface GigabitEthernet 0/0/1 port link-type access port default vlan 10 exit # 批量操作端口也是一样的逻辑,按需重复即可 interface GigabitEthernet 0/0/9 port link-type access port default vlan 20 exit # SW-A 上连SW-B的Trunk口 interface GigabitEthernet 0/0/24 port link-type trunk port trunk allow-pass vlan 10 20 exitSW-B上的配置思路完全一样,注意两端Trunk口放行的VLAN列表要一致(10和20)。配完后:
- 技术部的电脑配置192.168.10.x/24网段,网关暂不配或者后面配;
- 财务部的电脑配置192.168.20.x/24网段。
同一VLAN内、接在不同交换机上的电脑,应当能直接互相ping通。这就是VLAN跨交换机生效的直接证明。
提示:很多排错案例都是“Trunk两端放行VLAN不一致”。你在SW-A上放行了VLAN 10 20,却有人在SW-B的Trunk口上只放了VLAN 10,那VLAN 20跨交换机就肯定不通。检查这种问题时,别只看一台交换机,两端一定要对起来看。
6. 跨VLAN通信:隔离之后怎么连起来
6.1 单臂路由:用一台路由器打通多个VLAN
VLAN把二层隔离了,但业务上经常需要跨VLAN访问,比如财务要访问技术部的ERP服务器。这时就需要三层路由功能。最简单的办法是单臂路由(Router-on-a-Stick)。
把路由器的物理接口(比如GE0/0/0)用一条线接到交换机的Trunk口上。然后在路由器的这个物理口上创建多个子接口,每个子接口对应一个VLAN的网关。
例如:
# 路由器子接口配置 interface GigabitEthernet0/0/0.10 dot1q termination vid 10 ip address 192.168.10.1 255.255.255.0 arp broadcast enable exit interface GigabitEthernet0/0/0.20 dot1q termination vid 20 ip address 192.168.20.1 255.255.255.0 arp broadcast enable exitVLAN 10的设备把网关指向192.168.10.1,VLAN 20的设备把网关指向192.168.20.1。两个VLAN的设备要互访时,报文先送到各自网关(也就是路由器子接口),路由器查路由表,发现目标网段在另一个子接口上,于是把报文从另一个子接口转发出去。这个过程就是路由。由于中间只有一条物理链路,多个VLAN的流量都在这一条链路上跑,所以叫“单臂路由”。
单臂路由的瓶颈很明显:所有跨VLAN流量都挤在那一条物理链路和路由器上。VLAN多了、流量大了,路由器CPU就扛不住。所以它适合小规模、跨VLAN流量不大的场景。
6.2 三层交换机:我更推荐的生产环境方案
比单臂路由更常见的是三层交换机。三层交换机能同时做二层交换和三层路由。你可以在交换机上直接创建VLAN虚接口(SVI,Switch Virtual Interface),也就是给VLAN配置一个IP地址作为网关,然后在交换机内部启用路由。
配置逻辑:
# 三层交换机上为VLAN 10配置虚接口 interface Vlanif10 ip address 192.168.10.1 255.255.255.0 exit interface Vlanif20 ip address 192.168.20.1 255.255.255.0 exit然后在系统视图下开启IP路由功能(具体命令取决于品牌,有的默认开启)。之后VLAN 10和VLAN 20的主机把网关指向192.168.10.1和192.168.20.1,就能通过三层交换机完成互访。因为转发在交换机内部的硬件芯片上完成,速度远高于路由器软件转发,所以在企业组网里,三层交换机几乎成了标准配置。
需要留意的是:三层交换机支持的是“VLAN间路由”,也就是不同网段的三层转发。如果你要访问外网,还是需要接一台路由器或防火墙做NAT和出口策略,这不是交换机本身管的事。
7. 我在配置VLAN时踩过的坑与排查技巧
7.1 最常见的“不通”:Trunk没有放行VLAN
现象:电脑在同一个VLAN,却在两个交换机上ping不通;或者某个VLAN的流量只有一部分能通。
排查顺序:
- 先确认两台交换机的Trunk状态,用命令查看Trunk口的PVID、允许通过的VLAN列表、Native VLAN。
- 确认两端Trunk的放行VLAN列表完全一致。
- 确认链路是up的,物理层没问题。
- 再分别查看Access口是否划到了正确的VLAN。
这类问题八成是配置不一致,很少是硬件坏了。
7.2 帧标签“打架”:Native VLAN不一致
前面说过,Trunk链路上Native VLAN的帧是不打标签的。如果SW-A的Native VLAN是VLAN 1,SW-B的Native VLAN被改成了VLAN 99,那么SW-A发出VLAN 1的无标签帧,SW-B收到后会按自己的PVID视为VLAN 99的帧来处理,两边各说各话。结果就是VLAN 1的设备跨交换机通信出问题,而其他VLAN看着都正常,因为这个现象太隐蔽,很多人查半天查不到。处理办法:把Trunk两端的Native VLAN改成一致,或者明确规划不使用默认VLAN 1承载业务(我习惯把业务VLAN从10、20开始规划,VLAN 1就保留给管理用途)。
7.3 安全上的几个底线配置
VLAN的安全意义不亚于性能。我见过不少公司,VLAN划了,但Access口接电脑的端口上什么保护都没做。结果有人拿着笔记本插到工位上,直接获得了该VLAN的网络权限。
建议至少做这几件事:
- Access口开启端口安全(限制最大MAC地址数),防止私接小路由器或无线路由器。
- 不需要DHCP服务的VLAN,在交换机上配置DHCP Snooping,防止局域网私设DHCP服务器分配错误网络参数。
- 访客网络单独建一个VLAN,和办公VLAN完全隔离,要访问什么资源单独放策略。
- Trunk口只放行必要的VLAN,不要把Trunk口接到普通终端上,防止有人抓包看到所有VLAN的标签帧。
7.4 排查VLAN问题的实用命令思路
我排VLAN问题时会顺着“物理层→二层→三层”的次序看:
| 层次 | 检查内容 | 对应命令/方法 |
|---|---|---|
| 物理层 | 端口up、光模块正常、线缆类型对 | display interface brief |
| 二层 | Trunk放行VLAN、PVID、端口VLAN归属 | display port vlan / display vlan |
| 三层 | 网关是否通、路由表是否完整 | ping 网关、display ip routing-table |
抓包工具也是利器。在电脑上抓包,如果能收到ARP请求但没回应,基本可以判断VLAN隔离生效但三层没通;如果连ARP请求都看不到,问题大概率在二层端口配错或Trunk没有放行。
8. 最后补充几个我自己的习惯
给其他人排完VLAN的坑,我总结出几条“非手册级”的习惯,也算跟前面所有内容做个呼应。
第一个习惯是画拓扑。别觉得画图浪费时间,哪怕用最简单的方式画一张结构图,标清楚交换机端口、VLAN、IP网段归属,排错效率能提高一个档次。大多数VLAN故障都是“人脑里没有图”造成的。
第二个习惯是规划不留漏洞。给VLAN分配IP网段时,我通常把VLAN ID和IP第三段对应起来,比如VLAN 10对应10.10.10.0/24,VLAN 20对应10.10.20.0/24。这样不管多少台设备,一看IP就知道属于哪个VLAN,排查又快又不容易写错。
第三个习惯是改配置之前先看当前配置。很多人上去就敲命令,敲一半发现和原有配置冲突,只能又回滚。其实花一分钟看下端口当前模式、当前放行列表,能省后面至少十分钟的慌乱。
我学习VLAN基本原理的最大体会是:这东西不是一个“背完配置命令就结束”的知识点,而是所有交换网络排障的地基。你只要把广播域隔离、标签转发、端口角色这三件事在脑子里走通了,后面看三层交换、路径开销、多生成树,都会顺很多。希望这篇学习日志,能帮你少走一点我当时走过的弯路。