ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MPLS静态LSP配置与抓包验证:从零搭建三路由实验

MPLS静态LSP配置与抓包验证:从零搭建三路由实验 简介MPLS静态LSP隧道拓扑配置及抓包资源面向网络工程师与MPLS学习者用于解决静态标签交换路径配置验证和抓包分析需求。包内共11个文件涵盖eNSP模拟器所需的flash/efz设备镜像、topo拓扑文件、PC的xml配置文件以及静态LSP双向隧道和单向隧道抓包的pcapng数据包文件并附有拓扑截图整体仅139KB轻量易用。已有679人学习下载。资料以实际拓扑为基础帮助读者完成入口、中间、出口节点的标签配置并通过抓包观察标签栈的添加、交换与移除过程同时结合描述中提到的“里氏替换原则”理解静态LSP作为动态LSP的一种可控替代形式在特定场景下可无缝替换而不影响网络功能。适合需要快速搭建实验环境、加深MPLS转发机制理解的中高级网络学习者。1. 先别急着上动态协议静态LSP在现网里到底解决什么问题MPLS静态LSP隧道听起来像是只在教科书里出现的古董配置但实际在现网里它的出镜率远比想象中高。尤其是运营商接入层、企业骨干网和政企专线场景很多网络至今仍然跑着静态LSP理由就三个字可控、稳、排查快。所谓静态LSP就是不跑LDP或RSVP-TE而是由人工在每一台路由器上手工指定标签的转发路径——入节点压入什么标签、中间节点换成什么标签、出节点怎么弹栈全部写死在配置里。它没有邻居发现、没有状态机、没有会话协商也就不存在协议震荡和邻居掉线的问题。只要物理链路是通的隧道就是通的。这篇文章要做的不是跟你说MPLS原理多高深而是从一张三台路由器的拓扑图出发手把手把静态LSP的配置、转发逻辑和抓包验证全过程过一遍。适合正在准备网络认证、刚接手MPLS网络的运维以及想搞明白MPLS数据面到底是怎么转发的朋友。读完之后你能独立复现这套拓扑并且能解释每一个字段的含义——这是动态协议给不了的能力也是静态LSP最值得投入时间去搞懂的地方。2. 静态LSP的技术底座转发等价类、标签动作和PHP2.1 静态LSP的三层角色Ingress、Transit、Egress在配置之前先把静态LSP里的三个角色搞明白。无论你用哪家设备MPLS静态隧道在转发面上都遵循同样的角色划分Ingress入节点收到普通IP报文后根据FEC转发等价类分类查找到对应的隧道压入一层MPLS标签沿着隧道下一跳转发。Transit中间节点只认标签不认IP收到带标签的报文后查标签转发表把外层标签替换成新标签继续往下送。Egress出节点收到带标签的报文后弹出标签把它当作普通IP报文转发到最终的出口。如果启用了PHP倒数第二跳弹出Egress的负担会大大降低。静态LSP的核心特征就是这三个角色的标签映射关系全部由手工指定没有任何协议来保证它们之间的一致性。所以配置错误的常见现象就是——隧道看起来是UP的但业务不通因为中间的标签对不上。搭实验的时候先确认设备是否支持全局使能MPLS华为设备是mpls lsr-idmpls思科设备是mpls ip或mpls label protocol不同厂商命令差异大但不影响转发逻辑。2.2 静态LSP和动态LSP的本质差异动态LSPLDP的粒度更细它能感知路由表的变化自动为每个FEC建立标签绑定关系静态LSP则相反它不会因为路由协议的变化而自动修正标签路径。差异最明显的地方有四个维度静态LSPLDP动态LSP参考对比标签分配手工指定协议自动协商故障收敛全靠人肉排查无感知秒级收敛运维复杂度配置量大但逻辑透明配置量少但黑匣子适用场景固定承载路径、专线接入大型网络、拓扑频繁变更静态LSP并不是用来替代动态协议的它是用来兜底和承载关键业务的。很多人把它理解成MPLS的入门实验实际上它更接近一种工程手段——在不需要动态协议介入、也不希望拓扑变化影响路径的场合手工钉死一条路。2.3 标签动作Push、Swap、Pop到底在做什么MPLS标签位于二层帧头和三层IP头之间一共4个字节。静态LSP的配置过程本质就是在每台路由器上声明针对某个入标签或某条FEC我要执行哪个动作。三个动作对应三个角色Push在IP头前加一层标签。这是Ingress专属动作标签值由你手工指定的出标签决定。Swap把进来的标签替换成出标签。这是Transit的常规行为也就是说进来的标签值不等于出去的标签值。Pop弹出顶层标签。Egress收到后弹出标签如果下面没有别的标签就直接交给IP协议栈处理。这里有一个容易忽略但很关键的点华为设备的PHP实现方式是隐式空标签Implicit NULL标签值是3。也就是说倒数第二跳弹出标签后转发给Egress的报文看起来就是一个普通IP报文。这会在抓包阶段产生歧义后面会专门讲。配置静态LSP时如果中间有多台设备每一台的入标签和出标签必须完全对齐否则转发必断。3. 三台路由器跑通静态LSP最小拓扑配置与验证命令3.1 拓扑规划与IP编址搭建实验拓扑不需要虚拟化软件华为eNSP或H3C HCL都可以。我用的是三台路由器接法很简单R1连R2R2连R3R1和R3之间没有直连链路。关键是需要让R1能通过OSPF或静态路由学到R3的环回口但业务转发路径必须强制走MPLS隧道。这样的拓扑设计是有讲究的既有IGP路由保证网络层可达又通过MPLS隧道把数据包框进标签转发路径。你才能同时对比“如果没写MPLS配置数据包走什么路”和“写了MPLS配置后数据包走什么路”。具体的编址如下R1GigabitEthernet0/0/0 10.0.12.1/24LoopBack0 1.1.1.1/32R2GigabitEthernet0/0/0 10.0.12.2/24GigabitEthernet0/0/1 10.0.23.2/24LoopBack0 2.2.2.2/32R3GigabitEthernet0/0/1 10.0.23.3/24LoopBack0 3.3.3.3/32这个拓扑不复杂但足够展示静态LSP的完整生命周期。配置顺序我建议按“IGP路由 → MPLS全局 → 静态LSP”来避免在排查时分不清是路由问题还是标签问题。3.2 全局MPLS使能与LSR-ID配置MPLS运行的前提是每台路由器有一个全局唯一的LSR-ID一般直接用LoopBack接口地址。先把三台设备的MPLS底座打好下面是R1的完整配置R2和R3同理替换地址即可# R1 全局MPLS使能 mpls lsr-id 1.1.1.1 mpls先说逻辑mpls lsr-id是本机的MPLS路由器标识后续所有LSP相关的应用都会引用这个ID。mpls是全局使能MPLS特性的命令两个命令缺一不可。参数说明LSR-ID必须是一个设备上真实存在的接口地址且能被其他设备路由可达。这里选LoopBack0是因为它物理上不会down稳定性最好。如果后续要跑LDPLSR-ID选错了直接导致会话建立失败虽然静态LSP不依赖LSR-ID做邻居协商但请保管好它很多查错命令会用到。注意接口上也要使能MPLS能力华为设备是mpls命令思科设备是mpls ip。很多人配了全局MPLS但没在接口上使能结果隧道就是不工作。3.3 静态LSP配置一路压标签、一路换标签、一路弹标签静态LSP的配置是整篇的重头戏直接看R1、R2、R3的三段配置。R1作为Ingress它的任务是识别去往3.3.3.3的IP报文压上标签100# R1 Ingress节点配置 interface GigabitEthernet0/0/0 mpls ip address 10.0.12.1 255.255.255.0 static-lsp ingress LSP1 destination 3.3.3.3 32 nexthop 10.0.12.2 out-label 100R2作为Transit它收到标签100的报文换成标签200后发给R3# R2 Transit节点配置 interface GigabitEthernet0/0/0 mpls ip address 10.0.12.2 255.255.255.0 interface GigabitEthernet0/0/1 mpls ip address 10.0.23.2 255.255.255.0 static-lsp transit LSP1 in-label 100 nexthop 10.0.23.3 out-label 200R3作为Egress它只需要声明自己是对应隧道的目的端# R3 Egress节点配置 interface GigabitEthernet0/0/1 mpls ip address 10.0.23.3 255.255.255.0 static-lsp egress LSP1 in-label 200三段配置的逻辑关系是这样的R1说“去3.3.3.3的报文打上100给10.0.12.2”R2说“收到100就换成200给10.0.23.3”R3说“收到200就说明到隧道终点了直接弹栈走IP转发”。三层必须环环相扣任何一个标签对不上数据包就会在中间节点被丢弃。参数说明destination后面跟的是目的IP和掩码长度它定义了这条LSP服务哪些流量也就是FECin-label是入标签out-label是出标签nexthop必须是直连下一跳的地址不能写非直连地址。华为设备的静态LSP名称 LSP1 在每台设备上定义的是同一条隧道的不同区段名称建议保持一致方便后续查错。3.4 验证隧道状态能Ping通不代表隧道正常配置完成后先看隧道是否建立成功用这条命令# 在R1上查看静态LSP状态 display mpls static-lsp verbose正常输出里每一台设备的LSP状态都应该是Up。然后从R1 Ping R3的LoopBack地址ping 3.3.3.3这里有个辨识误区要特别强调Ping通只能说明三层路由可达不能证明流量走了MPLS隧道。因为IGP路由已经把去往3.3.3.3的路径算出来了即使MPLS配置有误数据包照样能过去。要验证流量真的被标签承载必须抓包看MPLS头或者用tracert观察路径上是否出现了标签信息。4. 抓包验证数据面MPLS头长什么样怎么证明流量走了隧道4.1 用Wireshark在R1和R2之间抓到MPLS封装抓包是整个实验的收官步骤。在R1和R2之间的链路上抓包可以抓到R1发给R2的报文。真实设备需要端口镜像eNSP里可以直接在接口上抓包或者用Wireshark抓虚拟网卡。抓到的MPLS报文在Wireshark里会显示为MultiProtocol Label Switching Header展开后关键字段如下MPLS Label20位0x000064也就是十进制100对应R1配置的out-label。EXP3位用于QoS分类这里默认是0。S1位置1表示这是栈底标签因为这里只有一层标签。TTL8位MPLS TTL初始值和IP TTL有关每经过一跳减1。如果你在R2和R3之间的链路上再抓一次包就会看到Label字段变成了200而R1到R2这段看到的是100。这就是Swap动作的直接证据标签值变了但报文的五元组没变。验证二层帧格式也是必要的。Wireshark里MPLS头部的EtherType显示为0x8847这是单播MPLS的以太网类型。如果看到0x8848那是组播MPLS静态LSP基本用不到。抓包的时候如果只看到IP报文、没有MPLS头说明流量压根没进隧道。先查FEC匹配条件再查接口的mpls使能状态。4.2 用tracert观察MPLS路径确认逐跳行为Ping通不够抓包又不方便的时候可以用tracert做快速判定。华为设备支持MPLS感知的tracert命令是tracert mpls ipv4 3.3.3.3 32正常情况会显示3.3.3.3的转发路径并且每一跳会带上标签信息。如果这条命令不支持退而求其次用普通tracerttracert 3.3.3.3普通tracert能看到的就是每一跳的IP地址。注意一个细节第2跳或者第3跳的出接口地址R2和R3之间的那条链路地址会暴露出来证明报文确实按物理拓扑走了。如果显示第1跳直接到R3说明报文没有经过R2的二层转发那必然是路由绕行了。4.3 捕获tcpdump在Linux环境下的MPLS分析要点实验不只有模拟器真实网络里用Linux服务器做接入时tcpdump是更常用的抓包工具。静态LSP隧道经过Linux内核转发时需要内核支持MPLS且tcpdump要能解析MPLS协议tcpdump -i eth1 -nn -vvv mpls抓到的包如果显示MPLS (label: 100, exp: 0, [S], ttl: 63)说明报文已经打上了标签。如果等价类匹配了多条LSPtcpdump过滤时可以用具体的标签值缩小范围tcpdump -i eth1 -nn -vvv mpls 100逻辑说明与参数说明-nn表示不做IP和端口反向解析加快输出-vvv输出详细协议信息MPLS头细节会完整展开。过滤条件mpls 100在tcpdump里表示匹配标签值为100的MPLS报文。这个过滤在定位“为什么某条特定LSP的报文丢了”时很有用——如果tcpdump在应该出现标签100的接口上抓不到任何包说明问题出在上游的FEC匹配而不是标签转发。注意tcpdump匹配MPLS标签是在BPF层面支持的但老版本可能不支持mpls 100这种写法会用mpls[0] 0xfff0 640这种偏移量写法代替。遇到语法报错时先tcpdump -V查版本。5. 静态LSP避坑配置能通但业务不通的4个典型翻车点5.1 坑一Ingress配置了隧道但FEC没匹配上业务流量现象display mpls static-lsp状态是Up从R1 Ping R3能通但从R1后面的PC访问R3后面的业务系统不通。原因静态LSP的Ingress配置里destination定义的是FEC匹配条件。如果你配的是destination 3.3.3.3 32那只有目的地址精确为3.3.3.3的报文才会被压标签。PC网段是192.168.1.0/24去往R3后面业务网段192.168.3.0/24的流量根本不在FEC范围内直接走了IP路由。解决把Ingress的destination改成业务网段或者增加一条对应的静态LSP。检查一下PC访问的目标地址把它和static-lsp ingress里的destination字段对齐。宁可多建几条LSP也不要为了省事写成destination 0.0.0.0 0当然这是命令语法上禁止的或者试图用一条默认LSP覆盖所有流量——静态配置逐条写明才是可控的根本。5.2 坑二中间节点label对不上报文被静默丢弃现象R1上display mpls lsp verbose显示LSP正常但从R1抓包能看到带标签的报文发出来了R2和R3之间的链路却抓不到任何数据。原因R2的in-label配置和R1的out-label不一致。比如R1发的标签是100但R2的静态LSP写的是in-label 200R2查自己的标签转发表发现没有200这个入标签直接把报文丢弃了。MPLS转发是严格按照入标签查找的多1、少1都不行——标签值对不上就是黑匣子只能一个个接口抓包定位。解决把三台设备的配置拉出来对比确认R1 out-label R2 in-labelR2 out-label R3 in-label。这是个体力活也是静态LSP运维的必修课。建议养成写配置标注的习惯每台设备上把上游标签、下游标签写成注释防止后面遗忘。5.3 坑三Egress启用了PHP导致抓包看不到最后一跳的标签现象在R2到R3的链路上抓包去往3.3.3.3的报文能看到MPLS标签200但是到了R3的入接口标签没了变成了纯IP报文。原因华为设备默认对Egress分配隐式空标签Implicit NULL标签值3意思就是让倒数第二跳R2直接弹出标签再转发。这是MPLS的默认优化减少了Egress查标签转发表的负担。很多人在最后一跳抓包找不到标签以为自己配置错了实际上设备工作一切正常。解决不需要解决。理解PHP机制后验证方式要跟着调整如果你想在Egress上看到完整的标签交换过程需要在R3上配置显式空标签Explicit NULL标签值0华为命令是mpls label advertise explicit-null。但这会改变转发行为建议只在实验验证时临时使用生产环境保持默认PHP。5.4 坑四TTL处理不当导致tracert路径显示不全现象tracert 3.3.3.3时中间设备的IP地址显示不出来直接一步跳到目的地址。原因MPLS报文的TTL有两种处理模式——统一模式Uniform和管道模式Pipe。默认情况下MPLS TTL和IP TTL是联动的正常tracert能显示每一跳。但有些设备配置了隐藏TTL或管道模式导致中间节点不回ICMP超时消息。解决在trcert时不依赖TTL显示的路径改用抓包确认实际转发路径。或者查设备是否开启了MPLS TTL的隐藏特性华为设备相关命令是mpls ttl-mode相关配置。需要注意凡是涉及TTL变化的位置抓包时都容易出现字段不一致不要误判为转发异常。6. 进阶用法用抓包逆向验证MPLS隧道三段标签行为静态LSP的验证如果只停留在display和ping你始终是在黑匣子外面猜。一个比较顺手的方式是在三个关键位置各抓一次包把标签的整个生命周期完整记录串起来看这样任何异常都能精准定位到节点。位置AR1出接口应该抓到Label100、S1、TTL从255或64开始递减的报文。位置BR2出接口应该抓到Label200、S1、TTL比位置A少1的报文。位置CR3入接口如果默认PHP抓到的是普通IP报文如果显式空标签会看到Label0。把三个位置的抓包时间对齐后你会发现一个有趣的事实IP头完全没变过变的只是外面那层标签。这就是MPLS隧道和IP隧道比如GRE最大的区别——MPLS在帧头和IP头之间插入的是标签栈不影响原始IP报文内容而GRE会把整个IP报文包成新IP报文的外层头。在验证时有几个小技巧可以避免无效操作用Wireshark的显示过滤器mpls.label 100可以直接过滤出某条LSP的报文。标签栈有多层时mpls.s 0表示非栈底mpls.s 1表示栈底展开层叠字段可以逐一拆解。如果你用的是抓包文件而不是实时抓包先确认抓包时间跨度和LSP配置变更时间有没有重叠——这个坑我踩过改完配置后忘了重新抓包对着老文件分析了半天白费力气。提示在企业网络里做MPLS实验别一开始就上多厂商设备混合组网。华为和思科的静态LSP命令语法差异很大入标签的分配方向也有区别先用同厂商设备跑通逻辑再考虑异构互通。最后说一个我自己的习惯每次配置完静态LSP都会在每台路由器上把display mpls lsp verbose的输出存一份文本和配置文件放在同一个目录。出了故障直接对比文本找差异比上设备一条条敲命令快得多。这种手动留存快照的方式在动态LSP时代已经没有意义了但在静态LSP的世界里配置即真理快照即证据。希望这份记录能帮你在自己搭的拓扑里少走点弯路。本文还有配套的精品资源点击获取
返回列表