做网络实验这么多年,多VLAN跨路由互通这件事,听着基础,但每次都会有人栽在某个细节上。最近我把华为设备上的一套多VLAN跨路由组网完整跑了一遍,从交换机VLAN划分、Trunk链路,到路由器子接口终结,再到静态路由、OSPF和策略路由,都做了验证。这篇文章就按实验顺序把整个组网拆开讲,配置命令、验证命令、踩坑记录一起给到。
实验背景很简单:一台华为二层交换机,一台华为路由器,下面挂三个不同VLAN的PC,最终要实现三网段互相访问。看起来就是典型的“单臂路由”,但真正做完会发现,问题往往不是配置写不出来,而是PVID、ARP广播终结、路由优先级这些细节没想清楚。适合正在学数通、准备HCIA/HCIP,或者需要在真机上做多VLAN网关收敛的工程师参考。
1. 组网需求与整体设计思路
1.1 这个实验到底要解决什么问题
VLAN存在的意义是把一个大的广播域切成几个独立的小广播域,好处是隔离广播、方便管理、降低故障影响范围。但VLAN一旦隔离,三层互通就断了,因为PC默认只会访问自己网段内的地址。要让不同VLAN里的PC互相通信,必须有一个三层设备充当网关,替它们做跨网段转发。
这个实验里的核心需求很明确:三个VLAN分别对应三个业务网段,PC1、PC2、PC3互访要通,同时所有VLAN的网关收敛到路由器上。实验里我用一台S5700交换机连一台AR2220路由器,设备型号不重要,关键是理解这套转发逻辑。生产环境里如果只是内部东西向流量大,一般会直接用三层交换机的VLANIF接口做网关;但如果还要做出口NAT、策略控制、拨号或者安全过滤,路由器或者防火墙做VLAN网关也很常见。
这套实验的价值在于,它把二层VLAN、Trunk封装、三层子接口、路由表查询、ARP解析、动态路由、策略路由全部串在了一条链路上。只要把这一套跑通,后面再去看三层交换机VLANIF、防火墙子接口、VXLAN这些技术,思路会顺很多。
1.2 为什么用单臂路由而不是每个VLAN一根物理线
最原始的做法是路由器每个接口对应一个VLAN,VLAN10用G0/0/0,VLAN20用G0/0/1,VLAN30用G0/0/2。这种方案配置简单,但接口消耗太大,交换机上还得为每个VLAN单独划一个Access口接路由器,端口利用率很低。
单臂路由的思路是在交换机上把到路由器的链路配成Trunk,让多个VLAN的数据都带着802.1Q Tag在这条物理链路上跑,路由器通过子接口区分不同VLAN。子接口是物理接口上虚拟出来的逻辑接口,每个子接口绑定一个VLAN ID,并配置对应网段的网关地址。
这样做的好处非常明显:只占用路由器一个物理口和交换机一个物理口,成本低,扩展灵活。缺点是所有跨VLAN流量都要经过这条Trunk链路,带宽会被所有VLAN共享,所以它更适合中小规模组网,不适合转发量很大的场景。生产环境中如果网关压力大,通常会把单臂路由替换成三层交换机的VLANIF接口,那就是另一套配置思路了。
1.3 拓扑规划和IP地址设计
实验拓扑我设计成一台交换机、一台路由器、三台PC。交换机三个接口分别接PC,一个Trunk口接路由器。路由器通过三个子接口终结三个VLAN。
| VLAN | 网段 | 网关 | 接入口 | 用途模拟 |
|---|---|---|---|---|
| VLAN 10 | 192.168.10.0/24 | 192.168.10.1 | GE0/0/1 | 办公区域 |
| VLAN 20 | 192.168.20.0/24 | 192.168.20.1 | GE0/0/2 | 研发区域 |
| VLAN 30 | 192.168.30.0/24 | 192.168.30.1 | GE0/0/3 | 服务器区域 |
PC的IP地址依次是192.168.10.2、192.168.20.2、192.168.30.2,掩码都是255.255.255.0,网关分别指向对应VLAN的子接口地址。
这里有个设计要点:VLAN编号和网段第三位尽量对上,这样排障时一眼就能确认VLAN和IP对不对应。真机上如果VLAN ID和网段对不上,比如VLAN10用192.168.20.0/24,后面查路由表、查ARP都会很痛苦。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 交换机侧:VLAN划分与Trunk链路配置
2.1 创建VLAN并配置Access接口
交换机侧的工作分两步:先创建VLAN,再把连接PC的接口划到对应VLAN里。华为交换机上创建VLAN可以用vlan batch一次性批量创建,比一条条vlan命令方便很多。
bash复制system-view
vlan batch 10 20 30
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 access
port default vlan 30
Access口是二层交换机连接终端的典型模式。Access口只属于一个VLAN,从PC收到的无标签数据帧会被交换机打上对应VLAN的Tag,发送给PC时会去掉Tag。所以PC上不需要配置任何VLAN信息,插上就能进指定VLAN。
配完之后可以用display vlan看一眼VLAN状态。正常情况下每个VLAN的Status都是up,接口列里能看到对应的Access端口。
bash复制display vlan
如果某个VLAN的Status是down,通常意味着交换机上没有任何接口属于这个VLAN,或者所有对应接口都shutdown了。这在后续排障时很容易被忽略,因为VLAN配置看起来没报错,但数据就是不通。
2.2 Trunk口配置与PVID的坑
交换机连接路由器的接口必须配成Trunk,才能让多个VLAN的数据带着Tag通过。实验里我用GigabitEthernet0/0/24作为Trunk口。
bash复制interface GigabitEthernet0/0/24
port link-type trunk
port trunk allow-pass vlan 10 20 30
这里最容易出问题的是port trunk pvid vlan这条命令。网上搜华为交换机配置经常能看到port trunk pvid vlan 10,但很多人不理解它的意义,直接照抄,结果单臂路由怎么都调不通。
PVID是Trunk口的缺省VLAN。对于从Trunk口收到的无标签数据帧,交换机会给它打上PVID对应的VLAN Tag。同时,Trunk口发送PVID这个VLAN的数据时,默认会去掉Tag,也就是以无标签帧形式送出去。在单臂路由场景里,路由器子接口配置了dot1q termination vid之后,默认只会处理带对应VLAN Tag的帧。如果你把Trunk口的PVID改成VLAN10,交换机会把VLAN10的帧脱掉Tag发给路由器,路由器子接口就识别不了,VLAN10网关直接ping不通。
所以我的建议是:在单臂路由这条Trunk上,PVID保持默认就行,不要让PVID等于任何一个需要路由终结的VLAN。真正需要改PVID的场景是两台交换机Trunk对接,并且允许某个VLAN作为Native VLAN透传无标签帧,或者接入某些不支持802.1Q的哑设备。等网络基础扎实了再去动PVID,不要在入门阶段给自己埋雷。
2.3 交换机侧配置完成后怎么验证
配置完交换机,先不要急着去路由器上写命令。先确认二层链路是否正常,否则后面排查会分不清是二层问题还是三层问题。
bash复制display port vlan
这个命令可以看所有接口的链路类型、PVID和允许通过的VLAN。重点检查Trunk口是不是trunk,allow-pass是不是包含了10、20、30,有没有把不需要的VLAN放进来。
bash复制display interface GigabitEthernet0/0/24
这条命令看端口物理状态和协议状态,两者都应该是up。如果协议状态是down,通常是网线没接好、对端接口shutdown或者自协商有问题。我在eNSP里做实验时经常遇到物理口没开启的情况,真机上则是光模块或者双工模式问题比较多。
还有一个很容易漏的点:Trunk口和Access口是不能同时生效的。如果接口之前是Access模式,执行port link-type trunk之后,接口会变成Trunk,但原有的PVID和允许通过的VLAN列表可能不是你想要的。所以配置完一定要用display port vlan确认一遍。
3. 路由器侧:子接口终结VLAN与网关配置
3.1 华为路由器子接口的标准配置
路由器上做单臂路由,核心是给物理接口创建子接口,每个子接口绑定一个VLAN ID,并配置IP地址作为该VLAN的网关。华为路由器的命令和思科有些区别,最容易被忽略的是arp broadcast enable。
bash复制system-view
interface GigabitEthernet0/0/0
undo shutdown
interface GigabitEthernet0/0/0.10
dot1q termination vid 10
ip address 192.168.10.1 255.255.255.0
arp broadcast enable
interface GigabitEthernet0/0/0.20
dot1q termination vid 20
ip address 192.168.20.1 255.255.255.0
arp broadcast enable
interface GigabitEthernet0/0/0.30
dot1q termination vid 30
ip address 192.168.30.1 255.255.255.0
arp broadcast enable
dot1q termination vid用来指定这个子接口处理哪个VLAN的Tag。不同子接口的VLAN ID不能重复,否则路由器不知道该把帧交给谁。ip address就是VLAN网段的网关地址。
arp broadcast enable这条命令在华为路由器子接口上几乎必须配置。原因是子接口天然不处理广播帧,如果没有开启ARP广播终结,PC发出来的ARP广播请求到达路由器后会被直接丢弃,PC永远无法解析到网关MAC,自然也就ping不通网关。真实设备上很多工程师配置子接口时漏了这条,排了半天最后发现就是这个原因。
3.2 为什么PC的网关必须指向子接口地址
PC要跨网段访问,首先要把数据包交给网关。网关地址就是路由器子接口的IP地址。子接口在逻辑上承担了“该VLAN的网关”这一角色,所以PC的默认网关必须和所在VLAN对应子接口地址在同一个网段。
比如PC1在VLAN10,IP是192.168.10.2/24,网关必须是192.168.10.1。如果把网关错写成192.168.20.1,PC1会认为网关不在自己的网段里,发出ARP请求之后得不到回应,数据包根本出不去。
这里还有一个容易搞混的概念:子接口的MAC地址是物理接口的MAC地址,还是每个子接口有独立MAC?华为路由器上通常所有子接口共用物理接口的MAC地址。这意味着从交换机侧看,Trunk口收到的来自不同VLAN的帧,源MAC可能都一样。这本身没问题,因为MAC地址只用于二层转发,VLAN Tag负责区分广播域。
3.3 单臂路由的数据走向
以PC1访问PC2为例,完整的数据走向应该是这样的:
PC1先把目的IP 192.168.20.2和自己的网关做比较,发现不在同一个网段,于是把数据帧封装成目的MAC为网关MAC的帧,源MAC是自己的MAC,送到交换机。交换机从Access口GE0/0/1收到无标签帧,打上VLAN10的Tag,然后在VLAN10里查MAC地址表,发现路由器方向需要走Trunk口,于是带着VLAN10 Tag转发给路由器。
路由器从G0/0/0物理口收到带VLAN10 Tag的帧,交给子接口G0/0/0.10处理。子接口剥掉Tag,查看目的IP 192.168.20.2,发现路由表里有直连路由192.168.20.0/24,出接口是G0/0/0.20。路由器需要知道PC2的MAC地址,于是在VLAN20里发ARP广播请求,交换机在VLAN20里广播这个请求,PC2回应后路由器把数据帧封装成VLAN20 Tag的帧,再从Trunk口发回交换机。交换机根据MAC地址表把帧从GE0/0/2转发给PC2,同时去掉VLAN20 Tag。
整个过程中,交换机只负责二层转发和VLAN Tag的添加/剥离,路由器负责跨VLAN的三层路由和ARP解析。这也是理解所有VLAN间通信的基础模型。
4. 数据帧与协议层面的深度解析
4.1 802.1Q到底做了什么
VLAN能跨设备生效,依赖的是802.1Q协议。它在标准以太网帧头里插入了一个4字节的Tag,结构是TPID加TCI。TPID固定为0x8100,用来告诉交换机这个帧是带VLAN Tag的。TCI里面包含3比特的优先级、1比特的CFI/DEI和12比特的VLAN ID。
VLAN ID只有12位,所以取值范围是0到4095,其中0和4095保留,实际可用的是1到4094。这就是为什么VLAN编号不能超过4094。在Trunk链路上,这个Tag就是不同VLAN数据的“身份证”,交换机通过Tag判断数据应该属于哪个广播域。
Access口和Trunk口的本质区别就在处理Tag的方式上。Access口只允许一个VLAN通过,入口给无标签帧打Tag,出口去掉Tag。Trunk口允许多个VLAN通过,默认对非PVID的VLAN打Tag,对PVID对应的VLAN不打Tag。所以二层交换机上Trunk口把哪些VLAN放进allow-pass,直接决定了哪些VLAN的三层数据能到达路由器。
4.2 ARP在跨VLAN通信里的角色
很多人觉得ARP只在同网段通信时才有用,其实跨VLAN通信同样离不开ARP,只是ARP被“限制”在了每个VLAN的广播域里。
PC1想访问PC2,但它知道目的IP不在自己网段,所以不会直接广播ARP询问PC2的MAC,而是先广播ARP问“谁是192.168.10.1”,也就是网关。这个广播帧只在VLAN10里传播。路由器VLAN10子接口收到后回包,告诉PC1自己的MAC。PC1把网关MAC作为数据帧的目的MAC,发出跨网段数据包。
路由器收到跨网段数据包后,需要把数据转发给PC2。这时路由器要做一次新的ARP查询,广播问“谁是192.168.20.2”,这个广播只会在VLAN20里传播。PC2回应后,路由器才能完成二层封装。
所以单臂路由的ARP流程是分段完成的:源设备到网关一段,网关到目的设备一段。每一段都不能跨VLAN广播。这也是为什么子接口一定要开启arp broadcast enable,否则ARP广播终结不了,后面的路由转发全是空谈。
4.3 路由表怎么决定最终转发路径
路由器转发数据包时,不会根据MAC地址表转发,而是根据IP路由表。路由器收到一个IP包后,先看目的IP,然后在路由表里查找匹配的路由条目。
路由匹配有三个关键因素:掩码长度、路由优先级、度量值。华为设备上,直连路由的优先级是0,OSPF是10,静态路由默认是60,RIP是100。路由器会首先比较掩码长度,最长掩码匹配优先;如果掩码一样,再比路由优先级;如果优先级也一样,才比度量值。
这个机制很重要。比如R1上同时有一条静态路由192.168.20.0/24指向下一跳A,又通过OSPF学到了192.168.20.0/24指向下一跳B,OSPF的优先级比静态路由高,路由器会优先走OSPF的下一条,静态路由变成备份。理解了这个,才能看懂为什么有时候你配了静态路由却不生效。
实验里单台路由器终结VLAN时,路由表主要就是三个直连路由。加上对端路由器后,就需要静态路由或者OSPF来传递远端网段信息,这时路由优先级和选路逻辑才能真正体现出来。
5. 跨设备路由场景:静态路由、OSPF与策略路由怎么选
5.1 加上第二台路由器模拟跨设备访问
单台路由器的单臂路由只能解决内部VLAN互通,想体现“路由”和“协议”的深度,我把拓扑扩展了一下:R1继续终结VLAN10、20、30,R1和R2之间用一条192.168.100.0/30的链路连接,R2后面模拟一个远端网段192.168.200.0/24。这样PC1访问192.168.200.2时,就需要真正查路由表,而不是靠直连路由直接转发。
R2上的配置比较简单,只需要给互连接口配置IP,再给R2后面的PC配置网关。R1上则要配置到192.168.200.0/24的路由,R2上要配置回程路由。
bash复制# R1
interface GigabitEthernet0/0/1
ip address 192.168.100.1 255.255.255.252
# R2
interface GigabitEthernet0/0/1
ip address 192.168.100.2 255.255.255.252
interface GigabitEthernet0/0/2
ip address 192.168.200.1 255.255.255.0
5.2 静态路由怎么看、怎么配
静态路由适合链路固定、拓扑简单的小规模环境。配置命令很直接,核心是写清楚目的网段、掩码和下一跳地址。
bash复制# R1上配置到R2业务网段的路由
ip route-static 192.168.200.0 255.255.255.0 192.168.100.2
# R2上配置到R1三个业务网段的路由
ip route-static 192.168.10.0 255.255.255.0 192.168.100.1
ip route-static 192.168.20.0 255.255.255.0 192.168.100.1
ip route-static 192.168.30.0 255.255.255.0 192.168.100.1
这里最关键的坑是回程路由。很多人只配了R1到R2的方向,忘了配R2到R1的回程,结果从VLAN10 ping192.168.200.2时,请求能过去,但回应回不来,现象就是超时。所以跨路由器联调时,一定要两头都看路由表。
静态路由的缺点是它不会感知链路状态。比如R1到192.168.200.0/24的下一跳192.168.100.2断了,静态路由还是留在路由表里,数据包继续往黑洞里发。想要冗余,得配两条静态路由并调整优先级,或者直接上动态路由协议。
5.3 OSPF动态路由配置与收敛逻辑
OSPF是链路状态协议,路由器之间会建立邻居关系,互相通告接口网段和链路状态。链路发生变化时,OSPF能迅速收敛,自动切换到可用路径。对于多台路由器、多VLAN的组网,OSPF比静态路由省心得多。
在实验里把R1和R2之间的静态路由删掉,换成OSPF。R1的OSPF通告三个VLAN网段和互连网段,R2通告自己的直连网段和互连网段。
bash复制# R1
ospf 1 router-id 10.0.0.1
area 0.0.0.0
network 192.168.10.0 0.0.0.255
network 192.168.20.0 0.0.0.255
network 192.168.30.0 0.0.0.255
network 192.168.100.0 0.0.0.3
# R2
ospf 1 router-id 10.0.0.2
area 0.0.0.0
network 192.168.100.0 0.0.0.3
network 192.168.200.0 0.0.0.255
OSPF里network命令用的是通配符掩码,0.0.0.255表示匹配/24网段,0.0.0.3表示匹配/30网段。配完后用display ospf peer看邻居状态,Full就说明邻居建立成功。
OSPF和静态路由同时存在时,要注意优先级规则。华为设备上OSPF内部路由默认优先级是10,静态路由默认是60。如果两条路由指向同一个目的网段,OSPF会优先出现在路由表里。如果你想用静态路由做备份,可以调整静态路由的优先级,让它比OSPF大,这样平时走OSPF,OSPF故障后静态路由才顶上。
如果R2上有一条外部静态路由要注入OSPF,还可以在OSPF进程里配置import-route static。这种路由重分布方式能把手写的静态路由、直连路由或者其它协议的路由变成OSPF外部路由通告出去,适合边缘出口和核心网络联动的场景。
5.4 PBR策略路由:不按路由表走怎么办
普通路由是根据目的IP查路由表转发,策略路由可以基于源IP、目的IP、端口等条件,强制指定下一跳或者出接口。最典型的需求是:VLAN10的流量走专线出口,VLAN20的流量走普通出口,单靠目的网段的路由表做不到这种粒度。
华为设备上策略路由的配置思路是先用ACL匹配流量,再定义策略行为,最后应用到接口。下面是让VLAN10流量下一跳强制指向192.168.100.2的示意配置。
bash复制acl number 3000
rule 10 permit ip source 192.168.10.0 0.0.0.255
policy-based-route pbr1 permit node 10
if-match acl 3000
apply ip-address next-hop 192.168.100.2
interface GigabitEthernet0/0/0.10
ip policy-based-route pbr1
配置PBR后,来自192.168.10.0/24的流量即使路由表里查到的下一跳不是192.168.100.2,也会被强制送到192.168.100.2。这就是“策略路由优先于路由表”的含义。
用PBR时一定要小心,它只影响应用了策略的接口收到的流量。比如你应用在G0/0/0.10上,只对从VLAN10进路由器的流量生效。如果想让往返都走指定路径,另一端设备上也要做对应策略。PBR排障也麻烦,因为display ip routing-table看到的路由并不等于实际转发路径,必须结合策略配置一起看。
6. 验证思路与常见问题排查实录
6.1 一套完整的验证流程
我把实验做完后,通常会按下面顺序验证,每步都能快速定位问题在二层还是三层。
第一步,从PC上ping自己的网关。PC1执行ping 192.168.10.1,如果通,说明VLAN划分和子接口ARP终结没有问题。如果不同,优先查交换机的VLAN配置和路由器的arp broadcast enable。
第二步,从路由器上ping各VLAN里的PC。比如R1上执行ping -a 192.168.10.1 192.168.20.2,能通说明路由器到VLAN20的三层链路没问题,接下来排查PC上可能存在的防火墙或网关配置。
第三步,查看路由表。display ip routing-table 192.168.200.0能直接看到这条路由是否存在、下一跳是哪里。如果没有,检查静态路由或者OSPF邻居状态。
第四步,查看ARP表。display arp | include 192.168.20.2可以看出路由器是否成功解析到PC2的MAC。如果状态是Incomplete,说明ARP请求发出去了但没人应答,问题大概率在二层VLAN隔离或者PC本身。
第五步,跨设备验证。R2上执行ping -a 192.168.200.1 192.168.10.2,从远端反向测试,能同时验证回程路由和VLAN终结是否正常。
6.2 常见问题速查表
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| PC能ping通网关,但ping不通另一个VLAN的PC | 路由器没有到对端网段的路由,或回程路由缺失 | display ip routing-table,检查双方向路由 |
| PC连网关都ping不通 | 子接口没开arp broadcast enable,或Access口VLAN不对 |
检查子接口配置,display port vlan |
| VLAN10通,VLAN20不通 | Trunk口allow-pass漏了VLAN20,或子接口VLAN ID写错 | display port vlan,核对子接口dot1q termination vid |
| 所有VLAN都不通 | 路由器物理口shutdown,或Trunk链路断了 | display interface brief,确认物理状态和协议状态 |
| 配置了静态路由但路由表里没有 | 掩码写错,或下一跳不可达 | display ip routing-table,ping下一跳 |
| OSPF邻居不是Full | 区域ID不一致,或hello间隔、网络类型不一致 | display ospf peer,检查两端area和network宣告 |
6.3 我踩过的几个坑
第一个坑就是PVID。我在测试单臂路由时图省事,直接把交换机的Trunk口PVID改成了VLAN10,结果VLAN10的PC一直ping不通网关,VLAN20反而通。原因是交换机把VLAN10的帧脱掉Tag发给路由器,而路由器子接口只认带Tag的帧。后来我把Trunk口PVID恢复默认,所有VLAN立刻通了。
第二个坑是华为子接口的arp broadcast enable。一开始只配了dot1q termination vid和IP地址,结果从PC1 ping网关一直超时,但路由器上查看子接口状态又是up的。思科设备上子接口默认就能处理ARP,华为这里却需要显式开启,这也是很多人从思科切华为时不习惯的地方。
第三个坑是回程路由。做双路由器实验时,我配了R1到R2业务网段的静态路由,但R2没有回程路由,从VLAN10 ping远端网段一直丢包。最后用tracert一查,发现请求已经到R2了,但R2不知道怎么回,所有回应都丢了。网络排障时,不仅要看“出去”的路由,还要看“回来”的路由。
第四个坑和策略路由有关。PBR应用在接口后,我一度觉得路由表应该会变,结果路由表一点没变,因为PBR本来就不改路由表,只影响转发。后来养成习惯,只要做了策略路由,就先用display policy-based-route确认匹配次数,再去看实际流量走向。
6.4 高效排查思路
排查多VLAN跨路由组网,我建议严格按二层到三层再到策略的顺序走。第一步看物理链路和VLAN状态,第二步看Trunk放行和PVID,第三步看路由器子接口和ARP,第四步看路由表,第五步才轮到策略路由和ACL。
不要一上来就抓包。抓包能看到现象,但很难直接告诉你配置哪里错了。先看状态、再查配置、最后抓包确认细节,这样效率高很多。尤其是PVID这种隐藏配置,不看display port vlan根本发现不了。
7. 做完这套实验后我最想说的几件事
这次实验做完,我最大的体会是:多VLAN跨路由组网真正难的不是命令,而是理解数据包
