1. trunk这个概念到底解决什么问题为什么不能全靠access口1.1 一个容易遇到的场景多部门VLAN跨交换机先讲一个我早年间被问得最多的问题。某公司办公区有两台交换机一楼一台二楼一台财务部、技术部、行政部分别划分了VLAN 10、20、30。一开始只是单台交换机划分VLAN各端口按部门打上access口互不干扰看着很清爽。后来二楼加了工位技术部的工位要从一楼交换机拉线到二楼交换机问题就来了——二楼交换机上也得分一个VLAN 20的access口给技术部可两台交换机之间怎么让VLAN 20“过去”新手惯用的做法是把两台交换机中间的两个端口都设成access且划到同一个VLAN里。这样技术部确实通了但财务部、行政部VLAN想跨交换机就完全没戏。要么再拉一根线专门给财务部再拉一根线给行政部。部门一多交换机之间就得拉七八根线交换机端口不够用桥架也塞满了维护时一堆线缆谁也分不清哪根是哪根。trunk中继链路解决的就是这个问题用一根物理链路承载多个VLAN的流量。它不像access口那样“只属于某一个VLAN”而是像一条多车道公路上面跑着不同VLAN的数据帧每个帧都带一个“车牌”——也就是VLAN标签。这样无论多少VLAN跨交换机一条链路就够了。1.2 802.1Q打标签的底层原理帧里加了什么要让一条链路承载多个VLAN必须解决一个核心问题交换机收到一个数据帧时怎么知道它属于哪个VLAN如果走access口端口自己就是“准入证”交换机从哪个access口收进来就默认属于那个VLAN不需要额外标识。但trunk口要同时接收多个VLAN就必须在数据帧里显式写上“我是VLAN几”。这就是IEEE 802.1Q干的事——在以太网帧的源MAC地址和Type字段之间插入一个4字节的Tag。这4字节拆开看很有讲究。前2字节是TPIDTag Protocol Identifier固定值0x8100表示“这个帧带了VLAN标签”后2字节里前3位是PCPPriority Code Point用于QoS优先级中间1位是CFI/DEI通常置0最后12位是VIDVLAN ID取值范围0到4095实际可用的是1到4094。VLAN号不是拍脑袋随便起的0和4095保留所以配置时可用的VLAN范围从VLAN 1开始。从整体网络闭环来看trunk链路上的帧分为两类带Tag的帧以及不带Tag的帧。带Tag的帧是“有牌照”的到达对端交换机会被识别出来属于哪个VLAN不带Tag的帧则会被对端按端口的native VLAN处理这个话题后面讲native VLAN时再说。1.3 为什么感觉trunk“慢”链路开销其实只有一点点有些同事配置完trunk后习惯性地担心“每个帧都多带4字节带宽会不会被吃掉很多”。我算过一次账。以太网最小帧是64字节最大帧是1518字节802.1Q带上Tag后最大变成1522字节。千兆以太网本身就考虑了这一点物理层编码是8B/10B或者更现代的64B/66BMTU通常默认1500字节而交换芯片在转发时会按1522字节处理。也就是说vlan Trunk的4字节开销在满速运行时占比不到0.3%你拿iPerf测千兆链路最多看到930Mbps和925Mbps的区别肉眼根本感知不到。真正让trunk变慢的另有原因——配置错误后的广播风暴和环路而不是那4字节。这是我做了多年网络运维之后最深的感受trunk本身不是瓶颈配置它的人才是。2. trunk链路的典型应用场景与配置落地交换机、路由器、防火墙各怎么接2.1 交换机到交换机让VLAN跨设备跑起来最常见的trunk场景就是两台交换机互联。配置步骤在主流厂商的命令行里大同小异逻辑上就三步先创建VLAN再把互联端口改成trunk模式最后放行对应VLAN。以某厂商A的命令行为例system-view vlan batch 10 20 30 interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 30以某厂商H的命令行为例configure terminal interface GigabitEthernet0/1 switchport mode trunk switchport trunk allowed vlan add 10,20,30注意一个极容易踩的坑很多厂商的trunk口默认只放行VLAN 1。如果你只改了端口模式为trunk没有执行“允许VLAN 10、20、30通过”的命令那对端交换机上即便配了VLAN 10的access口两边也完全不通。这种问题排查起来特别隐蔽因为端口状态看起来是up的物理链路也正常但VLAN流量就是过不去。2.2 交换机到路由器单臂路由与子接口跨VLAN通信需要三层转发典型做法是“单臂路由”Router-on-a-Stick。交换机上把接路由器的口配置成trunk路由器上把一个物理口拆成多个子接口每个子接口对应一个VLAN的网关。路由器子接口的配置逻辑interface GigabitEthernet0/0.10 encapsulation dot1Q 10 ip address 192.168.10.254 255.255.255.0 interface GigabitEthernet0/0.20 encapsulation dot1Q 20 ip address 192.168.20.254 255.255.255.0这里的encapsulation dot1Q就是告诉路由器子接口“去匹配带VLAN 10标签的帧”。从交换机trunk口过来一个带Tag的帧路由器看到Tag是10就丢给子接口G0/0.10处理网关IP是这个子接口的IP于是VLAN 10的主机把默认网关指到192.168.10.254就能出网了。这个场景里经常有人把子接口的IP配错或者忘了加encapsulation dot1Q导致VLAN标签到路由器后成了“无标签帧”被丢进native VLAN对应的子接口表现出来就是跨VLANping不通但同VLAN全通。排查时看一眼show interfaces里每个子接口收发包计数基本能看出来。2.3 交换机到防火墙trunk化接入还是分开接入防火墙场景比较特殊。很多防火墙默认只支持一个物理口绑定一个VLAN如果你想把多个VLAN的流量都引到防火墙做安全策略要么多拉几根线接防火墙多个物理口要么让防火墙支持VLAN子接口。支持VLAN子接口的防火墙配置思路类似路由器物理口改成trunk然后创建VLAN子接口每个子接口一个网段、一个安全区域。以常见的厂商配置风格为例interface GigabitEthernet1/0/1 switchport mode trunk switchport trunk allowed vlan add 10,20然后在防火墙逻辑接口里建立VLAN 10和VLAN 20的子接口分别划分到不同安全区域策略里放行对应网段互访。这里有个经验防火墙做trunk子接口时必须关闭该物理口的自动协商或者明确指定速率双工因为部分防火墙物理口与交换机对接时协商不一致会把trunk口搞成down或者err-disable。我遇到过整整一上午排查发现只是双工不匹配的案例。2.4 动态协商与手工静态trunk怎么选802.1Q是标准协议但不等于两端都配了trunk就万事大吉。端口上还有一个动态协商机制不同厂商叫法不同某厂商H叫DTPDynamic Trunking Protocol某厂商A叫LNPLink-type Negotiation Protocol。接口上配置成“动态 desirable”或者“动态 auto”两端会协商是否成为trunk。我的建议生产环境一律用手工静态trunk。动态协商最大的问题在于不可控——一根网线不小心接到非预期设备上或者某台交换机的默认配置被改过口就自动变成了trunk口VLAN全部透传过去轻则二层环路重则把整个广播域打通。手工指定port link-type trunk之后端口行为完全由你控制不存在“协商出意外”的窗口。顺便提一下链路聚合和trunk的关系。很多工程师会把这两个概念搞混trunk是“承载多个VLAN的链路”链路聚合Link Aggregation是“把多条物理链路捆成一条逻辑链路”。两者可以叠加使用——先做链路聚合再在聚合口上配置trunk既增加带宽又承载多VLAN。配置顺序一般是先建Eth-Trunk/Bond口把物理口加进去然后在聚合口上配trunk和放行VLAN。3. 中继链路上的故障排查链路从“VLAN不通”到“全网瘫痪”的完整追查3.1 场景一有的VLAN通有的VLAN不通这是trunk排障里最常见的现象。症状是VLAN 10全网互访正常VLAN 20只有同一台交换机上通跨交换机就不通。物理链路、端口状态都是up看起来一切都好。第一反应别去拔线重启先看trunk口的放行列表。命令一般长这样display interface GigabitEthernet0/0/1 trunk查看输出里的“Allowed VLAN”列表里有没有VLAN 20。如果只有VLAN 1和VLAN 10那问题很清楚创建VLAN 20时只在一台交换机上建了另外一台交换机上没有或者放行命令漏配。还有一种隐蔽情况两台交换机上都配置了VLAN 20trunk也放行了但还是不通。这时候要去查生成树STP。部分厂商的生成树默认会阻塞某些VLAN在特定端口上的转发特别是配置了PVSTPer-VLAN Spanning Tree的环境。我看过有人在trunk口上手工改了STP优先级或者端口开销结果特定VLAN被阻塞其他VLAN正常。排查方法是查看生成树拓扑里该VLAN在对应端口上的状态确认是Forwarding而不是Blocking。3.2 场景二接上trunk线后全网广播风暴另一个经典事故两台交换机之间拉了一根线配了trunk然后整个办公网越来越慢交换机指示灯疯狂闪烁最后全网瘫痪。这是典型的二层环路。原因是两台交换机之间有不止一条物理路径而trunk允许所有VLAN流量通过这两条路径之间就形成了物理环路。广播帧、未知单播帧会沿着环路无限转发交换机CPU被大量占用最终风暴吞掉所有带宽。这里的关键认知是VLAN和环路是两码事。即使你只放行了一个VLAN只要物理拓扑有环这个VLAN里就会产生广播风暴。生成树协议STP/RSTP/MSTP就是为了解决环路而存在的。默认情况下主流交换机STP都是开启的按理说能自动阻塞冗余端口。但为什么还能看到风暴我复盘过几次大多是这两种情况一有人图省事把STP全局关闭了二接了不支持STP的傻瓜交换机BPDU处理异常生成树算不出正确拓扑。处理办法不复杂先把其中一根线拔掉恢复网络然后检查STP状态不让STP瞎搞。更稳的做法是在物理拓扑上做设计——trunk链路尽量保持冗余路径可控配合STP快速收敛别把所有口都塞进一个广播域还指望设备自动免疫。3.3 场景三trunk口变成err-disable/error-down现象是端口物理up但协议down接口显示为err-disable或者error-down任何流量都不走。这类问题在接入层交换机和服务器网卡对接时格外多。根因通常是端口安全Port Security、BPDU Guard、环路保护或闪电击坏网卡导致的反复翻转。举例说明你在接入交换机上开了BPDU Guard某台终端设备比如带管理功能的打印机或傻瓜交换机私自发出了BPDU端口立刻被err-disable。这其实是安全机制在保护网络不算误伤但如果不加分析就手动shutdown再no shutdown恢复端口过一会儿又会掉。正确的排除动作是先查看日志确认err-disable的原因代码。不同厂商的提示字段不同但关键词就那么几个bpduguard、port-security violation、loopback、link-flap。找到触发源再决定怎么处理——不该接的设备拔掉该接但确实合法的情况就调整端口策略。3.4 排障时我固定的检查顺序踩过足够多坑以后我自己总结了一个固定的trunk排障顺序分享给大家参考物理层display interface看端口状态、速率、双工这是所有二层问题的地基协议层确认两端都是trunk模式且允许的VLAN列表一致VLAN存在性两端是否都有对应的VLANVLAN编号是否有笔误比如把VLAN 20写成VLAN 200STP状态该VLAN在trunk端口上是否处于转发状态三层网关涉及跨VLAN互访时检查路由器/三层交换机的VLAN接口配置以及VLAN间路由策略。按这个顺序走90%的trunk问题都能定位。4. 容易被忽略的trunk细节native VLAN、修剪与安全加固4.1 native VLAN不匹配一个“看不见”的坑trunk口上有一个叫native VLAN的属性。它的作用是为“不带标签的帧”提供一个归属VLAN。默认情况下几乎所有厂商的trunk口native VLAN都是VLAN 1。场景还原交换机A的trunk口native VLAN是VLAN 1交换机B的trunk口native VLAN改成VLAN 10。当A的VLAN 1发出一个不带Tag的帧B收到后一看“没标签”按自己的native VLAN处理归属为VLAN 10。于是VLAN 1的流量跑到了VLAN 10的广播域里。更麻烦的是VLAN 10的流量在A侧发过来时是带Tag的B收到后如果对它做Tag处理发现Tag是10但native VLAN也是10一些厂商会要求native VLAN的帧必须不带Tag于是出现奇怪的丢包现象。这种问题的隐蔽点在于很多监控工具只统计带Tag的帧不带Tag的native帧哪去了根本看不见。我建议生产环境里把native VLAN统一改成一个不用的VLAN比如VLAN 4094或者一个专门的“管理以外”VLAN并把两端设成一致。虽然VLAN 1是全球默认但正因为它是默认的最容易成为攻击和误操作的入口。4.2 VLAN修剪Pruning防止无意义的广播扩散trunk允许多个VLAN通过不代表每个trunk都需要放行所有VLAN。如果一个VLAN只在部分交换机上有端口就没必要让它在所有trunk上广播。VLAN修剪VLAN Pruning就是说这件事。举个例子三台交换机级联VLAN 30只在第三台交换机上有access口那第一台和第二台之间的trunk就完全没必要放行VLAN 30。默认放行所有VLAN虽然配起来省事但每一次VLAN 30里的广播帧都要经过第一台和第二台交换机的链路白白浪费带宽也扩大了广播域。手工修剪就是前面讲到的allow-pass vlan命令里只列需要的VLAN。有些厂商还支持VTP Pruning这类自动修剪机制但我个人更倾向手工静态修剪——自动机制一旦交换机版本不一致很容易在修剪的信息同步上出岔子排查成本比手工修剪高得多。4.3 从安全角度看trunkVLAN跳跃与DTP攻击网络安全里有一类针对二层交换的攻击叫VLAN跳跃VLAN Hopping。攻击者利用trunk的协商机制伪装成交换机向接入端口发送DTP协商报文诱使接入端口变成trunk口然后攻击者就能访问所有允许通过的VLAN。防御措施其实很朴素所有面向终端的接入端口显式指定为access模式并且关闭DTP协商。不同厂商命令不同但思路一致——让端口“只做access不接受任何trunk协商”。同时在接入层开启BPDU Guard任何接入端口收到BPDU直接err-disable防止有人私接设备模拟交换机行为。另外还要提防“双标签攻击”Double Tagging。攻击者构造一个带双层802.1Q标签的帧外层Tag是native VLAN内层才是真正的目标VLAN利用交换机处理native帧时剥离标签的逻辑把流量注入到其他VLAN。应对办法就是把native VLAN改成一个各交换机统一、且不承载业务流量的保留VLAN再配合接入认证基本能挡住这种低成本的攻击手法。我把一些常用的trunk安全配置总结成了对照表加固项access口配置思路trunk口配置思路端口模式显式port link-type access显式port link-type trunkVLAN放行指定一个access VLAN只放行业务需要的VLANDTP协商关闭协商关闭协商BPDU Guard接入口开启不建议在trunk口开启native VLAN无概念改为专用保留VLAN端口安全可开启MAC数量限制一般不开避免误杀4.4 关于MTU与巨型帧一个经常被忽视的配合项trunk链路承载多VLAN时如果服务器或存储设备开启了巨型帧Jumbo Frame通常MTU为9000交换机对应端口、trunk链路两端的端口以及三层接口的MTU都必须统一调整。有一个真实案例某存储系统的NFS流量走trunk链路传输大文件时断断续续丢包30%查了一个晚上最后发现存储端口配置了MTU 9000交换机的access口也配了9000但两台交换机之间的trunk口MTU还是1500。数据帧超过1500后被丢弃大文件传输自然频繁重传。所以配置trunk时如果网络中任何一端有巨型帧需求记得把trunk两端的MTU一起调。很多厂商的物理口MTU默认值并不一致调成一致后还要记得保存配置否则重启设备后又回到默认值排障时极易被误导。5. 写在最后trunk是网络的“交通干道”设计比配置更重要Trunk本身不是高深技术协议标准、命令参数都写得明明白白。但实际项目中我见过太多并非不懂trunk、却依然把网络搞崩的案例问题往往出在设计层面而不是配置层面。链路冗余必然引入环路引入环路就必须配套生成树多VLAN透传就必须考虑修剪不修剪就要忍受广播扩散端口协商方便但也可能被恶意利用所以业务端口要显式锁定。你用trunk承载的不仅是几个VLAN的数据帧还有整个二层网络的稳定性和安全性。根据我个人的运维经验来看刚接手一张新网络时先把所有trunk口的放行列表、native VLAN、STP状态拉一遍能发现不少“历史遗留问题”。配好trunk只是一分钟的事想清楚为什么这样配、可能出现什么问题才是真正决定一张网络能否长治久安的关键。做网络这行能稳住生产环境的从来不是炫技而是把每个基础环节都想透。
阅读完成 · 觉得有帮助?