ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

单臂路由实验详解:802.1Q标签与VLAN间路由配置

单臂路由实验详解:802.1Q标签与VLAN间路由配置 做组网实验的时候单臂路由一般是大家绕不开的第一个“跨VLAN通信”实验。很多朋友会用三层交换机直接起个SVI一条命令就能搞定但如果你手头只有一台二层交换机和一台只有两个千兆口的路由器又想让不同VLAN之间互通单臂路由几乎是唯一不用添设备就能实现的方案。这篇文章我会用GNS3完整走一遍单臂路由实验从为什么需要它、数据帧在Trunk上怎么走到交换机和路由器的逐行配置再到用抓包把802.1Q标签的来龙去脉看清楚。适合刚学完VLAN、想搞懂VLAN间路由的新手也适合准备网络工程师认证面试前想系统复盘的人。1. 跨VLAN通信的痛点为什么单臂路由能成为经典方案1.1 没有路由器的VLAN间通信困境VLAN的核心作用是把一个物理局域网切成多个逻辑广播域。划分VLAN之后同一台交换机上的PC1和PC2虽然插着同一台设备但二层数据帧是互相隔离的广播不会乱穿这对控制广播风暴、收紧访问权限都很有用。可问题也随之而来财务部要访问研发部的打印服务器、办公区要连测试环境的数据库这些跨VLAN通信需求天天都有而二层交换机本身不路由它只认MAC地址不同VLAN之间的帧它在二层根本“看不懂”。要解决就必须引入三层路由功能。最直接的想法是给每个VLAN准备一个路由器物理接口VLAN10的用户把网关指向路由器F0/0VLAN20的用户把网关指向F0/1由路由器在不同接口之间转发数据包。这个方案在VLAN数量很少的时候完全可行但稍微一扩展就露馅了。一台常见的企业路由器只有2到4个千兆口VLAN一多接口根本不够用。哪怕你有8个接口难道为了8个VLAN就要配一台高密度端口的设备成本完全失控。这时候再回头看单臂路由的思路它不再要求“一个VLAN一个物理接口”而是让所有VLAN的流量都从同一条物理链路上走路由器用一个物理口在逻辑上分出多个子接口每个子接口对应一个VLAN各子接口都有独立的IP地址兼任对应VLAN的网关。因为进出流量都汇总在同一根线缆上拓扑图上看起来像只有一条“手臂”伸向路由器所以叫单臂路由。这是早期VLAN间路由最经典也最省设备的解法。1.2 单臂路由 vs 三层交换机选型思考我经常被问到既然有三层交换机为什么还要学单臂路由我的回答是单臂路由虽然性能不如三层交换机但它是理解“VLAN间路由到底在路由什么”的最佳教材。三层交换机本质上是“硬件化的路由器交换机”它在内部帮你把VLAN和路由的关系处理得很隐蔽而单臂路由把每一步都摊开放在你面前——标签怎么打、路由表怎么查、帧怎么转发全都能通过配置和抓包看得一清二楚。从选型角度看两者各有定位。如果你在一家企业里做网络规划VLAN十几个跨VLAN流量又大别犹豫用三层交换机做SVISwitch Virtual Interface才是正路转发性能高、延迟低配置也更简洁。但如果你的环境是实验室、模拟器、家庭网络或者只有一台路由器加一台二层交换机单臂路由就是成本最低的临时方案。我做实验时更倾向于先用单臂路由跑通流程再用三层交换机做一遍对比着理解印象会深很多。对比维度单臂路由三层交换机所需设备路由器二层交换机三层交换机占用接口1个物理口多个子接口无需额外物理口VLAN内SVI配置复杂度子接口封装、Trunk、VLAN全要手动SVI配置相对集中转发性能靠CPU转发瓶颈明显硬件ASIC线速转发适合场景实验、学习、小型网络企业核心、大流量场景2. 从数据帧视角拆解单臂路由的工作原理2.1 为什么需要一个Trunk口单臂路由能成立的前提是路由器必须能从同一条物理链路上收到多个VLAN的数据帧。交换机的Access口只能承载一个VLAN帧进去就直接剥离标签变成普通以太网帧如果路由器接到Access口它只能收到一个VLAN的流量其他VLAN的帧在交换机的这个口上根本不会出现。所以连接路由器和交换机之间的这个端口必须配置为TrunkTrunk口的特点是允许多个VLAN的帧通过并且用802.1Q标签来区分每一个帧属于哪个VLAN。这里有个容易绕晕的点。PC到交换机之间走的是Access口PC发出的帧是untagged无标签交换机从Access口收到帧之后会把它归入对应的VLAN内部处理。当帧需要从Trunk口转发出去时交换机会在帧头插入4字节的802.1Q TagTag里最核心的字段是VLAN ID也就是12比特的VLAN编号。这样路由器在Trunk那端收到帧时只要看Tag里的VLAN ID就知道这个帧来自哪个VLAN处理完再根据目标VLAN重新打标签发回去。整个过程就像给每个数据帧贴了一张门禁通行证。2.2 子接口的工作原理标签即“门牌号”路由器的物理接口本身不认识802.1Q标签或者说它默认只处理untagged帧。要让一个物理口能同时处理VLAN10和VLAN20的帧必须把这个物理口划分成多个逻辑接口也就是子接口。命名上通常写作GigabitEthernet0/0.10、GigabitEthernet0/0.20小数点后面一般是VLAN编号但编号本身不是硬性规定关键是在子接口上必须写一句encapsulation dot1Q vlan-id让这个子接口和具体的VLAN ID绑定。数据帧到达路由器物理接口后先由物理接口收下接着系统会去看帧里的VLAN ID如果ID是10就交给封装了dot1Q 10的子接口处理如果ID是20就交给封装了dot1Q 20的子接口处理。子接口收到帧后会剥离标签把内部的普通IP包交给IP层做路由决策。而子接口上配置的IP地址就是该VLAN内PC的网关地址。所以对VLAN10的PC来说网关是192.168.10.1这个地址就落在G0/0.10上对VLAN20的PC来说网关是192.168.20.1落在G0/0.20上。用生活里的逻辑类比路由器就是一个快递集散中心物理接口是卸货月台子接口是分拣口。每辆货车帧进入集散中心时都带着货物清单VLAN标签分拣员根据清单上写的楼栋号把包裹送到不同子接口。处理完要发出时再根据目的地址写上新清单从同一个月台发出去。没有标签的帧untagged默认走native VLAN对应的那套流程这点后面避坑部分会细说。2.3 数据流全程追踪从PC A到PC B假设PC1属于VLAN10IP是192.168.10.10网关指向192.168.10.1PC2属于VLAN20IP是192.168.20.10网关指向192.168.20.1。我们执行ping 192.168.20.10这一个小小的ICMP请求在单臂路由环境中要经历的完整过程是PC1构造一个ICMP请求包源IP是192.168.10.10目的IP是192.168.20.10。因为目的IP和自己不在同一网段PC1会把帧的目的MAC地址写成网关192.168.10.1的MAC地址然后通过Access口发到交换机。交换机在G0/2口AccessVLAN10收到这个untagged帧把它归入VLAN10。查MAC地址表后发现去往网关MAC需要从G0/1口发出而G0/1是Trunk口于是交换机会给这个帧加上802.1Q TagTag里的VLAN ID填10从G0/1口发给路由器。路由器的物理接口G0/0收到带标签的帧识别出VLAN ID是10交给子接口G0/0.10。子接口剥掉标签IP层发现这个包的目的IP是192.168.20.10不是本机地址于是查路由表发现去往192.168.20.0/24网段要走G0/0.20。路由器通过G0/0.20重新封装这个数据包重新添加802.1Q Tag这次VLAN ID填的是20然后从同一个物理接口G0/0发出去。交换机从Trunk口G0/1收到带VLAN 20标签的帧剥掉标签查MAC地址表发现PC2在G0/3口AccessVLAN20于是把这个untagged帧从G0/3口转发给PC2。PC2收到请求回一个ICMP reply回程再走一遍类似的过程只是方向完全反过来。一套流程看下来单臂路由的关键非常清楚路由器必须在Trunk链路上“看到”VLAN标签才能在不同子接口之间做路由交换机的Access口和Trunk口各有分工标签的添加和剥离都在交换机的口上完成。3. 实验拓扑与地址规划GNS3环境下的搭建记录3.1 实验设备与网络模拟器选择单臂路由用真机能做但大多数朋友没有闲置路由器和交换机模拟器是最好的选择。我自己常用GNS3主要有两个原因一是它对Cisco IOS的还原度高配置命令和真机基本没区别二是它内置的抓包工具可以直接抓Trunk链路看802.1Q标签非常方便。EVE-NG也适合做这类实验但环境搭建比GNS3重学习阶段GNS3足够。在GNS3里搭单臂路由建议准备一台路由器镜像我用的是c7200或者c3745一台二层交换机镜像。前者很容易理解重点在交换机。如果你用的镜像是一个支持路由功能的IOS交换机比如某些三层交换机镜像需要先执行no ip routing把它当成二层交换机用如果你直接用GNS3自带的允许二层交换的设备如Ethernet switch那就更省事不需要额外关闭路由功能。搭建前确认一下镜像行为免得做完才发现交换机在偷偷三层转发那就没有单臂路由的灵魂了。3.2 拓扑连接与IP/VLAN规划表本次实验拓扑如下R1是路由器SW1是二层交换机PC1和PC2分别挂在SW1的不同端口上。R1的G0/0连接到SW1的G0/1这条链路必须设置TrunkSW1的G0/2连接PC1做Access并划入VLAN10SW1的G0/3连接PC2做Access并划入VLAN20。PC1和PC2在GNS3里我习惯用VPCS模拟配置命令极简速度快不会占用太多IO资源。地址规划必须提前列清楚否则配置时很容易乱。我常用的规划表长这样对象所在VLANIP地址网关接口PC1VLAN10192.168.10.10/24192.168.10.1SW1 G0/2AccessPC2VLAN20192.168.20.10/24192.168.20.1SW1 G0/3AccessR1子接口VLAN10192.168.10.1/24—G0/0.10dot1Q 10R1子接口VLAN20192.168.20.1/24—G0/0.20dot1Q 20路由器物理口—不配IP—G0/0连接SW1 G0/1SW1上联口—不配IP—G0/1Trunk为什么路由器的物理接口G0/0不配IP因为物理口一旦配置了普通IP地址它就会按普通三层口处理不会再往子接口分发了。在单臂路由实验中物理口只需要no shutdown保持up真正的三层地址全部放在子接口上这一点新手特别容易踩我后面排错部分还会专门强调。3.3 环境搭建中的两个小细节第一个小细节GNS3里添加PC时最好在VPCS的配置里直接写死IP和网关。举例来说PC1上执行ip 192.168.10.10 255.255.255.0 192.168.10.1PC2上执行ip 192.168.20.10 255.255.255.0 192.168.20.1。VPCS还有一点很友好它会自己把网关的MAC地址解析出来省去手动维护ARP表。第二个小细节如果网络里有多台交换机组了环路STP会阻塞端口实验前最好确认没有环路。单臂路由拓扑非常简单一般是线形结构很少出现STP阻塞。但只要涉及Trunk尤其是多台交换机互连就要记得检查Trunk口是否处于转发状态show interfaces trunk能看到当前状态别默认它是通的。4. 交换机和路由器的逐条配置与验证过程4.1 交换机侧配置VLAN与Trunk下面是我在实验中实际执行过的交换机配置命令按顺序贴出来每条都加一句解释。enable configure terminal hostname SW1 vlan 10 name VLAN10 vlan 20 name VLAN20先创建VLAN 10和VLAN 20并给它们起个名字。名字主要为了自己看show vlan brief时更直观不影响转发逻辑。interface GigabitEthernet0/2 switchport mode access switchport access vlan 10 interface GigabitEthernet0/3 switchport mode access switchport access vlan 20把连接PC1和PC2的两个口设置为Access模式并分别划入VLAN10和VLAN20。switchport mode access的作用是强制这个端口只跑单个VLAN收到的帧不带标签就归入access vlan带标签的帧通常会被丢弃所以它和Trunk口形成鲜明对比。interface GigabitEthernet0/1 switchport mode trunk switchport trunk allowed vlan 10,20上联路由器的口配置成Trunk。默认情况下Trunk口允许所有VLAN通过但我习惯显式写出switchport trunk allowed vlan 10,20限流这两个VLAN避免实验里出现VLAN1或其他VLAN的意外流量干扰判断。如果这里少写了某个VLAN那个VLAN的流量就会在交换机这端被过滤掉路由器自然看不到通信就断了。配置完成后在交换机上输入show vlan brief和show interfaces trunk能看到VLAN表和Trunk状态。确认G0/1处于trunking状态且Allowed VLAN列表包含10和20这一步是后面排错的基础。4.2 路由器侧配置创建子接口与802.1Q封装路由器侧配置比较短但顺序很重要。我先把完整命令贴出来enable configure terminal hostname R1 interface GigabitEthernet0/0 no shutdown no ip address interface GigabitEthernet0/0.10 encapsulation dot1Q 10 ip address 192.168.10.1 255.255.255.0 interface GigabitEthernet0/0.20 encapsulation dot1Q 20 ip address 192.168.20.1 255.255.255.0第一块是物理接口G0/0no shutdown让接口起来no ip address确保它不参与三层转发只作为承载子接口的物理载体。有些平台上物理口默认没有IP地址但写上no ip address不亏能避免后面误操作给物理口配了IP导致子接口失效。第二块是子接口G0/0.10encapsulation dot1Q 10是这个实验的灵魂。它告诉路由器凡是经过物理口进来的、VLAN ID为10的帧都交给这个子接口处理凡是从该子接口发出去的帧必须贴上VLAN 10的标签。第三块同理把VLAN20的帧交给G0/0.20处理。这里有一个很容易产生的疑问子接口编号必须和VLAN ID一样吗答案是不必须GigabitEthernet0/0.100也可以绑定VLAN10只要封装命令写的是encapsulation dot1Q 10就行。编号纯粹是给人看的封装才是真正起作用的逻辑。但从可读性角度我强烈建议让子接口编号和VLAN ID保持一致否则时间一长自己都会搞混。配置完可以执行show ip interface brief如果看到G0/0.10和G0/0.20都是up/up并且IP地址正确路由器侧基本就绪。要是看到administratively down多半是物理口没有no shutdown。4.3 验证连通性从ping到traceroute先做最基础的连通性测试。在PC1上执行ping 192.168.10.1这是网关测试确认PC1到路由器子接口的二层通路正常。如果这一步不通问题基本集中在Access口VLAN配置或PC网关配置上。再在PC1上执行ping 192.168.20.10这是真正的跨VLAN测试。通了说明单臂路由成功不通先别急着查防火墙按下一章的思路逐项检查。为了看得更细我会在PC1上执行trace 192.168.20.10正常会看到第一跳是192.168.10.1说明PC1确实把帧发给了网关由路由器转发。路由器上也别闲着。执行show ip route确认路由表里有192.168.10.0/24和192.168.20.0/24两条直连路由它们是子接口up后自动生成的。如果子接口配置正确两条路由必然存在缺了哪条就说明对应的子接口或者封装有问题。我还会在路由器上执行debug ip icmp然后从PC1 ping一次PC2观察路由器是否收到并转发了ICMP包。这个命令在生产环境慎用实验环境无所谓。通过输出能看到路由器从G0/0.10收到echo request从G0/0.20发出echo request回包也类似这就把路由流程验证得非常清楚了。5. 抓包实测802.1Q标签是如何被添加和剥离的5.1 抓包前的准备镜像口与过滤条件单臂路由实验最直观的理解方式就是抓包看标签。GNS3里右击R1和SW1之间的链路选择“Start Capture”然后回到Wireshark界面给过滤条件加上vlan或者eth.type 0x8100就能只看到带802.1Q标签的帧。如果是在真机上做可以配置SPAN端口镜像把Trunk口上的流量复制到监控口再抓包。命令大致是monitor session 1 source interface Gi0/1和monitor session 1 destination interface Gi0/24具体平台有差异。模拟器里抓包最大的好处是不需要额外物理设备直接在链路节点上就能抓。5.2 抓包结果解读Tagged帧和untagged帧从PC1 ping PC2然后在Trunk链路上抓包会看到两类关键帧。第一类是PC1发出的ICMP请求这个帧在Trunk上带着VLAN ID为10的Tag。你展开Wireshark里的802.1Q层能看到Priority、VLAN ID: 10、Type: IPv4这就是交换机在Access口收到PC1的untagged帧后在Trunk口打了VLAN 10标签的结果。第二类是路由器回程转发给PC2的ICMP请求在Trunk上带的Tag是VLAN ID 20。注意看这个帧的源MAC地址已经是路由器的G0/0接口MAC目的MAC是PC2的MACIP层的源地址和目的地址都没变。路由器在子接口之间转发时重写了二层地址同时把VLAN标签从10换成了20这就是单臂路由的转发行为在帧层面的体现。如果抓PC1到交换机那个Access口的包反而看不到任何802.1Q标签都是untagged帧。这说明标签只在Trunk链路两头之间传递交换机在Access口发给PC之前会把它剥掉。记住这个逻辑你就能理解为什么PC上的抓包软件永远看不到VLAN Tag除非你专门在支持VLAN的接口上抓。5.3 实验结论单臂路由的代价与适用边界抓完包再看实验结论印象会更深。首先必须承认单臂路由的设计非常巧妙用一条物理链路解决了多个VLAN的三层互通配置不复杂原理也很清晰。但它有个天然瓶颈所有跨VLAN流量必须从同一个物理口进出如果VLAN间通信量很大这个口很容易成为拥塞点再加上路由器是用CPU做软件转发处理能力和三层交换机的硬件线速转发差距明显。所以在真实网络中单臂路由一般只出现在两类地方一是对性能要求不高的偏远分支或小型办公室第二个就是我更推荐的——网络学习者的实验台上。它和三层交换机方案放在一起对比能帮你把VLAN标签、子接口、路由表这些概念彻底打通。后面你再学VXLAN、学习Policy Based Routing都要用到这些底子。6. 我踩过的坑单臂路由实验的典型故障与排查方法6.1 现象不同VLAN互ping不通做这个实验时最容易遇到的现象是PC1能ping通自己的网关192.168.10.1也能ping通同一VLAN里的其他主机但ping VLAN20的PC2就是不通。遇到这种情况先稳一稳按照下面的排查链路一步步来大多数问题十分钟内能定位。还有一类现象是全都不通包括PC1 ping网关都不通。这种情况优先级更高先把问题缩小到接入层或子接口。我的习惯是首先检查所有接口状态用show interfaces status看交换机侧端口有没有up/up用show ip interface brief看路由器侧接口状态。接口down的话物理线缆、VLAN配置都可以放一放先解决接口up的问题再说。6.2 排查链路从接口状态到配置逐项对照我给自己总结过一个固定的排查顺序在这里分享出来先看两端接口状态。交换机上show interfaces status路由器上show ip interface brief确保所有连接接口up/up。很多新手在GNS3里连了线但忘了加模块或者路由器接口没写no shutdown接口状态直接标红。再看交换机Trunk。show interfaces trunk确认G0/1处于trunking且Allowed VLAN列表包含10和20。有时候switchport trunk allowed vlan 10,20写错写成vlan 10或vlan 20另一个VLAN的帧就被挡掉了。然后看VLAN分配。show vlan brief确认G0/2属于VLAN10G0/3属于VLAN20。如果交换机的Access口配置错了比如两个PC都分到VLAN10那PC1能ping通PC2但完全没有跨VLAN流量单臂路由根本没参与。再确认子接口封装。show running-config interface GigabitEthernet0/0.10看看encapsulation dot1Q和IP地址是否匹配规划表。一个常见的低级错误是子接口配置了IP但忘了写扩展封装结果这个子接口收到的untagged帧还会被处理而tagged帧反而不一定能对上行为很怪。最后用ping和debug验证。先ping网关再ping对端通过debug ip icmp看路由器有没有收到ICMP包。如果路由器一直收不到包问题大概率在交换机Trunk或Access口如果收到了但不回应看看子接口IP、路由表、ARP表是否正常。6.3 高频误操作Native VLAN、allowed vlan与子接口编号单臂路由的坑位其实很集中我以前带学生时发现几类错误反复出现。第一类是子接口编号和VLAN ID不一致但封装命令写对了这种倒不影响功能只是人看着容易晕。第二类是封装命令里的VLAN ID和交换机的VLAN号对不上比如交换机里VLAN10路由子接口却封装了dot1Q 20数据帧过来后找不到对应子接口直接被丢弃。第三类高频误操作是Native VLAN。默认情况下交换机的Trunk口Native VLAN是VLAN1意味着VLAN1的帧在Trunk上是不带标签的。如果路由器的某个子接口被配置成encapsulation dot1Q 1 native它就能接收untagged帧。实验中我根本不使用VLAN1做业务所以路由器子接口不需要native关键字但如果你把业务划到了VLAN1或者交换机上改了native VLAN就必须在路由器子接口上也对应配置否则会出现“VLAN1能通但VLAN10/20不通”的诡异现象。第四类是Trunk口的allowed vlan。前面提过Cisco交换机默认允许所有VLAN但你一旦手写了switchport trunk allowed vlan就只会允许列表里的VLAN。很多人后来往交换机里加了VLAN30忘了更新Trunk的allowed列表结果VLAN30跨路由死活不通排查半天没发现在这里。6.4 我的习惯做完实验后的“三板斧”清理法实验做完不是结束清理和复盘同样重要。我自己的习惯是三件事第一把所有配置跑一遍show running-config把关键行截图或存成文本标记哪些是必须有的哪些是可选优化这对以后快速复盘非常有价值。第二用write erase和reload清掉模拟器里的配置避免下次实验被上一次的残留配置干扰。第三把实验记录整理成一张故障速查表比如“现象跨VLAN不通原因allowed vlan漏配”下次再遇到类似问题翻一眼就能定位。单臂路由这个实验虽然小却是网络工程里非常经典的一块积木。我做这个实验最大的体会是跨VLAN通信的本质不在路由器配了什么命令而在于你对802.1Q标签、Trunk、子接口这几个概念是否真的建立了画面感。建议你在模拟器里至少做一遍抓包亲眼看Tag在Trunk上被加上、被剥掉后面学三层交换机、VXLAN、Segment Routing的时候你会发现这份底层理解比任何命令都值钱。
返回列表