VLAN 二层隔离
课程(6 节,按顺序学)
VLAN 到底解决什么问题
入门 · 约 8 分钟
本课目标:搞清楚「不划 VLAN 会怎样」,从而理解 VLAN 存在的理由。
先看一台交换机不划 VLAN 是什么样
一台交换机默认所有口都在 VLAN 1,也就是一个广播域:
· 任何一台终端发广播(ARP、DHCP 发现),所有其它终端都会收到
· 任何两台终端只要 IP 同网段就能互访
小办公室这样没问题。但机器一多就出三个麻烦。
麻烦一:广播风暴
广播是按设备数量平方级增长的负担。100 台机器在一个广播域里,每台机器都要处理其它 99 台的广播 —— ARP、NetBIOS、各种发现协议。
网卡收到广播必须中断 CPU 去看一眼(哪怕看完就丢),所以广播多了终端也会变卡。
广播域越大越脆弱:一台机器网卡坏了狂发广播,整个网段一起瘫。
麻烦二:安全和权限混在一起
财务的电脑和访客的电脑在同一个广播域里,意味着:
· 访客可以直接扫到财务的机器
· 可以用 ARP 欺骗把财务的流量引到自己这里
二层里几乎没有安全机制,同广播域内基本等于「互相裸奔」。
麻烦三:物理位置绑死了逻辑分组
不划 VLAN 的话,要把财务隔离出来就得单独买一台交换机,而且财务的人必须都坐在那台交换机附近。
人员一换座位就要重新拉网线 —— 这在现实里根本没法维护。
所以 VLAN 是什么
VLAN 把一台物理交换机,从逻辑上切成好几台互不相通的交换机。
记住这一句就够了,后面所有机制都是它的推论:
· 切开了 → 跨 VLAN 天然不通(这是目的,不是故障)
· 分组按「口」划而不是按位置划 → 换座位只要改交换机上一条命令
· 每个 VLAN 是一个独立广播域 → 广播被限制在自己的 VLAN 里
「VLAN 划分」这四个字,落到配置上就是:把哪些口划到哪个 VLAN。
实验重点
- VLAN = 把一台交换机逻辑上切成好几台
- 一个 VLAN 就是一个广播域,广播只在自己的 VLAN 里泛洪
- 跨 VLAN 不通是设计目的,不是故障 —— 要互通必须额外做三层
- VLAN 按端口划分,所以换座位不用改网线布局
端口类型和 PVID:整个 VLAN 最容易搞混的地方
入门 · 约 12 分钟
本课目标:把「端口类型」拆成两个独立的问题来记,从此不再混。
先记住一句:终端完全不知道 VLAN 的存在
802.1Q 标签是交换机加的、也是交换机剥的。
电脑、打印机、摄像头的网卡发出来的永远是不带标签的普通以太帧,收到带标签的帧它们直接丢弃(不认识)。
所以「接终端的口出去必须剥标签」不是规定,而是必然 —— 这就是 Access 口的由来。
把端口类型拆成两个问题
别去背三种类型的定义,改成问两个问题:
问题①:收到「不带标签」的帧怎么办?
答案对三种类型都一样:按这个口的 PVID 打上标签。
问题②:发出去的时候带不带标签?
· Access —— 一定不带(对面是终端)
· Trunk —— 一般带,但 PVID 那个 VLAN(native)不带
· Hybrid —— 每个 VLAN 自己指定带或不带
两个问题答完,三种端口类型的全部行为就都推出来了。
PVID 只在一个地方起作用
PVID 只管「收到不带标签的帧」这一种情况。
帧已经带标签了,就按标签里写的 VLAN 走,PVID 完全不参与。
这是最容易记混的一点。很多人以为 PVID 是「这个口属于哪个 VLAN」——
对 Access 口来说恰好等价,但对 Trunk 就完全不是那个意思了。
Access 口:接终端
· 一个 Access 口只属于一个 VLAN(就是它的 PVID)
· 收到终端的帧 → 打上 PVID 的标签
· 发给终端 → 剥掉标签
· 别的 VLAN 的帧想从这个口出去 → 直接丢(这就是跨 VLAN 二层不通的实现方式)
华为:port link-type access + port default vlan 10
思科:switchport mode access + switchport access vlan 10
Trunk 口:接交换机
一根线上要同时跑好几个 VLAN,对端怎么知道每个帧属于哪个 VLAN?
靠标签。 所以 Trunk 出去的帧带 802.1Q 标签(帧长多 4 字节)。
两个必配项,漏了就是故障:
· port trunk allow-pass vlan 10 20 —— 放通哪些 VLAN,两端都要放
· PVID(native VLAN)—— 两端必须一致
这两个各对应一类高频故障,第 4 课专门讲。
Hybrid 口:华为特有
既能带也能不带,每个 VLAN 单独指定。华为设备上口的默认类型就是 hybrid,这一点经常让人意外(思科默认是 access/dynamic)。
经典用途:一个墙上网口同时接 IP 电话和电脑 —— 电话串在中间,语音 VLAN 带标签、电脑的数据 VLAN 不带标签,一根线搞定两个 VLAN。
实验重点
- 终端永远收发不带标签的普通帧,标签是交换机加的
- PVID 只在「收到不带标签的帧」时起作用
- Access 出去一定剥标签;Trunk 除 native 外都带标签;Hybrid 逐个 VLAN 指定
- Trunk 两端的 allow-pass 和 PVID 都必须匹配
跨交换机:802.1Q 标签为什么必须存在
入门 · 约 10 分钟
本课目标:看清标签在链路上的样子,理解它为什么是「链路本地」的。
先想一个问题
SW1 上有 VLAN 10 和 VLAN 20 的终端,SW2 上也有。中间只有一根网线。
SW1 把一个帧发过去,SW2 怎么知道这个帧属于哪个 VLAN?
普通以太帧里没有任何 VLAN 信息。所以只有两条路:
· 每个 VLAN 拉一根线(VLAN 一多就爆了)
· 在帧里加个字段写上 VLAN 号 ← 这就是 802.1Q
802.1Q 标签长什么样
在以太帧的「源 MAC」后面插入 4 个字节:
目的MAC(6) 源MAC(6) [TPID(2) TCI(2)] 类型(2) 数据... FCS(4)
└── 这 4 字节是 802.1Q 标签
· TPID = 0x8100,固定值,网卡靠它认出「这是个带标签的帧」
· TCI 2 字节 = PRI(3bit) + CFI(1bit) + VLAN ID(12bit)
12 bit → 0~4095,其中 0 和 4095 保留,所以可用 VLAN 是 1~4094。
PRI 那 3 bit 是 802.1p 优先级,QoS 用它,这也是为什么语音要单独一个 VLAN —— 有了标签才有地方写优先级。
标签是「链路本地」的
看逐跳仿真里的帧长这一列:
· 终端 ↔ 交换机(Access):84 字节,不带标签
· 交换机 ↔ 交换机(Trunk):88 字节,带标签
标签进交换机就加上、出交换机就剥掉,只存在于交换机之间那一段链路上。
所以有个常见困惑:「我抓包怎么看不到 VLAN 标签?」——
因为你抓在 Access 口/终端上了。 要看标签得抓 Trunk 口,而且抓包软件所在的网卡也得允许接收带标签的帧。
Trunk 是「一根线跑多个 VLAN」,不是「不受限制」
Trunk 不等于「什么都能过」。它只放通 allow-pass 列表里的 VLAN,没在列表里的直接丢。
这个设计是对的 —— 一条 Trunk 通常不需要承载全部 4094 个 VLAN,只放需要的能减少无谓的广播泛洪。
但它也造成了最高频的 VLAN 故障,下一课就讲。
实验重点
- 802.1Q 在源 MAC 后插 4 字节,其中 12 bit 是 VLAN ID
- 可用 VLAN 是 1~4094(0 和 4095 保留)
- 标签是链路本地的:进交换机加、出交换机剥
- 抓不到标签通常是因为抓在了 Access 口上
- TCI 里的 3 bit 802.1p 优先级是语音 VLAN 存在的原因之一
两类高频故障:漏放通 和 PVID 不一致
排障 · 约 12 分钟
本课目标:学会从「现象」直接反推到「哪个口配错了」。
故障一:Trunk 忘了放通某个 VLAN
现象:一部分 VLAN 跨交换机能通,另一部分不能。
这个现象几乎是这个故障的指纹。因为如果是物理问题或者 Trunk 根本没配,那应该是全部 VLAN 都不通;只有一部分不通,就说明 Trunk 本身是好的,只是 allow-pass 列表漏了那个 VLAN。
当前场景就埋了这个坑:Trunk 只放通了 VLAN 10,没放 VLAN 20。
怎么查
华为:display port vlan —— 一条命令看全部口的类型、PVID、放通列表,最好用
思科:show interfaces trunk —— 直接列出每条 Trunk 的 native 和 allowed
查的时候注意:两端都要看。只在一端放通等于没放通,因为帧从对端进来时会在入口就被丢掉。
故障二:两端 PVID 不一致
现象:两个不同 VLAN 的终端居然能互访。
这个比不通更麻烦,因为「能通」看起来像正常的,没人会去报故障,但 VLAN 隔离已经失效了 —— 是安全问题。
成因链条:
① SW1 的 Trunk PVID 是 10,VLAN 10 是它的 native VLAN → 不带标签发出去
② SW2 的 Trunk PVID 是 20,收到不带标签的帧 → 按自己的 PVID 打成 VLAN 20
③ 于是 SW1 的 VLAN 10 和 SW2 的 VLAN 20 变成了同一个广播域
根源就是 V2 那条规则:收到不带标签的帧就按 PVID 打标签。
为什么会有 native VLAN 这个设计
既然 native VLAN 这么容易出问题,为什么还要有?
历史原因:要兼容不认识 802.1Q 的老设备(还有 hub)。把它们所在的 VLAN 设成 native,帧不带标签发出去,老设备就能收。
现在的实践是:
· 两端 PVID 保持一致(一般都留 1,或者都改成同一个)
· 安全要求高的场景把 native VLAN 改成一个不用的 VLAN(比如 999),并且不放通它 —— 这样任何不带标签进来的帧都进不了业务 VLAN
排障顺序(照这个走,不要跳)
① 物理层:口 up 吗、网线通吗(display interface brief)
② VLAN 存在吗:display vlan,没创建的 VLAN 在口上是配不上的
③ 接入口 PVID 对吗:display port vlan,终端到底落在哪个 VLAN
④ Trunk 放通了吗:两端都看 allow-pass
⑤ Trunk PVID 一致吗:不一致会串 VLAN
⑥ 到这一步二层就没问题了,跨 VLAN 不通的话去查三层
实验重点
- 一部分 VLAN 跨交换机不通 → Trunk 漏了 allow-pass
- 不同 VLAN 居然能通 → Trunk 两端 PVID 不一致,隔离失效
display port vlan(华为)/show interfaces trunk(思科)一条命令定位大半问题- Trunk 的两端都要查 —— 只配一端等于没配
跨 VLAN 互通:VLANIF 和单臂路由
进阶 · 约 12 分钟
本课目标:知道两种做法怎么配、差在哪、为什么现在都用 VLANIF。
先明确:跨 VLAN 不通不是故障
VLAN 的目的就是隔离。跨 VLAN 不通是设计成功,不是失败。
所以「跨 VLAN 互通」是一个额外要做的事,而且必须走三层 —— 因为两个 VLAN 是两个广播域、两个网段,二层上永远到不了对方。
路径一定是:终端 → 本 VLAN 的网关 → 三层转发 → 对端 VLAN → 目的终端。
所以终端必须配默认网关
终端发现目的 IP 不在自己网段,就把帧发给默认网关的 MAC。
没配网关 → 不知道发给谁 → 跨网段的包连交换机都出不去。
「同 VLAN 能通、跨 VLAN 不通」而且交换机上啥也没配错的时候,先看终端的网关和掩码 —— 这一步经常被跳过。
做法一:三层交换机 VLANIF(现在的标准做法)
在交换机上给每个 VLAN 建一个虚接口,配上 IP 当这个 VLAN 的网关:
vlan batch 10 20 interface Vlanif10 ip address 192.168.10.1 255.255.255.0 interface Vlanif20 ip address 192.168.20.1 255.255.255.0
思科叫 SVI:interface Vlan10,另外必须开 ip routing,不开 SVI 之间不转发。
两个前提条件:
① VLAN 必须先创建,否则 interface Vlanif10 建不出来
② VLANIF 要 up,这个 VLAN 里至少有一个 up 的物理口 ← 最容易踩
做法二:单臂路由
没有三层交换机的时候用:交换机和路由器之间一条 Trunk,路由器上按 VLAN 建子接口:
interface GE0/0/1.10 dot1q termination vid 10 ip address 192.168.10.1 255.255.255.0 arp broadcast enable ← 不配这条子接口不回 ARP,ping 不通网关
思科:encapsulation dot1Q 10(不需要 arp broadcast enable)。
交换机侧那个口必须是 Trunk 且放通所有要互通的 VLAN。
两者差在哪
| | VLANIF | 单臂路由 |
| --- | --- | --- |
| 转发位置 | 交换芯片,线速 | 路由器 CPU,慢一个量级 |
| 带宽 | 背板带宽,很大 | 那一根线,且流量走两遍 |
| 单点故障 | 无额外 | 线或路由器挂 = 全部跨 VLAN 中断 |
| 成本 | 要三层交换机 | 二层交换机 + 路由器就行 |
所以现网都用 VLANIF。单臂路由现在主要是面试题和很小的场景。
但它的价值在于把「跨 VLAN 必须过三层」这件事画得非常直观 —— 流量真的从线上出去又回来。
实验重点
- 跨 VLAN 不通是设计目的,互通要额外做三层
- 终端必须配默认网关,否则跨网段的包出不去
- VLANIF/SVI 要 up,前提是这个 VLAN 里有 up 的物理口
- 思科 SVI 之间要转发必须开
ip routing - 华为子接口要配
arp broadcast enable,否则 ping 不通网关 - 单臂路由的流量在同一根线上走两遍,是瓶颈
怎么测「VLAN 配对了没有」
排障 · 约 10 分钟
本课目标:建立一套可复用的验证方法,而不是靠随便 ping 两下。
先写下预期,再去测
这是最关键的一步,也是新手最容易跳过的一步。
没做三层互通时,正确的结果是:
· 同 VLAN 且同网段 → 通
· 跨 VLAN → 不通
做了三层互通后:
· 全通
没有预期就没法判断对错。「能 ping 通」本身既可能是成功也可能是隔离失效。
连通性矩阵:一次看全
两两 ping 一遍,画成矩阵。矩阵会把两类偏差单独标出来:
· 本该通却不通 → 配置漏了(Trunk 漏放通、PVID 划错、口 down)
· 本该隔离却通了 → PVID 不一致造成串 VLAN,安全问题
第二类比第一类严重,而且不会有人报故障 —— 只能靠主动测出来。
四条命令解决大半问题
华为:
· display vlan —— VLAN 建了吗、成员口是谁
· display port vlan —— 最有用的一条:每个口的类型、PVID、放通列表
· display interface brief —— 口 up 吗
· display mac-address —— MAC 学到了吗、学在哪个 VLAN
思科:show vlan brief / show interfaces trunk / show interfaces status / show mac address-table
MAC 表是二层排障的证据
display mac-address 能看出很多东西:
· 终端的 MAC 学到了吗 → 没学到说明帧根本没到,查物理和 PVID
· 学在哪个 VLAN → 和你以为的不一样,说明 PVID 配错了
· 学在哪个口 → 和你以为的不一样,说明线接错了
「我以为它在 VLAN 10」和「交换机认为它在 VLAN 20」的差异,MAC 表一看就知道。
上线前的检查清单
① VLAN 都创建了(display vlan)
② 每个接终端的口类型是 access、PVID 是规划的那个
③ 每条 Trunk 两端都放通了要跑的 VLAN
④ 每条 Trunk 两端 PVID 一致
⑤ 每个 VLAN 的网关地址规划好,且终端配的网关和掩码对得上
⑥ 要互通的 VLAN 都建了 VLANIF,且 VLANIF 是 up 的
⑦ 跑一遍连通性矩阵,和预期逐格对比
实验重点
- 先写预期再去测 —— 「能通」既可能是成功也可能是隔离失效
display port vlan一条命令看全部口的类型/PVID/放通列表- MAC 表是二层排障的证据:学到了吗、学在哪个 VLAN、哪个口
- 「本该隔离却通了」没人会报故障,只能主动测出来