VLAN跨交换机通信详解:Access、Trunk与802.1Q标签实战

VLAN跨交换机通信详解:Access、Trunk与802.1Q标签实战 1. VLAN 基础为什么交换机之间通信要“带着 VLAN”一起走先来看一个非常常见的业务场景。公司办公网里有两台接入交换机一台放在 1 楼一台放在 2 楼财务部、人事部、研发部分散在不同楼层。现在需要做到两个效果不同部门之间默认不能互相访问避免越权访问和内网广播风暴。同一个部门的人不管在 1 楼还是 2 楼都要能互相通信。如果只用普通交换机的默认配置把所有设备丢在同一个广播域里那么任何一台电脑发出的 ARP 广播、DHCP 发现报文都会传递到整张网络既不安全也会随着设备数量增多严重影响性能。而 VLANVirtual Local Area Network虚拟局域网就是用来解决这个问题的。VLAN 的核心作用是把一台物理交换机在逻辑上拆成多台“虚拟交换机”。每个 VLAN 是一个独立的二层广播域默认情况下 VLAN 之间不能直接二层互访。更重要的是VLAN 这个属性并不只是某一台交换机上的本地概念——当数据帧需要从交换机 A 传到交换机 B 时交换机必须让对端知道“这个帧属于哪个 VLAN”否则对端就无法决定应该从哪个端口转发出去。这就是“交换机之间的通信带 VLAN 的情况”要解决的核心问题在一根网线连接两台交换机的时候这根线上跑的帧里必须包含 VLAN 信息并且两端交换机要按同一套规则来识别和处理这些信息。本篇文章会从二层链路原理开始把 Access、Trunk、802.1Q 标签、PVID 这些概念一次讲透然后分别给出同 VLAN 跨交换机通信、不同 VLAN 间三层通信的完整配置流程最后整理一份日常维护和排错清单。2. 关键概念拆解帧、标签、端口类型、PVID在进入配置之前有几个概念必须建立起来。很多初学者配置完发现不通往往就是卡在下面这几个点上。2.1 VLAN 是在数据帧上“做标记”的默认情况下以太网帧的头部结构是“目的 MAC 源 MAC 类型 数据 FCS”。一台交换机收到一个普通帧时它是无法判断这个帧属于哪个 VLAN 的。为了让 VLAN 信息能在交换机之间传递IEEE 802.1Q 标准在以太网帧头的源 MAC 地址之后、类型字段之前插入了 4 个字节的 VLAN Tag其中包含一个 12 比特的 VLAN ID取值范围是 1 到 4094。这 4 个字节就是“带 VLAN 通信”的关键。当数据帧从交换机 A 的 Trunk 口发往交换机 B 时帧里会携带这个 Tag交换机 B 收到后读取 Tag 中的 VLAN ID就知道接下来应该按照哪个 VLAN 的 MAC 地址表来做转发决策。这里需要记住一个结论交换机内部处理时帧是“带着 VLAN 标签”被映射到对应的 VLAN 中的。交换机转发到 Access 口时会剥掉 VLAN Tag还原成普通帧。交换机转发到 Trunk 口时会保留 VLAN Tag除非这个帧属于 Native VLAN各厂商处理方式不同。2.2 Access 端口与 Trunk 端口Access 口面向终端的“单 VLAN 通道”Access 端口通常用来连接 PC、打印机、服务器等终端设备。Access 端口只能属于一个 VLAN并且从 Access 口收到的帧默认是不带 Tag 的。交换机在收到来自 Access 口的无标签帧时会打上该端口所属 VLAN 的 Tag再进入交换机的内部交换逻辑交换机在从 Access 口向外发送帧时会先剥掉 VLAN Tag再发给终端设备。对于终端设备来说它根本感知不到 VLAN Tag 的存在这也是为什么 PC 端不需要做任何 VLAN 相关配置。Trunk 口连接交换机之间的“多 VLAN 通道”Trunk 端口用于交换机与交换机之间、交换机与路由器之间的链路目的是让多个 VLAN 的流量共享同一条物理链路传输。Trunk 口默认情况下是可以放行多个 VLAN 的具体放行哪些 VLAN 由管理员手动指定。当一个带 Tag 的帧从交换机 A 的 Trunk 口发出时它会原样保留 Tag交换机 B 的 Trunk 口收到这个帧后会检查帧中的 VLAN ID 是否是本端口允许通过的 VLAN。如果允许就接收并进入内部交换逻辑如果不允许就丢弃。2.3 缺省 VLANPVID到底是什么意思PVIDPort-base VLAN ID端口缺省 VLAN ID是另一个极易混淆的概念。简单来说PVID 是端口在“收到无标签帧”或者“需要发送无标签帧”时使用的 VLAN ID。以华为交换机为例Access 端口的 PVID 就等于它的缺省 VLAN也就是port default vlan指定的值Trunk 端口的 PVID 默认是 VLAN 1这也是华为、思科等厂商的默认设置。因此在实际工程中如果一个 Trunk 口上没有显式修改 PVID那么所有不带 Tag 的帧比如来自默认 VLAN 1 的流量在这个端口上都会被当作 VLAN 1 来处理。很多做华为交换机的朋友会看到这条配置port trunk pvid vlan 10这行的意思就是将这个 Trunk 口的缺省 VLAN 从默认的 1 改成 10。它带来的实际效果有两点从该 Trunk 口收到的无标签帧会被打上 VLAN 10 的标签进入交换机。当交换机需要把 VLAN 10 的帧从该 Trunk 口发出时会先剥掉 VLAN 标签再以无标签形式发送给对端。“Trunk 口上既允许 VLAN 10 通过又把 PVID 设置成 VLAN 10”——这在某些场景下是为了兼容不支持 VLAN 标签的老旧设备或对端配置不当的交换机。但在大多数常规交换机互联场景中我们应该尽量让两端 Trunk 口保持默认的 PVIDVLAN 1或者确保两端对同一帧的处理方式完全一致否则很容易出现“两边配置看着都对但业务就是不通”的奇怪问题。3. 实验环境与拓扑规划为了把原理落到实际操作上这里用模拟器环境来搭建一套最典型的交换机互联拓扑。你可以使用华为 eNSP、思科 Packet Tracer 或 GNS3只要支持 VLAN 和 Trunk 配置即可。以下配置以华为交换机命令风格为例版本不同命令细节可能会有差异但核心逻辑一致。3.1 拓扑说明规划两台交换机 SW1 和 SW2SW1 下联 PC1属于 VLAN 10和 PC2属于 VLAN 20。SW2 下联 PC3属于 VLAN 10和 PC4属于 VLAN 20。SW1 与 SW2 之间使用一条物理链路互连配置为 Trunk 口放行 VLAN 10 和 VLAN 20。这样设计的好处是可以用最小的设备量同时验证两个场景PC1 和 PC3 属于同一个 VLAN 10它们之间的通信是“同 VLAN 跨交换机二层通信”。PC1 和 PC2 分属不同 VLAN它们之间的通信必须经过三层转发。3.2 IP 地址规划设备VLANIP 地址网关PC1VLAN 10192.168.10.10/24192.168.10.1PC2VLAN 20192.168.20.10/24192.168.20.1PC3VLAN 10192.168.10.20/24192.168.10.1PC4VLAN 20192.168.20.20/24192.168.20.1如果使用三层交换机作为网关那么 SW1 上会创建 VLANIF 10 和 VLANIF 20 两个三层接口IP 分别是 192.168.10.1 和 192.168.20.1。4. 同 VLAN 跨交换机通信配置实战先做最简单的场景让 PC1 和 PC3 这两个处于同一 VLAN、但连接在不同交换机上的终端能够互相 ping 通。4.1 在 SW1 上创建 VLAN 并配置接口进入系统视图批量创建 VLANsystem-view vlan batch 10 20把连接 PC1 的接口加入 VLAN 10。假设 PC1 接在 SW1 的 GigabitEthernet0/0/1 口interface GigabitEthernet0/0/1 port link-type access port default vlan 10把连接 PC2 的接口加入 VLAN 20假设 PC2 接在 SW1 的 GigabitEthernet0/0/2 口interface GigabitEthernet0/0/2 port link-type access port default vlan 204.2 配置 SW1 与 SW2 之间的 Trunk 口假设 SW1 与 SW2 互连使用 GigabitEthernet0/0/3 口interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 20这条配置的意思是把互连端口设置为 Trunk 模式并且只允许 VLAN 10 和 VLAN 20 的帧通过。这里强烈建议不要图省事写成port trunk allow-pass vlan all因为这意味着包括 VLAN 1 在内的所有 VLAN 都会通过该链路既有安全风险也容易造成不必要的广播扩散。4.3 在 SW2 上重复相同配置SW2 上的配置逻辑完全一样。创建 VLAN、把 PC3 加入 VLAN 10、把 PC4 加入 VLAN 20并把互连口配成 Trunk 口。system-view vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 interface GigabitEthernet0/0/2 port link-type access port default vlan 20 interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 204.4 验证命令详解配置完成后先来检查 VLAN 与端口状态。在 SW1 上执行display vlan可以看到 VLAN 10 和 VLAN 20 的状态是 up并且对应的端口已经正确加入。如果想查看某个端口的详细 VLAN 属性可以执行display port vlan这条命令可以同时看到端口的链路类型、PVID、允许通过的 VLAN ID 列表是排查 Trunk 配置问题的第一利器。再来看 MAC 地址表display mac-address当 PC1 ping PC3 成功后SW1 的 MAC 地址表里会出现 PC1、PC3 的 MAC 地址其中 PC3 的 MAC 地址对应的出接口应该是 GigabitEthernet0/0/3并且 VLAN 是 10说明交换机已经学习到了对端交换机的 MAC 信息并且这个信息是通过 Trunk 口学习到的。4.5 数据帧流转过程分析PC1 ping PC3 的时候整个流程是这样的PC1 发出一个普通以太网帧目的 MAC 是 PC3 的 MAC 地址。这个帧到达 SW1 的 GigabitEthernet0/0/1 后SW1 发现该端口是 Access 口且属于 VLAN 10于是给帧打上 VLAN 10 的 Tag进入内部交换逻辑。SW1 查询 VLAN 10 的 MAC 地址表发现 PC3 的 MAC 要从 GigabitEthernet0/0/3 出去于是将带 Tag 的帧从 Trunk 口原样发送给 SW2。SW2 从 Trunk 口收到帧检查 VLAN Tag 为 10且该端口允许 VLAN 10 通过于是接收下来。SW2 查询 VLAN 10 的 MAC 地址表发现 PC3 在 GigabitEthernet0/0/1 口后面于是把帧从 Access 口转发出去在出 Access 口前剥掉 VLAN Tag。最终 PC3 收到的是一个没有任何 VLAN 信息的普通帧。这就是“交换机之间的通信带 VLAN 的情况”最基本的帧格式变化过程。整个过程中只有交换机与交换机之间的链路上帧是带着 VLAN Tag 的终端设备与交换机之间的链路上帧永远是普通的无标签帧。5. 不同 VLAN 之间的通信三层交换与 VLANIF 接口前面说过VLAN 之间默认是不能互相通信的。PC1 属于 VLAN 10PC2 属于 VLAN 20两台设备即便在同一台交换机上它们之间的帧也不会直接二层转发因为它们处于两个不同的广播域中。要实现 VLAN 间通信必须有三层设备参与转发。在企业网络中最常见的方式是使用三层交换机通过 VLANIF 接口也叫 SVISwitch Virtual Interface交换机虚拟接口来充当各 VLAN 的网关。5.1 VLANIF 接口的原理VLANIF 是一个三层逻辑接口它依托于某个 VLAN 而存在。只要这个 VLAN 里有物理端口是 up 的VLANIF 接口就会保持 up 状态。VLANIF 接口的 IP 地址就是该 VLAN 内所有终端的网关地址。当 PC1 要访问 PC2 时PC1 发现目的 IP 192.168.20.10 和自己不在同一个网段于是会把数据包发送给网关也就是 192.168.10.1。这个网关地址就是 SW1 上 VLANIF 10 的 IP。SW1 收到数据包后发现目的 IP 是 VLAN 20 网段于是查询路由表发现 192.168.20.0/24 网段对应 VLANIF 20于是把数据包从 VLAN 20 的交换逻辑转发出去源 MAC 变成 VLANIF 20 的 MAC 地址最终从 Access 口到达 PC2。所以配置 VLAN 间通信只需要做两件事在三层交换机上创建各 VLAN 的 VLANIF 接口并配置 IP。把各 VLAN 内 PC 的网关指到对应的 VLANIF IP 上。5.2 在 SW1 上配置 VLANIF 接口在上一节的配置基础上进入 SW1 系统视图创建 VLANIF 接口并配置 IPinterface Vlanif10 ip address 192.168.10.1 255.255.255.0 interface Vlanif20 ip address 192.168.20.1 255.255.255.0如果你用的是三层交换机这两条配置做完后PC1 和 PC2 之间就可以通信了。这里有一个前提PC1 和 PC2 的网关必须分别设置为 192.168.10.1 和 192.168.20.1并且都在 SW1 上。这里要提醒一下如果 VLAN 的网关是在 SW1 上那么就算 PC2 不在 SW1 上而是在 SW2 上只要 SW1 和 SW2 之间的 Trunk 口允许 VLAN 20 通过流量同样能在三层交换机 SW1 上完成跨 VLAN 转发。这也是为什么之前要把 SW1 配置成“集中式网关”的原因——所有 VLAN 的网关都放在同一台三层交换机上管理起来非常直观。5.3 对比路由器单臂路由与三层交换在一些老旧网络或小型实验环境中可能会看到用路由器来实现 VLAN 间通信也就是“单臂路由”。单臂路由的原理是路由器的一个物理接口连接到交换机的 Trunk 口然后在路由器物理接口上划分子接口每个子接口对应一个 VLAN 并配置 IP 地址同时还要在子接口上启用 802.1Q 封装。单臂路由的缺点是带宽瓶颈明显所有跨 VLAN 流量都要经过一条物理链路而且配置复杂度高。三层交换机在硬件层面完成转发性能和可靠性都更好所以现在企业网络中几乎都是三层交换机 VLANIF 方案的天下。6. 华为交换机常用验证与维护命令在实际工程中不可能每次配置完都用 PC 去 ping 来验证。你需要熟练使用交换机自带的查看命令快速定位问题。下面这些命令是日常使用频率最高的。6.1 查看 VLAN 信息display vlan输出会列出所有 VLAN 的 ID、状态、描述信息以及包含的端口。如果某个 VLAN 下没有端口状态会显示 down这也是排查“接口加入 VLAN 不见效”的一个常用入口。6.2 查看端口 VLAN 属性display port vlan这是排查 Trunk 问题时最常用的命令。你能看到每个端口的链路类型access/trunk/hybrid、PVID、以及允许通过的 VLAN 列表。6.3 查看接口状态display interface GigabitEthernet0/0/3如果物理层 down查 VLAN 配置没有意义。先确认网线、光模块和对端设备状态再继续排查二层配置。6.4 查看 MAC 地址表display mac-address当同一个 VLAN 的跨交换机通信不正常时查看 MAC 地址表能帮你判断数据帧是否真的到达了某台交换机。例如 PC1 ping PC3 不通在 SW1 上执行display mac-address时如果看不到 PC3 的 MAC说明 SW1 根本没有从 Trunk 口学习到 PC3 的信息问题大概率出在 Trunk 链路或 VLAN 放行配置上。6.5 查看三层接口与路由表display ip interface brief display ip routing-table排查 VLAN 间通信问题时这两条命令可以确认 VLANIF 接口是否 up、IP 是否配置正确、路由表里是否有对应的直连路由。7. 常见问题与排查思路交换机互联带 VLAN 的场景里最常遇到的问题几乎都集中在 Trunk 配置不一致、PVID 理解错误、终端网关配置错误这几个方面。下面整理一份高频问题排查表。问题现象常见原因解决思路同 VLAN 跨交换机 ping 不通互连端口不是 Trunk 口或 Trunk 口未放行对应 VLAN确认两端互连口都是 trunk使用display port vlan检查 allowed vlan一端是 Access、一端是 Trunk流量不通链路模式不匹配Access 口丢弃带 Tag 的帧将两端互连口统一配置为 Trunk 口且放行相同的 VLAN 列表Trunk 两边放行的 VLAN 列表不一致一边放行 VLAN 10、20另一边只放行 VLAN 10统一放行 VLAN 列表必要时执行port trunk allow-pass vlan 10 20补齐PVID 不一致导致无标签帧被识别成不同 VLAN一端 Trunk 口 PVID 为 VLAN 10另一端为 VLAN 1检查display port vlan确认两端 PVID 一致或明确知道无标签帧该归入哪个 VLANPC 能 ping 通同网段但 ping 不通网关PC 的网关地址填错或 VLANIF 接口未配置/状态 down检查 PC 的 IP 配置执行display ip interface brief确认 VLANIF 状态VLAN 间 ping 不通交换机是二层交换机没有 VLANIF 接口或网关所在交换机有误确认三层交换机上创建了对应 VLANIF并且所有 VLAN 的网关都在同一台三层设备上配置了port trunk allow-pass vlan all安全性差放行范围过大增加广播域和安全风险改为只放行业务所需 VLAN遵循最小化放行原则更换交换机后 VLAN 配置丢失未保存配置配置完成后执行save华为交换机提示后输入 y 确认这里特别想再说一下“Trunk 口 PVID 改成 10”这个操作。很多初学者从网上看到有人配port trunk pvid vlan 10觉得这是 Trunk 口的必需配置于是在所有交换机互联口上都配上结果反而把整个网络搞乱了。正常情况下Trunk 口收到带标签的帧并不关心 PVID只有收到无标签帧时才拿 PVID 作为其 VLAN 归属。因此除非有兼容旧设备等特殊需求建议保持 Trunk 口的 PVID 为默认的 VLAN 1或者明确设计好每一条链路的无标签帧归入哪个 VLAN。8. 最佳实践与工程建议8.1 明确 VLAN 规划而不是随手建 VLANVLAN ID 不是拍脑袋分配的。建议企业网络内部形成一套统一的 VLAN 编号规范例如VLAN ID用途网关网段VLAN 10办公终端192.168.10.0/24VLAN 20业务服务器192.168.20.0/24VLAN 30无线网络192.168.30.0/24VLAN 100网络设备管理192.168.100.0/24把管理 VLAN 和业务 VLAN 分开是安全运维的基础。交换机、路由器等网络设备的管理 IP 不要放在业务 VLAN 里避免终端用户直接触达设备管理面。8.2 Trunk 口放行最小化配置 Trunk 口时永远遵循“只放行必需的 VLAN”的原则。不要用port trunk allow-pass vlan all这种全放行配置。每多放行一个 VLAN就意味着该 VLAN 的广播报文、未知单播报文都可能跨交换机传播既浪费带宽也扩大了故障面。在割接或变更时应该先查看原有的 allowed vlan 列表再决定是新增还是替换。8.3 两端配置保持一致交换机之间的 Trunk 链路两端必须保证链路类型匹配、放行 VLAN 列表一致、PVID 策略一致。很多“时通时不通”的诡异问题最后查下来基本都是两端配置不对称导致的。强烈建议在配置完成后在两台交换机上分别执行display port vlan逐端口对比输出结果。8.4 开启并维护 STP 等环路保护机制交换机互联很容易出现物理环路。默认情况下 STP生成树协议是开启的但如果没有正确规划根桥和优先级可能会导致次优路径或收敛速度慢。建议在核心层交换机上设置较低的 STP 优先级让它成为根桥接入层交换机保持默认即可。同时可以根据需要开启 BPDU 保护、环路检测等功能防止误接线导致的广播风暴。8.5 配置完成后及时保存模拟器里不保存配置重启后一切清零问题不大。但在真实设备上配置完不保存等于白干。华为交换机使用save命令保存配置思科交换机使用copy running-config startup-config。建议养成“每完成一个阶段的变更就保存一次”的习惯这样即使设备异常重启也能快速恢复。8.6 变更前备份、变更后验证涉及到 Trunk 口、VLAN 放行范围的变更属于网络核心配置变更。建议遵循以下流程变更前执行display current-configuration备份当前配置。变更后立即验证关键业务链路的连通性包括同 VLAN 通信、跨 VLAN 通信、网关连通性。如果是对端设备不在控制范围内务必先明确对端 Trunk 口放行范围和 PVID 策略再做修改。9. 进阶方向从二层互联走向大规模网络“交换机之间的通信带 VLAN”是网络运维中最基础、最核心的一环。把这套逻辑吃透之后再往上看很多技术就顺理成章了。例如 DHCP 服务器需要知道客户端属于哪个 VLAN才能分配对应网段的 IP这就离不开 DHCP RelayDHCP 中继和 VLANIF 的配合再比如 VXLAN 技术本质上是在三层网络上建立一个类似 VLAN 的二层隧道解决大规模数据中心里 VLAN 数量不足4094 个上限和跨地域二层互通的问题理解了 802.1Q 标签之后理解 VXLAN 的 VNIVXLAN Network Identifier会轻松很多。对于从事网络运维的朋友下一步可以重点学习三层路由协议静态路由、OSPF、DHCP 中继、链路聚合Eth-Trunk和交换机堆叠。这些技术和 VLAN 配合使用时才能真正构建出一套稳定、可靠、可扩展的企业网络。