首页 / 资讯中心 / 文章详情

单臂路由配置与排障:802.1Q子接口实现VLAN间通信

单臂路由配置与排障:802.1Q子接口实现VLAN间通信 ★ FEATURED ARTICLE
两个部门分在不同 VLAN各自内部通信正常但要互相访问就得跨网段。手头只有一台路由器物理接口还被上行链路占着这种情况在实际项目里太常见了。单臂路由Router-on-a-Stick就是为这类场景准备的方案一根网线、一个物理接口靠子接口和 802.1Q 封装把多个 VLAN 的三层网关全扛下来。它不是什么高级技术但配置细节相当琐碎参数写错一个字母表现就是“一半通一半不通”。下面我按自己实际搭环境的顺序把原理、配置、验证和踩坑链路完整捋一遍无论你是刚接触 VLAN 间路由的新手还是需要快速复现一套测试环境的老手都能照着做下来。1. 一个物理口撑起多个网段单臂路由要解决的真实困境1.1 VLAN 隔离带来的“看得见摸不着”VLAN 的本质是把一台交换机在逻辑上切成多台独立的交换机。划分完之后同一个 VLAN 内的主机在二层可以直接互通跨 VLAN 的帧在交换机上根本不会被转发出去因为交换机的转发表是按 VLAN 隔离的。这样做的好处很直接广播域被压缩了一个部门的广播风暴不会淹到另一个部门安全性也上来了财务网段和访客网段彼此看不到。但业务需求不会停在“隔离”这一步。隔离是手段不是目的。真实情况是研发要访问测试环境的数据库办公网要访问打印机监控网段的探头要把数据推给管理平台的服务器。这些访问关系天然是跨网段的而跨网段就意味着需要三层设备介入做一次“拆帧—查路由—重新封装”的动作。很多人第一次碰到这个问题时第一反应是“那我在交换机上再拉一根线到路由器”。这个思路没错但每加一个 VLAN 就要多占一个路由器物理接口多拉一根线。一台常见的中端路由器千兆口也就那么几个还要留给广域网出口、专线、冗余链路。VLAN 数量一多接口立刻不够用。单臂路由的价值就在这个位置上体现出来了用子接口把“接口数量”这件事从物理层面虚拟出来一个物理口可以挂几十个子接口每个对应一个 VLAN 的网关。1.2 为什么“单臂”这个叫法很形象把拓扑画出来就明白了。交换机在上路由器在下中间只有一根网线连着。路由器伸出去的就这么一条“胳膊”所有 VLAN 的流量都必须从这条链路挤过去进去的时候带着 VLAN 标签出来的时候换一个标签再回来。这就是“单臂”的来源也叫“独臂路由”。理解这个形象比喻很重要因为它直接决定了后面所有配置的逻辑基础。既然只有一个物理接口那路由器怎么知道进来的这个数据帧属于哪个 VLAN答案只能靠标签。802.1Q 协议在以太网帧的源 MAC 地址后面插入了 4 个字节其中 12 位是 VLAN ID这就是交换机告诉路由器“这个帧是哪个 VLAN 的”的唯一途径。所以单臂路由不是可选的“配个 IP 就行”它强制要求链路上跑带标签的帧也就是交换机那一侧必须是 trunk 口。我见过不少初学者在这里犯迷糊把交换机连路由器的口配成 access 口然后疑惑路由器子接口为什么不生效。原因很简单access 口出去的帧是不带标签的路由器子接口收不到标签就没法把帧归到对应的逻辑接口上自然也就无法处理。这是单臂路由的第一条硬性前提。1.3 它和三层交换机方案的本质区别现在三层交换机很普及很多新建项目直接上 SVISwitch Virtual Interface做 VLAN 间路由性能好、延迟低、不占额外设备。那单臂路由还有存在必要吗有而且不少。第一种情况是老网络改造。现网的接入交换机是纯二层设备核心也没有三层能力机房里正好有一台闲置的路由器那么单臂路由是成本最低的方案不用换硬件。第二种情况是需要在这条链路上做策略。路由器的优势在于功能丰富NAT、ACL、Zone-Based Firewall、流量整形、NetFlow 采集这些在路由器上配置起来比在交换机上成熟得多。如果 VLAN 间的访问需要细粒度控制把网关放在路由器上策略就集中在同一个设备里运维起来更直观。第三种是小规模场景。比如一个实验室、一个小办事处总共三五个 VLAN流量峰值也就几百兆完全在单臂链路的承载范围内没必要为此专门采购三层交换机。代价也很明确所有跨 VLAN 流量都挤在一根物理链路上这根链路既是上行也是下行带宽是共享的。这一点后面第 5 章会详细算。2. 剥开标签看转发802.1Q 与子接口的配合机制2.1 一个 ping 包在两个 VLAN 之间走了哪些路不把这条路径讲清楚配置的时候就是纯背命令出问题也不知道从哪查。我拿一个典型场景走一遍VLAN 10 里的一台主机 A192.168.10.10/24要 ping VLAN 20 里的主机 B192.168.20.20/24两台主机的网关分别指向路由器上对应的子接口地址。第一步A 判断目的地址 192.168.20.20 与自己不在同一网段拿掩码一与就知道于是决定把包发给网关。此时 A 的 ARP 表里可能还没有网关的 MAC它会在 VLAN 10 内发一个 ARP 请求问“谁是 192.168.10.1”。这个广播帧被交换机在 VLAN 10 内泛洪同时因为连路由器的口是 trunk 且允许 VLAN 10 通过帧被打上 VLAN 10 的标签送到路由器。第二步路由器收到带标签的帧根据标签值匹配到 VLAN 10 对应的子接口交给该子接口处理。子接口回应 ARP把自己的 MAC 告诉 A。注意这个 MAC 通常是物理接口的 MAC多个子接口共用同一个 MAC 是很常见的现象这也是为什么单臂路由环境下抓包时容易看到“同一个 MAC 出现在多个网段”。第三步A 把真正的 ICMP 包封装成以太帧目的 MAC 是网关 MAC从网卡发出。交换机查 MAC 表从 trunk 口转发出去打上 VLAN 10 标签。路由器收到剥掉标签看到目的 IP 是 192.168.20.20查路由表发现出接口是 VLAN 20 的子接口因为是直连网段于是重新封装源 MAC 换成 VLAN 20 子接口的 MAC目的 MAC 需要通过 ARP 获得 B 的 MAC如果 ARP 表里没有就先发 ARP 请求。第四步封装好的帧从同一个物理接口送出去打上 VLAN 20 的标签。交换机收到带 VLAN 20 标签的帧剥掉标签查 VLAN 20 的 MAC 表从对应 access 口转发给 B。B 收到后回包路径完全对称。这条链路里有两个关键点值得强调。一是每一次跨 VLAN 转发帧都要被完整地拆开重组一次MAC 头换了标签换了只有 IP 头基本不变TTL 减一。二是路由器进出用的是同一个物理接口这在传统路由概念里是“发夹弯”式转发某些平台会因此触发一些特殊的计数或策略行为排查时要有心理准备。2.2 子接口是纯逻辑产物但行为受物理接口约束子接口在配置层面看起来像独立接口能配 IP、能配 ACL、能跑路由协议但它在物理层没有实体。它依附于父接口父接口的状态直接决定子接口的生死。父接口 down所有子接口跟着 down父接口被 shutdown子接口就算配了 no shutdown 也是 down 状态。这里有个非常隐蔽的坑。有些平台的物理接口默认是 shutdown 的你把子接口配好、IP 配好、封装配好一切看起来都对就是不通。用show ip interface brief一看子接口是 up但父接口是 administratively down。这种情况我第一次遇到时排查了快半小时因为子接口显示 up 给了我错误的信心。实际上子接口的 up 只代表“逻辑上配置完整”不代表链路可用。所以配完第一件事就是确认物理接口的状态。另一个约束是同一个物理接口下的所有子接口共享物理带宽和队列资源。QoS 策略、带宽限制这些在子接口上是“逻辑上独立、物理上共享”的关系做流量规划时必须把这根链路的物理上限当作总预算来分配。2.3 回程路由为什么有时候单向能通这是单臂路由排查中出现频率极高的一类现象从 A 能 ping 通 B但 B ping 不通 A或者反过来。如果配置是标准的直连网段理论上不该出现这种不对称因为路由器对两个网段都是直连双向都有路由。真出现了通常是下面几种原因。一是主机的网关只配了一边。有些测试环境里A 配了网关B 没配或者 B 的网关配成了一个不存在的地址。B 回包时不知道往哪送只能尝试同网段 ARP自然失败。二是子接口的掩码写错。比如 VLAN 20 规划的是 /24子接口配成了 /28那么路由器认为 192.168.20.16 以后的地址都不在直连网段内回包时查不到路由就丢掉了。这种错误在show ip route里表现为直连网段的前缀长度不对非常容易看出来但前提是你想到去看。三是中间存在第二条路径。如果网络里还有另一台三层设备也配了同样的网段可能出现去程走路由器、回程走另一台设备的情况非对称路由会导致状态防火墙或 NAT 出问题。排查顺序我一般固定为先看两端主机的 IP、掩码、网关再看路由器子接口的 IP 和掩码再看路由表里的直连条目最后才怀疑 ARP 和 MAC 表。这个顺序是从“最容易被改错”到“最不容易出问题”排列的实际命中率很高。3. 从零搭一套最小实验环境3.1 拓扑与地址规划实验不用太复杂两台主机、一台二层交换机、一台路由器足够了。拓扑上交换机的一个口接路由器另外两个口分别接两台主机主机划入不同 VLAN。地址规划我习惯先用表格定下来再动手避免配到一半改主意导致前后不一致。设备接口角色IP 地址VLAN路由器G0/0物理口不配 IP无无路由器G0/0.10VLAN 10 网关192.168.10.1/2410路由器G0/0.20VLAN 20 网关192.168.20.1/2420交换机F0/1连路由器无trunk交换机F0/2连主机 A无access 10交换机F0/3连主机 B无access 20主机 A网卡测试终端192.168.10.10/24网关 .110主机 B网卡测试终端192.168.20.20/24网关 .120这个规划里有一个刻意的选择物理接口 G0/0 不配任何 IP。这是单臂路由的标准做法。如果给物理接口配了地址它本身也成了一个三层接口可能引入额外的直连网段和 ARP 行为干扰判断。保持它“纯二层通道”的身份逻辑最干净。3.2 交换机侧先把二层地基打牢交换机上的活儿其实就两件事建 VLAN划端口。顺序建议先建 VLAN 再划端口因为某些平台在端口上指定不存在的 VLAN 时行为不一致有的自动创建有的直接报错。Switch enable Switch# configure terminal Switch(config)# vlan 10 Switch(config-vlan)# name OFFICE Switch(config-vlan)# vlan 20 Switch(config-vlan)# name LAB Switch(config-vlan)# exit Switch(config)# interface FastEthernet0/2 Switch(config-if)# switchport mode access Switch(config-if)# switchport access vlan 10 Switch(config-if)# no shutdown Switch(config-if)# exit Switch(config)# interface FastEthernet0/3 Switch(config-if)# switchport mode access Switch(config-if)# switchport access vlan 20 Switch(config-if)# no shutdown Switch(config-if)# exit然后是连接路由器的那条链路。这里必须配成 trunk并且封装方式指定为 802.1Q。有些平台的二层交换机默认封装就是 dot1q不用显式写但写上更稳妥尤其是混用不同型号设备的时候。Switch(config)# interface FastEthernet0/1 Switch(config-if)# switchport trunk encapsulation dot1q Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk allowed vlan 10,20 Switch(config-if)# no shutdown Switch(config-if)# end Switch# write memoryallowed vlan这一行很关键。默认情况下 trunk 允许所有 VLAN 通过看起来省事但实际生产环境里我强烈建议显式列出需要的 VLAN。一是减少不必要的广播泛洪二是避免新加 VLAN 时意外暴露到不该暴露的链路上三是排查时一眼就能看出这条 trunk 到底承载了什么。配置完成后用show interfaces trunk确认端口模式、封装类型、允许 VLAN 列表三项都对。3.3 路由器侧子接口 dot1Q 封装路由器这边的顺序我习惯是先确保物理口 up再建子接口先配封装再配 IP。封装命令必须以encapsulation dot1Q开头后面跟 VLAN ID这个 ID 必须和交换机上的 VLAN 号严格一致多一位少一位都不行。Router enable Router# configure terminal Router(config)# interface GigabitEthernet0/0 Router(config-if)# no shutdown Router(config-if)# exit Router(config)# interface GigabitEthernet0/0.10 Router(config-subif)# encapsulation dot1Q 10 Router(config-subif)# ip address 192.168.10.1 255.255.255.0 Router(config-subif)# no shutdown Router(config-subif)# exit Router(config)# interface GigabitEthernet0/0.20 Router(config-subif)# encapsulation dot1Q 20 Router(config-subif)# ip address 192.168.20.1 255.255.255.0 Router(config-subif)# no shutdown Router(config-subif)# exit子接口编号.10和.20里的数字只是接口标识和 VLAN ID 没有强制关系。理论上可以写成.1对应 VLAN 10、.2对应 VLAN 20。但我在实际项目里坚持让子接口编号和 VLAN ID 对齐好处是半年后回来看配置不用再对照表show run一眼就能读出对应关系交接时尤其省事。还有一个容易忘的点确认ip routing是开启的。绝大多数路由器默认开启但如果这台设备之前被配置过又清空可能存在残留状态。用show ip route看一下能不能看到两条直连路由看到了就说明路由功能正常。配完之后路由器上应该能看到类似这样的路由表条目Router# show ip route Codes: C - connected, S - static, ... C 192.168.10.0/24 is directly connected, GigabitEthernet0/0.10 C 192.168.20.0/24 is directly connected, GigabitEthernet0/0.20这两条 C 路由是单臂路由能工作的根本。没有它们说明子接口的 IP 没配上或者接口没起来。3.4 第一次验证从 ping 到命令核对配置完成后先在主机 A 上 ping 网关 192.168.10.1。这一步通了说明二层链路、trunk、子接口封装、ARP 这一整条链路是通的后面的问题就好定位。然后 ping 主机 B 的地址 192.168.20.20。这一步成功了单臂路由的基本功能就实现了。验证过程中我会配合几条命令交叉确认而不是只看 ping 结果Router# show ip interface brief Router# show vlans Router# show ip route Switch# show vlan brief Switch# show interfaces trunk Switch# show mac address-tableshow vlans这条命令在路由器上输出的是各子接口对应的 VLAN、封装类型、承载的接口一眼就能确认封装有没有生效。如果某个子接口的 VLAN 列显示为空说明encapsulation命令没写对或者没生效这是最常见的配置失误之一。4. 通了但没完全通五类高频故障的排查链路4.1 native VLAN 不一致最容易漏掉的隐形杀手默认情况下trunk 的 native VLAN 是 VLAN 1而 native VLAN 上的帧是不打标签的。这意味着如果交换机把 native VLAN 改成了 10那么 VLAN 10 的帧从 trunk 口出去时不带标签路由器收到的就是一个无标签帧。路由器不会把它交给G0/0.10子接口而是交给物理接口 G0/0 处理——而 G0/0 没配 IP帧直接被丢弃。现象上表现得非常迷惑VLAN 20 通VLAN 10 不通或者两个都不通但交换机上看一切正常。这是因为 untagged 帧的处理逻辑和多 VLAN 交叉在一起很难从现象直接反推原因。解决办法有两个。一是把 trunk 的 native VLAN 保持在默认的 VLAN 1并且不要让任何业务 VLAN 使用 VLAN 1这是最省心的做法。二是如果业务上必须改 native VLAN那就在对应的子接口上加上native关键字Router(config)# interface GigabitEthernet0/0.10 Router(config-subif)# encapsulation dot1Q 10 native我要额外提一句安全方面的考量。native VLAN 是 VLAN 跳转攻击的经典入口因为它不打标签攻击者可以构造双重标签的帧来穿越 VLAN 边界。生产环境里我的建议是把 native VLAN 改到一个专用的、不承载任何业务的黑洞 VLAN所有业务 VLAN 都用 tagged 方式传输。这样既避免了配置歧义也堵住了这类攻击路径。4.2 子接口配好了但物理口没起来前面提过一次这里展开说排查过程。症状是show ip interface brief里子接口显示 up但主机 ping 不通网关。第一步看父接口状态。如果显示administratively down说明物理口被 shutdown 了no shutdown解决。如果显示down而不是administratively down那就是物理层问题线缆、光模块、对端端口状态往这个方向查。第二步看子接口是否真的继承了封装。用show vlans确认。如果 VLAN 列是空的说明encapsulation dot1Q那条命令没生效可能是打错了关键字也可能是配在了错误的接口上下文里。第三步看交换机侧的 trunk 状态。show interfaces trunk如果端口不在列表中说明 trunk 没起来原因可能是对端端口模式不对也可能是两端封装协商失败有些平台需要显式指定switchport trunk encapsulation dot1q。这个三步走的顺序是按“从本地到远端”排的实际排查时能最快缩小范围。4.3 交换机端口模式配反了这类错误在新手配置里出现频率很高而且症状很明确完全不通报文。连路由器的口配成了 access连主机的口配成了 trunk两个方向都错。判断方法很简单看show interfaces switchport或者show interfaces trunk。trunk 列表里应该有连路由器的那个端口access 端口列表里应该有连主机的端口。对不上就是配错了。还有一种半错的情况trunk 口配了但allowed vlan列表里漏了某个 VLAN。这时表现是部分 VLAN 通、部分不通。我在第 3 章强调显式列出允许 VLAN 的另一个原因就在这——显式列表的好处是漏了能一眼发现默认全允许反而容易让人忽略“为什么这个 VLAN 没过来”。4.4 主机侧的三个参数配错一个就白干主机上的配置看着简单但错误率高得惊人。IP、掩码、网关这三个参数任何一个不对都会导致部分或全部不通。掩码错误的后果最隐蔽。比如 VLAN 20 规划的是 192.168.20.0/24主机 B 的掩码写成了 255.255.255.128那么它会认为 192.168.20.128 以后是另一个网段同网段内的部分通信会莫名其妙地走网关绕一圈虽然能通但路径不对如果网关地址落在它认为的“另一个网段”里它就彻底懵了。网关错误则表现为单通。A 能 ping 通 B因为 A 的网关对B 回包时找不到网关或者网关指向了一个不存在的地址回不来。我的习惯是配完主机后先在主机上ipconfig或ip addr看一眼实际生效的参数再ping一下自己的网关最后arp -a确认 ARP 表里有网关的条目。三步都过了主机侧就没问题。4.5 ARP 表和 MAC 表残留导致的“幽灵故障”改配置的过程中ARP 缓存和 MAC 地址表可能还保留着旧数据导致明明配置已经正确通信就是不通。典型场景是你先配错了一版网关地址主机已经学到并缓存了改对之后主机还在用旧的缓存条目直到老化时间到期才恢复。排查方法很直接在主机上清 ARP 缓存在交换机上清 MAC 表在路由器上清 ARP 表。Switch# clear mac address-table dynamic Router# clear arp-cache主机侧各平台的清缓存命令不一样Windows 是arp -d *Linux 是ip neigh flush all。这套操作在实验环境里几乎是条件反射改完关键配置先清一遍再说能省掉一大批“看起来没道理”的假故障。另外还有一个和 ARP 相关的细节值得注意在部分平台的子接口上代理 ARP 的默认状态与物理接口不同某些实现里子接口默认是关闭代理 ARP 的。这意味着主机如果错误地把目标网段的网关指向了错误的子接口路由器不会“好心”帮你转发表现为直接不通。这个行为本身是好事能尽早暴露配置错误但如果你从别的平台迁过来可能会因为默认行为差异而困惑。需要的话可以在子接口上显式开ip proxy-arp但我不建议在单臂路由场景里随便开它只会掩盖真实的网关配置问题。5. 单臂路由的能力边界以及什么时候该换方案5.1 一根链路的带宽账要提前算清楚单臂路由最大的物理限制就在那根“胳膊”上。所有跨 VLAN 流量无论方向都要经过这一个物理接口。而且更严格地说一次跨 VLAN 转发在链路上会出现两次一次是从源 VLAN 上来一次是往目的 VLAN 下去。举个具体的数字。假设物理链路是千兆两个 VLAN 各有 20 台主机业务高峰时跨 VLAN 的实际需求是 600 Mbps。看起来链路带宽够了但实际占用是 600 Mbps 上行加 600 Mbps 下行站在路由器角度看是收发各一次站在这根线的角度看是总吞吐 1.2 Gbps已经超过千兆线速了。结果就是拥塞、丢包、延迟抖动而排查的时候你看单个 VLAN 内部的流量都不大很难联想到是这根共享链路的问题。所以做方案时我会算一笔账把各 VLAN 之间可能的并发互访流量加总乘以 2进出各一次再留 50% 的余量和物理链路带宽比。超过 70% 就该考虑换方案了。这个算法很粗但对中小型网络足够用。5.2 和三层交换机 SVI 方案的正面对比维度单臂路由三层交换机 SVI转发性能受限于单个物理接口带宽软件转发为主硬件 ASIC 转发接近线速内部总线带宽高延迟多一跳且存在进出同口的处理开销内部转发延迟低且稳定设备成本复用现有路由器边际成本低需要三层交换机采购成本高策略能力强NAT、防火墙、流量分析都成熟中等ACL 和策略路由支持较好NAT 能力因型号差异大配置复杂度中等子接口数量随 VLAN 增长较低一个 VLAN 一个 SVI逻辑直观扩展性受物理接口数量和带宽限制受背板带宽限制扩展空间大典型适用小型网络、临时环境、需要集中策略的场景中大型园区网、数据中心、高吞吐场景这张表里我特别想强调“策略能力”这一行。很多人只盯着性能对比忽略了功能差异。如果你的场景需要在 VLAN 间做 NAT比如多个部门共用少量公网地址或者需要做基于应用的流量识别和限速路由器的功能完整度通常高于同价位的三层交换机。这时候单臂路由不是“性能妥协”而是“功能优先”的合理选择。5.3 什么情况下单臂路由仍是最优解几种我实际遇到过、且坚定选择单臂路由的场景。第一种是临时测试环境。要做一次多网段的联调测试需要三四个 VLAN 快速互通手边只有一台路由器和一台二层交换机。这时候配单臂路由十分钟搞定比去借一台三层交换机快得多。而且测试完拆掉就走不留痕迹。第二种是分支机构。一个几十人的办事处三五个 VLAN出口带宽也就几百兆一台路由器同时承担出口网关和 VLAN 间路由设备数量少、故障点少、维护简单。这种情况下上一台三层交换机反而是过度设计。第三种是需要统一策略出口的场景。所有 VLAN 间的流量都要经过同一套 ACL 和流量统计放在路由器上做策略集中在一处审计和变更都方便。如果换成三层交换机策略分散在多台设备上管理成本反而上升。第四条经验即便是最终要上三层交换机的项目我也建议先用单臂路由把地址规划和 VLAN 划分验证一遍。因为单臂路由的配置过程会强制你把每个 VLAN 的网段、网关、trunk 允许列表都过一遍任何规划上的疏漏在这个阶段都会暴露。等验证通过再迁移到 SVI配置映射关系几乎是 1:1 的风险小很多。6. 几组容易忽略的参数与实操心法6.1 MTU 的 4 个字节不是小事802.1Q 标签占 4 个字节这意味着带标签的帧比标准以太网帧长 4 字节。标准以太网 MTU 是 1500带标签后帧长变成 1504。大多数设备能正常处理但在某些严格校验的场景下会出问题比如链路上有设备把 1500 当作硬上限。症状通常很隐蔽小包能通大包不通ping 小包正常、ping 大包比如 1472 字节以上就丢。排查时用带不分片标志的 ping 逐步试探最大可通包长能快速定位。Router# ping 192.168.20.20 size 1500 df-bit如果这个不通而 size 1400 能通基本就是 MTU 相关问题。解决方向是确认链路上所有设备都支持 1504 字节以上的帧长必要时在子接口上调整 IP MTU。这个坑在纯二层环境里几乎不会碰到一旦引入标签就可能冒出来属于单臂路由特有的注意点。6.2 子接口的编号习惯决定后期维护成本前面提过子接口编号和 VLAN ID 对齐的做法这里补充完整的约定。我的习惯是子接口编号 VLAN IDVLAN 名称用业务含义命名而不是编号配置里加一行 description 注明业务归属和负责人。Router(config)# interface GigabitEthernet0/0.10 Router(config-subif)# description OFFICE-NET-GW别小看这行 description。一个跑了两年、有二十多个子接口的路由器没有 description 的配置读起来就是天书。交接的时候新人对着.10到.30一串编号根本不知道哪个是办公、哪个是监控、哪个是访客。加上描述之后show run的输出本身就是一份文档。6.3 用 ACL 给 VLAN 间通信加一道闸单臂路由把所有跨 VLAN 流量都引到了一台设备上这既是性能风险也是天然的策略控制点。默认情况下所有 VLAN 之间是全互通的这在实际业务里通常不是想要的结果。访客 VLAN 不该访问办公 VLAN测试 VLAN 不该访问生产数据库。在子接口上挂 ACL 是最直接的做法。注意方向从某个 VLAN 进来的流量在该 VLAN 的子接口上用in方向过滤。Router(config)# access-list 100 permit ip 192.168.10.0 0.0.0.255 192.168.20.0 0.0.0.255 Router(config)# access-list 100 deny ip any any log Router(config)# interface GigabitEthernet0/0.10 Router(config-subif)# ip access-group 100 inlog关键字加在最后一条 deny 上很有用初期能看到被拦掉的流量便于发现规划遗漏。等策略稳定了再去掉避免日志刷屏。这里有个反直觉的点ACL 只加在一侧另一侧的子接口不做限制并不代表反向流量不受控。因为跨 VLAN 通信必然经过两个子接口在源侧子接口上用in方向拦截就能同时控制该 VLAN 发起的连接和它的回包路径。反过来如果两侧都挂 ACL很容易出现“去程允许、回程被拦”的情况排查起来相当费劲。单侧控制是更清晰的做法。6.4 抓包位置的选择决定了排查效率单臂路由环境下抓包有个特点同一段通信在 trunk 链路上会看到两次一次带源 VLAN 标签一次带目的 VLAN 标签。这个特性可以用来判断问题出在哪一侧。如果能在 trunk 链路上抓到带 VLAN 10 标签的请求帧但抓不到带 VLAN 20 标签的回帧说明路由器没转发问题在路由器的路由表或子接口配置上。如果能抓到两个方向的帧但主机 B 收不到说明问题在交换机到 B 这段的二层转发上查 VLAN 划分和 MAC 表。如果连请求帧都抓不到问题在主机 A 到交换机这段或者 A 的网关配置不对。这个三段式的定位方法比逐条命令去翻要快得多条件允许的话优先用。抓包点选在交换机连路由器的那个口上做端口镜像能看到最全的信息。6.5 从实验环境迁到生产前必须做的几件事实验通了不等于生产能用。我在把这类配置推到生产前固定会做几项检查。一是确认 VLAN 在整条链路上从头到尾都存在包括所有中间交换机。VLAN 没创建的地方trunk 不会传对应的标签帧这个错误在单台交换机的小实验里根本碰不到。二是确认所有 trunk 链路的 allowed vlan 列表一致。中间多一跳交换机配置就多一个可能出错的点。三是评估 STP 的影响。单臂路由依赖的那条 trunk 链路如果被 STP 阻塞或者发生拓扑收敛VLAN 间通信会中断一段时间。对收敛时间敏感的场景要确认 STP 的配置和边缘端口设置合理。四是做一次故障演练。手动 shutdown 掉路由器的物理接口看业务侧的监控能不能及时告警。单臂路由是明显的单点这根线断了所有 VLAN 间通信全断监控必须覆盖到。这几项做完配置才算真正可用。最后分享一个我自己踩过的坑作收尾。早些年配一套实验环境所有配置检查了三遍都没问题就是 VLAN 20 死活不通VLAN 10 一切正常。翻了快一个小时最后发现是交换机那个 trunk 口的allowed vlan列表里写的是10, 20逗号后面多了一个空格。命令在某些平台上能接受在某些平台上后面的值会被解析成非法参数导致整条命令部分生效。从那以后我配完 trunk 一定用show interfaces trunk核对实际生效的允许列表而不是只看自己敲了什么。
阅读完成 · 觉得有帮助?
咨询建站