简介:面向网络工程师和MPLS初学者的实验资料,通过静态LSP单向/双向隧道拓扑配置与抓包分析,帮助理解标签添加、交换、移除的完整过程,适用于网络实验、课程设计或认证备考场景。压缩包共11个文件,以工程文件(efz)、拓扑文件(topo/xml)和抓包文件(pcapng)为主,另含拓扑截图,整体仅139KB,便于快速下载和导入模拟器复现实验。已有680人学习下载,资源覆盖静态LSP的入口、中间、出口节点配置要点,以及抓包中查看标签栈、检查错误异常的排查思路,还从里氏替换原则类比静态与动态LSP的替换关系。通过对照抓包文件与拓扑,读者可直观看到单向和双向隧道下标签值的变化,验证ping/traceroute连通性,从而快速掌握静态LSP配置与故障分析的基本方法。
1. 静态LSP:MPLS网络里最朴素也最可靠的转发通道
在动态LDP满天飞的网络里,还在手工敲静态LSP确实有点复古,但等你遇到跨域对接、传输网承载MPLS、或者只是想在自己的实验环境里把标签转发的每个细节看明白时,静态LSP反而是最顺手的工具。这篇要聊的是MPLS静态LSP隧道的拓扑配置和抓包验证:从三个节点的角色划分、标签怎么一层层接好,到华为设备上一条条命令落地,再到用Wireshark把0x8847的报文拆开看标签栈。全程不需要动态协议参与,数据面怎么走完全由你手写的那张表决定——这也是静态LSP最吸引人的地方:可控、可预期、出错也好查。适合刚接触MPLS的网工,也适合给已有动态LSP网络做路径强控的人参考。
2. 把拓扑先规划好:三个节点角色和标签分配的计算方法
2.1 三种节点角色:入节点、中间节点、出节点怎么定
静态LSP隧道本质上是一条手工指定的转发路径,路径上的每一台设备扮演三种角色之一。入节点(Ingress)负责为进入隧道的流量压上第一层标签;中间节点(Transit)只做标签交换,收到一个入标签,查表后换成出标签继续转发;出节点(Egress)收到最后一个标签后把它弹出,还原成普通IP报文再交给本地路由表转发。角色划分看起来简单,但规划时有一件事必须先定:这条LSP到底服务哪个目的地址,也就是FEC(转发等价类)。FEC通常写成“目的IP + 掩码”,比如4.4.4.4/32。入节点把所有去往这个网段的流量都引入隧道,中间节点只认标签不认IP,出节点弹出标签后按普通IP路由走。理解这层关系后,你就能解释一个常见现象:为什么中间节点路由表里没有4.4.4.4也能转发——因为标签转发根本不查IP路由表。
先明确角色还有一个实际好处:它能帮你决定每台设备要配的命令类型。入节点用static-lsp ingress,中间节点用static-lsp transit,出节点用static-lsp egress。命令形态完全不同,配错角色剩下的活儿全白干。我一般建议先在纸上把角色画出来,每台设备旁边写上“入/转/出”三个字再动手。这个习惯在只有三台设备的拓扑里看起来多余,一旦扩到五台、六台,角色没定清楚就开始敲命令,后面排错时一定翻车。另一个需要提前定的事情是LSP名字,名字不参与转发,但display mpls lsp输出里全看它,建议按“用途+目标网段”命名,比如 lsp4to4。
2.2 标签怎么编号:in-label、out-label和全局标签空间的约束
静态LSP的核心是手工分配标签,分配规则一句话就能说清:每一台节点都要为这条FEC分配一个入标签(in-label),然后把出标签(out-label)写成下游节点给这个FEC分配的那个入标签。以R1-R2-R3-R4四台设备为例,R2给FEC分配的in-label是1024,那么R1的out-label就必须是1024;R3给FEC分配的in-label是1025,那么R2的out-label就必须是1025。这样一层一层接起来,形成一个完整的标签链。入节点ingress不需要in-label,因为它只是压标签方,没人从上游给这个FEC转发报文;出节点egress则必须给FEC分配一个in-label,用来识别“这个标签到我这里就该终结了”。出标签那一栏,出节点可以不写,表示弹出。
编号本身有几个约束要注意。第一,标签值范围是16到1048575,0到15是保留值,其中3是IPv4显式空标签( Explicit NULL),不能当普通标签占用。第二,如果设备上同时跑着LDP或RSVP-TE,动态MPLS默认会从1024往上分配标签,静态LSP再用1024这段很容易冲突。我习惯把静态标签固定在3000到4000这段,留出明显余量。第三,同一台设备上,不同FEC的in-label不能重复,但所有节点的in-label不需要全局唯一——R2的1024和R4的1026各自独立,只要本机内不冲突就行。很多人第一次配置时纠结“这个1024别的设备也用了会不会冲突”,不会,标签是逐跳替换的,局部有意义,全局无意义。
2.3 一份可以直接照抄的拓扑参数表
下面这套拓扑我用来做过很多次静态LSP演示,也推荐你直接照抄。R1、R2、R3、R4四台路由器,直连链路地址规划如下,每台设备一个LoopBack接口作为LSR ID:
设备角色和IP规划:
| 设备 | 角色 | LoopBack0 | 互联接口与地址 |
|---|---|---|---|
| R1 | Ingress | 1.1.1.1/32 | GE0/0/0: 10.1.12.1/24 |
| R2 | Transit | 2.2.2.2/32 | GE0/0/0: 10.1.12.2/24,GE0/0/1: 10.1.23.2/24 |
| R3 | Transit | 3.3.3.3/32 | GE0/0/0: 10.1.23.3/24,GE0/0/1: 10.1.34.3/24 |
| R4 | Egress | 4.4.4.4/32 | GE0/0/0: 10.1.34.4/24 |
FEC选R4的LoopBack地址4.4.4.4/32,意思是R1发往4.4.4.4的流量全部走这条静态LSP。标签链按上一节的规则手写如下,配置时严格对着这张表填:
| 节点 | 角色 | in-label | out-label | 下一跳与出接口 |
|---|---|---|---|---|
| R1 | Ingress | 无 | 1024 | 10.1.12.2,GE0/0/0 |
| R2 | Transit | 1024 | 1025 | 10.1.23.3,GE0/0/1 |
| R3 | Transit | 1025 | 1026 | 10.1.34.4,GE0/0/1 |
| R4 | Egress | 1026 | 弹出 | 本地转发 |
这张表就是整个配置的灵魂。后面第四章的命令,本质上是把这张表翻译成命令行。排错时拿display mpls lsp的输出跟这张表比对,哪一跳对不上,问题就出在哪台设备上。下一节开始讲基础配置,先让设备之间能通信、MPLS能跑起来。
3. 基础配置:接口IP、LSR ID与MPLS使能
3.1 接口IP与LoopBack:LSR ID决定MPLS标识
静态LSP看起来可以不依赖路由协议,但前提是设备之间的链路层和IP层必须通。第一步先把所有互联接口配上IP地址,LoopBack0也一并配好。LoopBack接口除了作为Telnet/SSH管理地址,还有更关键的用途:成为LSR ID。华为设备上LSR ID的推荐做法是取LoopBack0的地址,因为LoopBack接口物理上永不down,用它做设备标识最稳定。配置命令很简单,以R2为例:
system-view sysname R2 interface LoopBack0 ip address 2.2.2.2 255.255.255.255 interface GigabitEthernet0/0/0 ip address 10.1.12.2 255.255.255.255 interface GigabitEthernet0/0/1 ip address 10.1.23.2 255.255.255.255每台设备都按这个思路配,注意掩码用32位保证LoopBack在路由协议里以主机路由形式出现,互联接口用24位。这一步不涉及MPLS,但它的作用很实在:后面display mpls lsp输出里的Ingress/Transit/Egress列显示的是LSR ID,如果LoopBack没配或地址对不上,排查时很难分清“这条LSP到底配在哪台设备上”。配好接口后先在每台设备上ping一下直连对端地址,确认物理链路和IP没毛病再往下走。这一步跳过直接配MPLS,后面出了问题你会分不清是链路问题还是标签问题,等于给自己埋雷。
3.2 MPLS全局使能:lsr-id和接口使能一条都不能少
MPLS在华为设备上需要两层使能。第一层是全局使能,进入MPLS视图配置lsr-id;第二层是在参与标签转发的接口上使能MPLS。第二层最容易漏,尤其是transit节点的两个接口:收到的报文带标签要解封装,转发的报文要再压标签,所以入接口和出接口都必须使能。R2的完整MPLS配置如下:
mpls lsr-id 2.2.2.2 # interface GigabitEthernet0/0/0 mpls # interface GigabitEthernet0/0/1 mpls对应地,R1的GE0/0/0、R3的GE0/0/0和GE0/0/1、R4的GE0/0/0都要执行mpls命令。全局视图里lsr-id一定要配,不配的话MPLS进程起不来,静态LSP命令会直接被拒绝。很多新手在这个环节翻车:全局使能了,接口也敲了mpls,但漏了lsr-id,结果display mpls lsp一片空白。如果你用的是较新版本设备,有些版本在使能MPLS时会检查lsr-id合法性,LoopBack还没配好就写lsr-id会报错。所以上一节先配LoopBack再回来配MPLS,这个顺序本身就是一种规避踩坑的手段。
接口使能MPLS这一步对静态LSP的意义和动态LDP不完全一样。动态LDP需要在这条链路上建立邻居,静态LSP不建邻居,但接口使能后设备才具备处理MPLS报文的转发表项能力。另外提醒一句:transit节点如果只在一个接口使能了MPLS,另一个没使能,标签报文到达时会因为查不到MPLS处理能力而被丢弃,表现为LSP状态Up但数据不通。这是静态LSP排错里最常被忽视的原因之一。
3.3 路由怎么打通:静态路由还是OSPF,以及一个边界
很多人第一次搭静态LSP时很自然地以为“静态隧道不需要路由协议”,这句话只对了一半。中间节点的标签转发确实不查IP路由,但有两个位置仍然依赖传统路由表。第一个位置是入节点R1:它要把IP报文压上标签,华为设备处理时仍然要查路由表判断“这个目的地址属于哪条LSP”,所以R1必须知道怎么到达4.4.4.4。第二个位置是出节点R4:标签弹出后变成普通IP报文,R4要查自己的路由表把报文送到本地或下一跳。中间节点R2和R3如果没有4.4.4.4的路由其实不影响标签转发,但为了排错方便,我一般建议整网把路由打通。
路由怎么做?两种常见选择:全网跑OSPF,或者只在边界写静态路由。实验室拓扑小,跑OSPF最省事,配置也简单:
ospf 1 router-id 2.2.2.2 area 0.0.0.0 network 10.1.12.0 0.0.0.255 network 10.1.23.0 0.0.0.255 network 2.2.2.2 0.0.0.0四台设备都进OSPF area 0,把LoopBack和互联网段都宣告进去,路由表立刻全通。只配静态路由也可以,R1写一条ip route-static 4.4.4.4 255.255.255.255 10.1.12.2,R4写一条回程路由,中间节点不写也能转发。我自己的取舍是:如果练手拓扑就三台设备,静态路由够用;如果打算之后在这个拓扑上叠加伪线业务或者模拟更复杂的汇聚场景,OSPF更接近现网。这里有一个边界值得记住:静态LSP只保证“转发面”是手工可控的,控制面(路由表)仍然是传统路由协议的地盘,两者不能混为一谈。
4. 静态LSP的三段配置:ingress、transit、egress命令与检查
4.1 出节点先配:static-lsp egress和标签终结
配置静态LSP有个天然的顺序依赖:下游节点先给FEC分配in-label,上游节点的out-label才能指向它。所以实操时我永远从出节点R4开始配,一路倒推到入节点。R4的配置如下:
system-view static-lsp egress lsp4to4 destination 4.4.4.4 32这行命令的意思是为FEC 4.4.4.4/32创建一条名为lsp4to4的出节点LSP。注意出节点不需要写in-label,因为in-label已经隐含在命令里了?实际上华为AR设备上static-lsp egress命令会自动为这条LSP分配一个动态标签,不用手工指定。但这个行为在不同版本上有差异,有些版本允许你指定in-label,有些版本让你不写。更稳妥的做法是配完后执行display mpls lsp查看R4实际分配出来的in-label,再把这个值填到上游R3的out-label里。这句话很关键:你不是凭想象定标签,而是以下游设备实际显示的标签为准。
这里有一个关于显式空标签的细节。如果你希望数据面做得更干净,可以让出节点为这条FEC使用PHP(倒数第二跳弹出)特性,也就是R3直接弹出标签再交给R4。华为设备的静态LSP实现里,transit节点可以配置out-label 0表示弹出,这样R4只收IP报文,不带任何标签。采用PHP方案的话,R4的egress配置仍然保留,但R3的out-label直接写0。两种方案都合法,区别在于抓包时R4入接口能不能看到MPLS标签。我建议实验阶段不要用PHP,让标签完整走到R4再弹出,这样你在抓包里能把整条标签链看得明明白白。
4.2 中间节点配置:static-lsp transit的in/out对应关系
R3和R2都是transit节点,配置格式完全一样,只是参数不同。先看R3:
system-view static-lsp transit lsp4to4 destination 4.4.4.4 32 incoming-interface GigabitEthernet0/0/0 in-label 1025 nexthop 10.1.34.4 outgoing-interface GigabitEthernet0/0/1 out-label 1026逐段解释这条命令。incoming-interface GigabitEthernet0/0/0指定带标签的报文从哪个接口进来,in-label 1025是R3本机为这条FEC分配的入标签,也就是R2必须发送给R3的标签值。nexthop 10.1.34.4 outgoing-interface GigabitEthernet0/0/1指明转发方向,out-label 1026是R3要压到报文上的新标签。这里1026不是R3自己随便编的,它是上一小节里R4那个static-lsp egress实际分配给这条LSP的in-label。先查R4再填R3,这个顺序能让手写标签表和实际转发表完全对齐。
R2的transit配置同理,只换接口、nexthop和标签:
system-view static-lsp transit lsp4to4 destination 4.4.4.4 32 incoming-interface GigabitEthernet0/0/0 in-label 1024 nexthop 10.1.23.3 outgoing-interface GigabitEthernet0/0/1 out-label 1025R2的in-label 1024必须等于R1将来压的标签,R2的out-label 1025必须等于R3的in-label 1025。三个节点凑齐后,这条标签链就是:1024 → 1025 → 1026 → 弹出。每一步的对应关系,正是第二章那张手写表的转译。配transit时最容易犯的错是in-label和out-label写反,或者nexthop写错。建议每配完一台设备立即display mpls lsp检查本机的in/out标签,不等全部配完再回头差。
4.3 入节点配置:static-lsp ingress与压入首层标签
最后配R1的ingress:
system-view static-lsp ingress lsp4to4 destination 4.4.4.4 32 nexthop 10.1.12.2 outgoing-interface GigabitEthernet0/0/0 out-label 1024关键点是out-label 1024,这个值必须等于R2的in-label 1024。ingress不需要写in-label,因为没有上游设备会向R1转发这条FEC的标签报文;它只需要知道“往4.4.4.4的流量,压上标签1024,从GE0/0/0发给10.1.12.2”。nexthop和outgoing-interface建议都写清楚,尤其当R1上有多条等价路由时,不写nexthop的话设备可能选到错误的出口。写完nexthop和outgoing-interface后,R1查4.4.4.4路由表时会把匹配流量导进这条LSP。
到这里三个角色全部配置完成。整理一下配置逻辑:R4定义终点并分配in-label,R3和R2定义中间交换并分配各自的in-label,R1定义入口并压入标签。这些命令里出现的每一个标签值都应该能在下游设备的display mpls lsp输出里找到对应关系。如果配置时完全不看下游实际值而自己拍脑袋编号,大概率要重敲一遍。我习惯把第二章的手写标签表打印出来放在旁边,配完一个节点就打个勾,标签链对不齐时一眼就能定位到断点。
4.4 配置后的检查:display命令和ping验证
全部配置完成后,依次执行三条检查命令。首先是全局视图下的LSP状态查看:
display mpls lsp输出会列出所有LSP的Name、FEC、In/Out Label、Interface和State。正常状态下这条4.4.4.4/32的LSP应该是四行,分别对应R1到R4,且相邻设备的out-label和in-label严格衔接。如果某一行State显示Down,优先检查那台设备的接口是否使能了MPLS、in-label是否跟上游out-label对上。想看更细的信息用扩展参数:
display mpls lsp verbose这条命令会显示每台设备的LSR ID、以及更多转发细节,排错时比普通视图更有用。接着在R1上验证数据面是否真正打通:
ping mpls ipv4 4.4.4.4 32这条命令会构造一个带标签的MPLS Echo Request报文,沿着静态LSP到达R4再返回,返回的内容能直接告诉你每一跳的转发是否成功。如果display mpls lsp显示Up,但ping mpls不通,说明控制面表项存在但数据面有问题,重点查出接口封装、标签值、nexthop是否正确。也可以用tracert mpls ipv4 4.4.4.4 32逐跳定位断点,它会显示每一跳的LSR ID和耗时,断在哪一跳一目了然。
5. 避坑排查:静态LSP配置与抓包验证中的5类翻车现场
5.1 LSP状态Up但数据不通:问题多半在标签链的衔接处
现象:display mpls lsp所有节点State都是Up,R1上ping mpls ipv4 4.4.4.4 32却超时,普通IP ping直接通。
原因:数据面转发表正常安装,但相邻节点之间的out-label和in-label对不上。常见有两种情况:一是R2配的out-label写成了1024而不是1025,报文发给R3后R3查不到in-label 1024对应的表项,直接丢弃;二是nexthop写错,比如R3的nexthop写成了10.1.23.3而不是10.1.34.4,报文被送回R2形成环路。
解决:按第二章的手写标签表逐跳比display mpls lsp的输出,重点核对R1-out vs R2-in、R2-out vs R3-in、R3-out vs R4-in这三对对应关系。哪一对不一致,改哪里。nexthop也一并核对,确保每跳的下一跳地址就是物理直连对端。
5.2 配置命令被系统拒绝:lsr-id没配或标签范围踩了保留区
现象:敲static-lsp transit或static-lsp ingress时系统提示错误,命令敲不进去,或者提示label值不合法。
原因:一是MPLS全局视图下的lsr-id没配置,MPLS进程未真正启动,静态LSP命令没有承载主体;二是手工分配的in-label落到了保留范围或已被动态协议占用。华为设备标签0到15是保留值,且如果同时启用了LDP,LDP默认从1024开始动态分配,你手写的in-label如果和LDP已分配的标签撞车,同样会报错。
解决:先在MPLS视图配好lsr-id,再执行display mpls label查看当前设备上标签占用情况,避开已占用段。我建议静态LSP专用3000到4000段,既躲开LDP的动态范围,也方便抓包时一眼识别出这是手工隧道。
5.3 抓包看不到MPLS标签:抓包位置和接口使能两个关键点
现象:在R1或R2的接口上抓包,捕获的全是普通IP报文,看不到0x8847开头的MPLS报文。
原因:最常见的是抓包位置选错了——抓到了LSP范围之外,比如在R4的出口抓,标签已经被弹出只剩IP;第二种可能是入接口没使能MPLS,R1实际没走LSP而是直接IP转发;第三种是抓包工具或系统没开启MPLS解码,报文确实带标签但Wireshark显示成了未知协议。
解决:先把抓包点放到R1的出接口或R2的入接口,这两个位置一定能看到MPLS报文。检查对应接口下有没有mpls命令。Wireshark侧在Preferences → Protocols里启用MPLS解析,或者在报文上右键Decode As选择MPLS。确认以太网类型是0x8847,这是MPLS单播报文的标准标识。
5.4 静态LSP与动态LDP抢标签:FEC重叠引发路由黑洞
现象:同一台设备上跑着LDP,静态LSP配完后,某些目的地址的流量有时走LSP有时走普通IP,甚至直接不通。
原因:LDP为同一个FEC也建立了动态LSP,设备上同时存在两条目的相同、来源不同的LSP。华为设备对静态和动态LSP的优先级处理有既定规则:通常静态LSP优先,但如果静态LSP的vpn-instance、隧道策略等参数配置不当,动态LSP可能覆盖掉静态条目,导致数据面选路异常。
解决:两条路可选。一是彻底停掉这条链路相关接口上的LDP,只保留静态LSP,最简单最干净;二是如果必须共存,检查display mpls lsp里同一条FEC是否有两条记录,确认静态LSP的优先级更高。实验环境我推荐直接不跑LDP,避免任何干扰。
5.5 Wireshark提示“Unknown”或MPLS解析异常:版本和偏好设置问题
现象:抓到0x8847报文,但Wireshark的协议列显示为Unknown,展开看不到MPLS标签栈。
原因:Wireshark默认对MPLS的支持是开启的,但部分精简版或旧版本可能没启用;另外如果报文封装了多层标签(比如后面叠加伪线场景),Wireshark的默认解码深度可能不足。
解决:打开Preferences → Protocols → MPLS,确认Enable MPLS dissection勾选;叠加多层标签时勾选“Force skipping the label stack”,然后设置一个足够大的标签栈深度。抓包完后建议先确认一下报文的长度信息,如果MPLS报文被抓成了截断包,标签栈后半段解析不出来也属于正常现象,重新抓包时把抓包长度调到全包捕获。
6. 抓包验证:用Wireshark确认标签栈和跳间行为
6.1 在R2两个接口同时抓包,对比标签值变化
静态LSP配置完成且ping mpls通过后,建议做一次完整的抓包验证。最推荐的做法是在R2的GE0/0/0和GE0/0/1两个接口上同时抓包,用Wireshark分别标记为“入方向”和“出方向”。在R1上发起去往4.4.4.4的ping,两个抓包文件会各抓到一组MPLS报文。对比两张图的标签栈:
| 抓包位置 | 期望看到的标签栈 | 说明 |
|---|---|---|
| R2 GE0/0/0(入方向) | Label: 1024, S=1 | R1压入的标签,栈底位置S位为1 |
| R2 GE0/0/1(出方向) | Label: 1025, S=1 | R2完成标签交换,值从1024换成1025 |
| R3 GE0/0/1(出方向) | Label: 1026, S=1 | R3继续替换,最终到R4 |
这个对比能直观验证静态LSP的逐跳替换行为:入方向和出方向的IP头完全一样,只有标签值变了。检查TTL时还能看到每跳递减1。借助Wireshark的MPLS解析,展开标签能看到Label Value、Traffic Class、Bottom of Stack和TTL四个字段。S位为1说明是栈底,单层静态LSP一定看到S=1;如果将来在静态LSP之上封装伪线业务或三层专线场景,会出现多层标签,这时S=1的一定是最内层。
我自己的习惯是抓完包后顺手存一份pcap留档,因为静态LSP排错时经常要跟前一天、前一周的抓包做对比。有一次我在R3的出接口抓包,发现没有标签只剩IP,当时差点怀疑配置被哪台设备改了,后来才意识到R3已经在做PHP弹出,出接口本来就不该有标签。从那以后我抓包前先看一眼拓扑图上每台节点的角色定位,再决定抓包点放在哪里。这个动作能省一半排错时间,希望帮到你。
本文还有配套的精品资源,点击获取