华为设备静态LSP配置详解:从转发原理到验证排错
搞网络的兄弟应该都见过这个场景业务侧把需求提过来要让两个机房之间走MPLS隧道一看网络拓扑就三台设备协议配置也不想搞得那么重LDP、IGP联动、自动收敛统统不要这个时候最直接的办法就是手工把LSP一条一条敲出来。今天这篇文章就以华为设备为例把静态LSP的建立过程完整讲一遍从转发原理到每一跳的命令再到验证和排错整个流程都给你梳理清楚。这个过程适合刚接触MPLS的新手也适合平时广域网交付、偶尔需要手动建隧道的网络工程师收藏备用。1. 静态LSP到底是什么以及它的适用场景1.1 MPLS转发原理短时间内说清楚理解静态LSP之前得先把MPLS转发这件事说透。MPLS的核心动作可以概括成九个字贴标签、换标签、撕标签。数据包到达Ingress节点之后不再像传统IP网络那样通过最长匹配查路由表决定下一跳而是根据FEC转发等价类打上一层标签然后沿着一条已经规划好的路径往前走。中间设备收到带标签的报文直接查标签转发表把顶层的入标签换成出标签再发给下一跳。到了Egress节点把标签弹出恢复成普通IP报文再按路由把数据送出去。你可以把LSP理解成一条画好的快递线路A地发出的每个包裹在每一个中转站点都只看包裹上的单号按单号往下传不看包裹里装的具体是什么。中间站点不需要知道货物是谁发的、送到谁手上只看单号就够了。MPLS技术几个基础概念必须记牢FEC一组具有相同转发属性的报文集合通常按目的IP前缀来划分。LSP标签交换路径指同一FEC的报文从Ingress到Egress经过的完整路径。Ingress/Transit/Egress入节点、中间节点、出节点三个角色的配置内容完全不同。这些概念在配置静态LSP时一个都跑不掉别嫌基础后面所有命令都是围绕这三个角色展开的。1.2 静态LSP和动态LSP的差异动态LSP大家听得最多的是LDP标签分发协议。LDP协议会在设备之间自动建立会话、自动交换标签绑定关系最终自动生成完整的LSP。而静态LSP完全反过来标签绑定关系全部由管理员手工指定设备之间不跑任何标签分发协议也不协商任何参数。两种方式的核心区别用一张表就能说清楚对比项静态LSP动态LSP以LDP为例标签建立方式逐跳手工指定协议自动协商分配对IGP的依赖不依赖依赖IGP路由可达故障收敛速度不自动收敛依赖人工干预自动收敛跟随路由变化配置工作量小规模组网很小大规模组网自动完成运维排错需要人工核对每一跳可通过协议状态排查安全性路径可控性强标签分发范围难以完全控制从这个表能看出来静态LSP在灵活性和可控性上有天然优势但代价是故障后不会自己恢复。动态LSP虽然省心却要求底层路由协议必须稳定而且协议状态本身也要占用资源去维护。1.3 为什么现在还有人在用静态LSP很多人会问LDP都这么成熟了为什么还要手工配置静态LSP我在交付现场遇到的真实场景大概有这几类一是组网规模小。比如只有两三个节点、几条业务链路配置静态LSP总共也就几条命令比拉路由协议、等收敛、查状态快得多而且设备资源占用几乎为零。二是设备或链路特殊。有些网络设备本身不支持动态标签协议或者某些特定业务场景不想让动态协议参与只希望指定固定路径转发静态LSP就成了唯一选项。三是对路径控制要求高。动态LSP的路径跟随IGP最短路径想做流量规划往往需要配合其他策略。静态LSP则可以在没有策略干预的情况下直接把流量引到指定节点路由完全掌握在自己手里。四是故障定位简单。LDP出现问题之后要排查邻居关系、标签通告、路由同步等一堆环节静态LSP只有配置和数据面要么通要么不通逐跳排查非常直接。2. 建立静态LSP之前先想清楚这三件事2.1 隧道上每一跳都是什么角色配置静态LSP的第一步不是敲命令而是先分清每一台设备在隧道里扮演什么角色。这是最关键的一步角色分错了后面全乱。Ingress是入口设备。它负责在数据包进入时打上标签所以它必须知道这个LSP承载的是哪些目的地址要往哪个下一跳发打什么标签。简单说Ingress的配置最少需要三个要素目的地址、下一跳、出标签。Transit是中间设备。它不关心最终目的IP是谁只做换标签操作。它需要知道从哪个接口收到带什么标签的报文然后换成什么新标签发给哪个下一跳。所以Transit的配置要素是入接口、入标签、下一跳、出标签。Egress是出口设备。它负责把标签弹掉之后按普通IP路由转发。它只需要知道从哪个接口收到带什么标签的报文然后把标签去掉就行。Egress的配置要素相对简单入接口、入标签。这三个角色在一条LSP上是按数据流向来划分的。同样两台设备之间如果要做双向业务A到B这条路径上A是IngressB是Egress反过来B到A的方向B就变成IngressA变成Egress。角色跟着方向走不能固定死。2.2 标签值怎么规划才能对得上静态LSP标签值需要人工规划并且要考虑标签衔接关系。这个“衔接关系”用一句话总结就是下游设备的入标签必须等于上游设备的出标签。举个例子PE1到PE2建立一条LSP中间经过一台P设备。PE1发出标签100的报文P设备收到标签100之后换成标签200再发出去PE2收到标签200之后弹出标签。那么配置上就应该写成PE1的出标签是100对应P的入标签是100。P的出标签是200对应PE2的入标签是200。这里有个很重要的概念要理解标签值只在单台设备上有本地意义不做全局统一。两台设备完全可以各自使用相同的数值只要局部能对上就行。但站在运维角度我强烈建议整个网络还是统一规划一个区间段比如静态LSP标签全部用1000以上的值一是方便排错时一眼识别二是避免和动态标签区间冲突。标签值还有一些保留规则要注意。标签值0到15在协议层面有特殊意义比如3表示隐式空标签13表示显式空标签普通业务不能用这些值。规划的时候尽量从16往上走再留出一定空间给未来扩容。2.3 别忘了反向LSP转发是双向的这是现场最容易踩的坑没有之一。LSP本身是单向的。数据从PE1到PE2走一条正向LSP但从PE2回PE1的流量必须另外有一条反向LSP来承载。动态LDP协议会自动为每条FEC建立正反两个方向的LSP所以你看不到这个细节。静态LSP没有信令设备不会自动帮你建反向路径需要手工把反向LSP也逐跳配出来。很多刚接触的人折腾了半天正向LSP验证是通的但业务却异常一问才发现反向LSP根本没配。回程报文到了PE2之后要么直接查普通路由发回去要么查不到对应LSP变成黑洞业务自然就不正常。我的习惯是最初做规划表的时候就把正向和反向两张表画在同一张Excel里一个业务两条路径对齐列出来配的时候一起下发。这样既不会漏排查的时候也方便对着表看标签有没有对错位。提示规划表至少包含四列节点角色、入接口、入标签、出接口、出标签。正向和反向放同一个sheet里命名统一后面省下大量核对时间。3. 华为设备静态LSP的完整建立过程3.1 一个最小拓扑把三跳都凑齐了为了把Ingress、Transit、Egress三个角色都覆盖到我设计了一个三节点的链状拓扑这也是MPLS隧道最常见的组网形态之一。PE1 —— P —— PE2假设设备互联地址规划如下设备接口互联地址LSR IDPE1GE0/0/010.1.12.1/241.1.1.1PGE0/0/010.1.12.2/242.2.2.2PGE0/0/110.1.23.2/242.2.2.2PE2GE0/0/010.1.23.3/243.3.3.3业务需求是让PE1后面网段192.168.2.0/24的流量通过MPLS隧道到达PE2。为了测试方便我们把PE2上的192.168.2.2/32作为隧道目的地址。所有设备都要先配置系统名称相关的基础工作就不展开了重点从MPLS相关配置开始。3.2 全局和接口使能MPLS华为设备上使用MPLS第一步是启动全局MPLS能力并配置LSR ID。先进入系统视图system-view mpls lsr-id 1.1.1.1 mplsLSR ID在MPLS网络中相当于设备的路由器ID用于标识这台设备。配置LSR ID时必须保证全网唯一通常直接用Loopback地址来充当。mpls命令则是在全局视图下开启MPLS能力。注意LSR ID并不是让设备产生任何LSP它只是一个身份标识。后面所有标签对应关系都用这个ID来统一管理。第二步在互联接口上使能MPLS。以PE1的GE0/0/0为例interface GigabitEthernet0/0/0 mpls quit在接口下敲mpls表示该接口允许处理MPLS报文。这一步非常重要很多人配置了静态LSP但状态始终是Inactive一查就是接口没使能MPLS。P设备上两个互联接口都得使能MPLS。PE2同样在GE0/0/0下使能。全局和接口这两层做完之后MPLS基础环境就算准备好了。3.3 Ingress节点静态LSP配置PE1作为Ingress也就是隧道入口需要配置目的地址、下一跳和出标签。命令如下static-lsp ingress PE1_TO_PE2 destination 192.168.2.2 32 nexthop 10.1.12.2 out-label 100拆开来看static-lsp ingress表示这是在配置一条静态LSP且本机角色是Ingress。PE1_TO_PE2LSP名称在整台设备上必须唯一建议用有业务含义的命名。destination 192.168.2.2 32隧道的目的地址和掩码。这就是之前规划好的FEC可以理解为这条LSP为谁服务。nexthop 10.1.12.2下一跳地址必须是直连可达的地址这里就是P设备的接口地址。out-label 100发出的标签值这个值要跟P设备上配置的入标签一致。这里需要提醒一个容易忽视的点Ingress设备上必须有到达目的地址192.168.2.2的路由。可以是通过IGP学习到的也可以是手工静态路由。否则数据面查不到匹配的路由项标签转发就不会生效。还有一个掩码细节。destination的掩码最好不要随便写要和实际业务路由匹配。如果目的网段是192.168.2.0/24可以写成destination 192.168.2.0 24。写成32位也是可以的但一定要保证匹配到准确的FEC不能含糊。3.4 Transit节点静态LSP配置P设备在这条隧道里是Transit角色。它不关心目的地IP只要处理标签转换即可。命令如下static-lsp transit PE1_TO_PE2 incoming-interface GigabitEthernet0/0/0 in-label 100 nexthop 10.1.23.3 out-label 200逐个参数看static-lsp transit本机角色是Transit。incoming-interface GigabitEthernet0/0/0报文从哪个接口进来。这是从PE1方向的接口GE0/0/0。in-label 100入标签是100这个值必须等于上游PE1的出标签100。nexthop 10.1.23.3下一跳是PE2地址。out-label 200出标签是200这个值必须等于下游PE2的入标签200。Transit节点配置中有一个特别容易写错的地方就是入接口。跨厂商设备上如果入接口配置不对即使标签值全对标签报文也不会被正常处理因为设备根本不知道从哪个接口进来的才算这条LSP的流量。华为设备上这个参数是必须精确指定的。还有一点Transit节点不需要配置destination和掩码因为它查的是MPLS标签转发表而不是IP路由表。标签到达之后直接按入标签匹配匹配上就做标签替换完全不关心最终目的IP。3.5 Egress节点静态LSP配置PE2是Egress角色它收到标签报文后弹出标签再按IP路由转发。命令如下static-lsp egress PE1_TO_PE2 incoming-interface GigabitEthernet0/0/0 in-label 200这里的参数不难理解static-lsp egress本机角色是Egress。incoming-interface GigabitEthernet0/0/0从PE1方向的P来所以入接口是GE0/0/0。in-label 200入标签200必须等于上游P设备的出标签200。Egress节点为什么不需要配out-label因为标签到它这里已经是最后一跳了它做的动作是弹出标签而不是交换标签。再往下就是普通IP转发。这里有个非常重要、也容易被忽略的检查项Egress设备上必须存在到达业务目的地的路由。比如PE2要能把弹出的报文送到192.168.2.2PE2上必须有对应路由。可以是直连可以是静态或动态路由。否则标签弹出之后报文查不到下一跳直接丢包。3.6 反向LSP配置正向隧道配置完成只能保证数据从PE1发到PE2。回程流量从PE2发往PE1需要再建一条反向LSP配置逻辑完全镜像过来。PE2作为Ingressstatic-lsp ingress PE2_TO_PE1 destination 1.1.1.1 32 nexthop 10.1.23.2 out-label 300P设备作为Transitstatic-lsp transit PE2_TO_PE1 incoming-interface GigabitEthernet0/0/1 in-label 300 nexthop 10.1.12.1 out-label 400PE1作为Egressstatic-lsp egress PE2_TO_PE1 incoming-interface GigabitEthernet0/0/0 in-label 400注意P设备上反向LSP的入接口是GE0/0/1也就是面向PE2的接口而不是正向LSP的GE0/0/0。很多新手到这里会照抄正向配置导致入接口写错反向流量就断了。还有一个小点反向LSP的目的地址写什么这里写了PE1的LSR ID 1.1.1.1/32。实际业务中应该写业务报文访问的目的网段。如果业务就是从PE2网段访问PE1网段那就写PE1侧业务地址。规划时两边的地址一定要对称。3.7 验证这些命令必须会配置完成之后最重要的就是验证。不要急着去Ping普通IP那验证不了MPLS转发路径是否真的走了LSP。首先在任意设备上查看静态LSP的概要状态display mpls static-lsp这个命令会列出设备上所有静态LSP包括名称、角色、状态。重点关注State字段是不是Active。如果是Inactive说明配置有问题后面再说排查。接着用verbose参数看细节display mpls static-lsp verbose输出内容会包含每条LSP的详细参数入接口、入标签、出接口、出标签、下一跳、状态等。拿着这个输出对照规划表逐项核对是最直接有效的验证方式。如果要看整个转发表里各条LSP的汇总信息display mpls lsp这个命令会把静态和动态LSP都列出来通过协议类型可以区分哪些是static。如果设备同时跑了LDP要留意静态LSP和动态LSP之间是否存在标签覆盖或冲突。业务转发验证推荐使用MPLS专用的Ping工具。华为设备上的命令是ping mpls ipv4 192.168.2.2 32这条命令会构造一个带标签的MPLS Echo请求报文沿LSP转发到目的设备。如果能收到MPLS Echo响应说明整条LSP的数据面是通的。比单纯Ping普通IP可靠得多。4. 静态LSP验证方法以及常见问题排查4.1 State不是Active优先查什么配置完静态LSP之后第一件事就是看状态。下面三种情况必须重点排查第一种接口没有正确使能MPLS。检查每一跳互联接口下是不是都敲了mpls。这个配置漏掉之后接口根本无法处理MPLS报文LSP状态就会异常。用display mpls interface可以快速查看接口的MPLS使能状态。第二种下一跳不可达。Ingress配置了nexthop但设备上没有到下一跳的直连路由或者下一跳接口Down了LSP就处于不可用状态。检查方式很简单在Ingress上用display ip routing-table 10.1.12.2确认路由是否存在再看接口物理状态是不是Up。第三种标签对不上号。上游的出标签和下游的入标签不一致或者Transit的出标签和Egress的入标签不对应。这个问题在数据面表现为部分设备转发成功到某一段突然失败。这时候必须在每台设备上执行display mpls static-lsp verbose逐跳核对标签。4.2 逐跳排查的顺序千万不要乱多年的交付经验告诉我排查LSP问题最忌讳的是跳来跳去查。正确的顺序应该从Ingress开始按数据流方向逐跳排查。先确认Ingress的状态再确认Transit的状态再确认Egress的状态。每一跳都用display mpls static-lsp verbose确认入接口、入标签、出接口、出标签。这个过程就像沿着路线查快递包裹一个站点一个站点看单号。逐跳确认完状态之后再逐段做MPLS Ping测试。如果华为设备支持可以从Ingress发起对Egress的MPLS Echo然后一段一段缩近测试距离。哪一段失败问题就锁定在哪一段。最后才看业务层面的连通性。用普通Ping测试业务地址如果能通再确认是否真的走了LSP。这里有个陷阱普通Ping通了不代表LSP没问题可能只是回程走了普通IP路由。真正要确认MPLS转发是否生效始终以ping mpls的结果为准。4.3 一张表整理高频故障场景把现场遇见的常见故障整理成一张速查表排查效率能提高不少故障表现可能原因排查和解决手段静态LSP状态Inactive接口未使能MPLS或下一跳不可达display mpls interface、display ip routing-table确认直连路由隧道业务时通时不通标签配置对不齐或存在多条静态LSP重叠display mpls static-lsp verbose逐跳核对标签值Egress弹出标签后丢包Egress上没有到业务目的地的路由在Egress上ping业务地址补充静态路由或IGP路由回程业务不通反向LSP漏配或入接口错误检查反向LSP是否建立核对入接口和标签衔接普通Ping通但业务不通报文走了IP转发没有走LSP确认Ingress目的地址掩码配置和业务路由是否匹配这里有一个值得单独说的点mask的匹配问题。Ingress上配置的destination掩码影响FEC分类。如果业务目的地是一个具体主机地址在Ingress配置的是32位路由但在路由表里目的地址所在网段掩码是25位那可能无法正确匹配LSP导致流量走了普通转发。建议在规划时确认好隧道FEC对应的精确路由。4.4 静态LSP的天然局限提前打好预防针静态LSP最大的问题就是不具备自动故障恢复能力。LDP或者Segment Routing这类动态方案底层IGP感知到链路故障后会重新计算路径LSP跟着自动切换。静态LSP不行链路断了之后除非人工重新配置路径或者提前设计备用LSP否则业务就一直处于中断状态。因此在生产网络里使用静态LSP我一般建议搭配两个措施。一是给承载LSP的链路配置可靠的故障检测一旦检测到故障可以联动业务切换或告警至少让运维第一时间感知到。二是如果需要高可靠性可以在规划时为主备路径都建立静态LSP当主路径故障时人工切换或者通过策略联动切换。当然这些操作会增加运维复杂度所以静态LSP更适合规模小、路径固定、变更不频繁的网络这一点要提前和管理层说清楚不要指望它像动态协议一样自动“自愈”。5. 现场运维经验以及踩过坑之后的总结5.1 命名规范和标签规划比敲命令更重要静态LSP配置量不大真正出问题的往往是规划混乱。命名一定要统一我推荐格式是LSP_业务名_起点to终点。比如PE1到PE2的CRM业务隧道可以命名为LSP_CRM_PE1toPE2反向就是LSP_CRM_PE2toPE1。这样配置和排错时看名字就知道这条隧道承载的是什么业务、是哪两个节点之间的路径。标签规划建议固定用一个区间。比如全网静态LSP标签统一使用1000到1999之间动态标签协议如果启用让它使用低的动态区间。这样在不同设备上看到标签值能快速判断是静态LSP还是动态LSP避免标签值之间互相冲突。5.2 每次变更前先备份配置打快照配置静态LSP虽然只是几条命令但上线前最好先把当前配置备份一下。我习惯用display current-configuration | include static-lsp把涉及静态LSP的配置单独导出存档。变更之后如果发现问题能快速对比前后差异不至于凭记忆排查。尤其在多人协作的网络里这个操作能少背很多锅。5.3 版本差异命令在不同产品形态上略有不同华为设备的静态LSP配置命令在多数企业路由器和NE系列设备上是通用的但不同软件版本、不同产品形态之间会存在细微差异。比如早期版本的华为设备上部分命令只支持IP地址格式不支持带掩码长度有些版本接口支持mpls使能有些版本还需要额外执行mpls lsr-id与mpls全局开启的顺序颠倒可能会导致报错。建议操作前先执行display version确认软件版本在测试环境或模拟器里验证命令语法再上线。不要拿到一组命令就在生产设备上直接敲尤其是跨版本迁移场景命令差异造成的影响往往比想象中大。5.4 最后的经验总结静态LSP这个东西技术原理并不复杂配置命令也非常有限真正拉开差距的是规划和验证环节。做标签规划表时把正反向一起画配置时按角色逐跳去敲验证时用ping mpls而不是普通Ping排错时从Ingress向Egress一段一段查把这几条做到位基本上就不会被这种隧道绊住。另外提一个很少人注意的小细节配置时给每条LSP命名后如果后续要做覆盖修改华为设备相同名称的LSP可以直接用新命令覆盖配置但覆盖前最好先确认旧配置是否还在被业务使用。如果命名为更细微的业务信息比如带了网段地址修改时反而要小心影响范围。我一般建议LSP名称只反映业务和方向具体目的地址网段放在规划表里单独维护这样改名成本低变更也灵活。最后想说静态LSP虽然看着“老派”但在小规模组网和精准路径控制场景里它的可靠性和可维护性一点不差用好它你在现场能少熬好几个夜。