本页课程原文(点开阅读)

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、哪个口
  • 「本该隔离却通了」没人会报故障,只能主动测出来
冀ICP备2026021556号-2|冀公网安备13068302000206号