ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GNS3+Cisco 3640 MPLS实验环境搭建与LDP标签转发排错

GNS3+Cisco 3640 MPLS实验环境搭建与LDP标签转发排错

简介:南京邮电大学《交换技术与通信网》MPLS基本配置实验报告,面向通信工程、网络工程等专业学生及备考网络实验的读者,帮助梳理从GNS3搭建Cisco实验环境、完成LER与LSR接口IP编址,到配置OSPF路由、开启CEF并建立MPLS LSP的完整流程。资源包为1个doc文档,约749KB,篇幅集中,适合作为课程实验参考、配置命令查阅与报告撰写模板。已有963人学习下载,说明其在高校网络实验场景中具有一定参考价值。文档围绕实验目的、设备清单、拓扑与连通性测试展开,包含R1至R5的接口地址、回环口、路由协议及标签分发相关命令记录,并提示IP地址需与拓扑一致、配置后及时保存与ping测试。读者可据此理解MPLS标签交换路径的创建思路,对照检查各路由器配置与测试结果,提升实验复现和排错效率。

1. 一台 3640 跑不动的下午:MPLS 基本配置实验环境到底卡在哪

做《交换技术与通信网》这门课的 MPLS 基本配置实验,最省事的做法是用 GNS3 拉起五台 Cisco 3640,配 IP、跑 OSPF 110、开 LDP,看着标签从 R1 一路换到 R5。听着像照着命令抄一遍的事,真装的时候翻车点全在环境层:IOS 镜像没算 idle-pc,宿主机 CPU 直接拉满,敲个enable要等三秒才回显;串口一端没配时钟,show ip int brief里一排 up/down;LDP 邻居明明配了却起不来,标签一条都不分发。这篇记录的是我自己装了两遍才跑通的一套环境,从 GNS3-0.8.6 装起,到五台路由器三层互通、LSP 建立、标签转发表逐跳核对完整走一遍。适合手上有实验报告要复现、但卡在“设备起不来”和“标签不生效”这两步的人。

2. 装 GNS3 0.8.6 和 IOS 镜像:3640 的槽位、内存、idle-pc 一次配对

2.1 all-in-one 安装包和首次启动要定的三个目录

GNS3 迭代到 2.x 之后,设备全部走 template 模板,加一台 3640 要先建 template 再绑镜像,和这份实验报告里的操作路径完全是两套东西。要复现“拖设备、连线、开机”的老流程,直接上GNS3-0.8.6-all-in-one,装完即用,不需要额外配 dynamips 路径。

安装本身没什么花头,双击 exe 一路 next,中途会弹 WinPcap 4.1.3 的安装,勾上。装完先别急着启动,确认一遍安装目录:路径里不要出现中文、空格和括号,D:\GNS3这种最稳。老版本内部调用 dynamips 时是把路径拼进命令行参数的,D:\我的实验\GNS3这种路径,表现是设备能拖出来、一开机就报Could not start the node,日志里只给一行看不懂的 error。这种玄学问题排查半小时,不如卸载重装一次来得快。

首次启动会走 Setup Wizard,问两件事:projects 目录和 IOS images 目录。我一般设成D:\GNS3\Projects和D:\GNS3\IOS,两者分开,以后重装 GNS3 镜像目录不用动,省得再倒一遍几百兆的 BIN 文件。

接着改两个偏好:General 里的 Console application 换成 SecureCRT(下一节细说),Language 保持 English。0.8.6 的中文翻译只覆盖菜单,错误提示还是英文,中英混着看反而容易点错菜单。

依赖方面,0.8.6 要 .NET Framework 4.0 以上。Win7 上要单独装,Win10/Win11 自带 4.8 基本够。启动报“应用程序无法正常启动 (0xc000007b)”或者直接闪退,右键 exe → 属性 → 兼容性 → 勾“以兼容模式运行”选 Windows 7,再勾“以管理员身份运行”,十有八九能进。WinPcap 在较新的系统上装完可能提示驱动签名问题,这时候换成 Npcap 安装,安装时勾上WinPcap API-compatible Mode,GNS3 一样认得。

2.2 导入 C3640-JK9O3S-M-12.4(7a).BIN 并把槽位插对

镜像文件名C3640-JK9O3S-M-12.4(7a).BIN拆开看:C3640 是平台,J 表示企业特性集,K9 是加密特性,O3S 是特性组合,12.4(7a) 是 IOS 版本。MPLS 相关命令(ip cef、mpls ip、mpls label protocol ldp)在这个特性集里是齐的。如果手上换成 C3640-IK9S 或者 IP BASE 一类的镜像,接口下敲mpls ip会直接被拒,报% Invalid input detected at '^' marker——不是命令敲错,是镜像不带 MPLS 特性集,换镜像比重装系统快。

导入路径是 Edit → Preferences → IOS images and hypervisors,Image file 选中 BIN,Platform 选 c3640,Model 选 3640,RAM 给 128MB,NVRAM 保持 512KB。保存后列表里会出现一条c3640-jk9o3s-mz.124-7a.bin = c3640的映射,这一行就是开机时传给 dynamips 的参数,改了镜像名这一行也要跟着改。

槽位是必须动的一步。新建工程后右键设备 → Configure → Slots 页签,slot 1 选NM-4T,slot 0 按需选NM-1FE-TX。NM-4T 是四口串口模块,插在哪号槽,接口名就是s<槽号>/<口>:插 slot 1 得到s1/0到s1/3;NM-1FE-TX 插 slot 0 得到f0/0。这份实验的互联全部落在串口上,所以每台机器都插一块 NM-4T 到 slot 1,接口名和报告里的s1/0、s1/1正好对上。

然后是 idle-pc,这是老版本 GNS3 的头号出血点。不设 idle-pc,一台 3640 能把一个物理核吃满,五台一起开,宿主机风扇起飞,SecureCRT 里敲一个enable要等三秒才回显。操作方式:右键设备 → Idle-PC,让它跑一组采样,列表里带星号的值优先,选一个点 OK。判断有没有设对,不是看 GNS3 界面卡不卡,而是进设备敲:

R1#show processes cpu CPU utilization for five seconds: 3%/0%; one minute: 4%; five minutes: 4%

5 秒和 1 分钟两个值落在个位数才算对。idle-pc 的值跟镜像绑定,同一个 BIN 上算出来的值可以复用,换镜像必须重算。所以手里留一份“镜像 + idle-pc”能跑通的组合,比什么都值钱。五台设备全部配好后记得 Save project,不然关掉重开又要重插一遍槽位。

2.3 用 SecureCRT 6.7 接管控制台并开日志

GNS3 自带的 console 窗口小、不能开日志,配五台路由器的几十条命令,靠它写实验报告会很难受。改成 SecureCRT 接管,操作是 Preferences → General → Console application,命令行填:

"C:\Program Files\VanDyke Software\Clients\SecureCRT.exe" /T /N "%d" /TELNET %h %p

/T表示走 telnet 协议,/N后面是会话名,%d会被 GNS3 替换成设备名(R1、R2…),%h是本机地址,%p是 GNS3 给这台设备分配的控制台端口,从 2000 起往上加。换成 SuperPutty 的话命令是SuperPutty.exe -telnet %h -P %p,用 Putty 则是putty.exe -telnet %h -p %p,两者的端口参数一个是-P一个是-p,抄错一个字母的表现就是双击设备毫无反应。

SecureCRT 有一个内置控制台没有的功能:File → Log Session,把整场实验的终端输出落到一个 txt 文件里。配置过程中每一台路由器的show ip int brief、show ip ospf neighbor、show mpls ldp neighbor全在里面,写报告时直接截取,不用反复登录设备补截图。我习惯开一个总日志,文件名带上日期,事后回查某条命令当时回显了什么,比凭记忆靠谱得多。

还有个前置条件容易被忽略:Win10 默认不带 telnet 客户端。控制面板 → 程序 → 启用或关闭 Windows 功能 → 勾上“Telnet 客户端”。不勾的话,GNS3 双击设备会弹一下黑框就消失,看起来像设备没启动,其实是本机没有 telnet 可用。

3. 五台 3640 的 IP 编址与 OSPF 110:先把三层打通再谈标签

3.1 拓扑和编址表:一处和原报告不一样的地方

拓扑是一条链:R1—R2—R3—R4—R5,四段互联,每段一个 /24,每台设备各带一个 loopback 作为后面 LDP 传输地址和路由标识。

设备接口IP / 掩码对端
R1s1/012.1.1.1/24R2 s1/0
R1loopback01.1.1.1/24—
R2s1/0 / s1/112.1.1.2/24 / 23.1.1.2/24R1 / R3
R2loopback02.2.2.2/32—
R3s1/0 / s1/123.1.1.3/24 / 34.1.1.3/24R2 / R4
R3loopback03.3.3.3/32—
R4s1/0 / s1/134.1.1.4/24 / 45.1.1.4/24R3 / R5
R4loopback04.4.4.4/32—
R5s1/045.1.1.5/24R4 s1/1
R5loopback05.5.5.5/32—

关于接口名有一个地方要讲清楚。原报告里 R1 用f0/0配 12.1.1.1,R2 用s1/0配 12.1.1.2,两者是同一段互联;而在 GNS3 里,以太网口和串口是连不起来的,拖线时链路直接建不了。原文后面 MPLS 那段 R2 又出现了int sf0/0和int f1/0,说明整理报告时接口名写混了。我这一版的做法是五台全部走 NM-4T,互联统一用s1/x,编址、掩码、OSPF 进程号、LDP 配置一律照原报告不动,只把 R1 的f0/0换成s1/0。命令行和报告依然对得上,拓扑也能真的连起来跑。

3.2 接口配置:clock rate 和 no shutdown 缺一不可

以 R1 为例,先配互联口和回环口:

R1#config t R1(config)#int s1/0 ! 进入串口 1/0,对接 R2 的 s1/0 R1(config-if)#ip address 12.1.1.1 255.255.255.0 R1(config-if)#clock rate 64000 ! 本端为 DCE 时提供时钟,DTE 端不用配 R1(config-if)#no shutdown ! 物理口默认管理性关闭,必须打开 R1(config-if)#exit R1(config)#int loopback0 ! 回环口,用作 router-id 与 LDP 传输地址 R1(config-if)#ip address 1.1.1.1 255.255.255.0 R1(config-if)#exit R1(config)#exit R1#write ! 保存到 startup-config,重启不丢

clock rate 64000只配在链路的 DCE 一端。GNS3 建串口连线时通常会自动给一端下发时钟,但手动改过链路或者两端都没配上,show ip int brief就会显示成serial1/0 12.1.1.1 YES manual up down——物理层 up、协议层 down。判读就记一条:up/down 先看时钟,down/down 先看no shutdown和连线对不对得上。

R2 到 R5 的写法完全一样,只是接口和地址不同。R2 是两个串口,一进一出:

R2#config t R2(config)#int s1/0 R2(config-if)#ip address 12.1.1.2 255.255.255.0 R2(config-if)#clock rate 64000 R2(config-if)#no shutdown R2(config-if)#exit R2(config)#int s1/1 R2(config-if)#ip address 23.1.1.2 255.255.255.0 R2(config-if)#clock rate 64000 R2(config-if)#no shutdown R2(config-if)#exit R2(config)#int loopback0 R2(config-if)#ip address 2.2.2.2 255.255.255.255 ! 回环口用 /32,只占一个地址 R2(config-if)#exit R2(config)#exit R2#write

R3、R4 各有两个串口,照 R2 的结构改地址;R5 只有一个串口,照 R1 的结构。都配完之后逐台核对:

R1#show ip int brief Interface IP-Address OK? Method Status Protocol s1/0 12.1.1.1 YES manual up up Loopback0 1.1.1.1 YES manual up up

两个字段都必须是 up。然后用ping 12.1.1.2测直连,通了再往上走。这段链路连通性测试要逐段做,一段不通就往上叠 OSPF,后面排查会变成一锅粥——路由不通到底是接口没起、还是宣告漏了、还是 LDP 传输地址不可达,三层问题混在一起,很难定位。

3.3 OSPF 110:router-id 和 network 宣告怎么写

三层通到直连还不够,环回口之间要互达才有后面的标签交换。以 R1 为例:

R1#config t R1(config)#router ospf 110 ! 110 是进程号,只在本机有效,五台一致便于排查 R1(config-router)#router-id 1.1.1.1 ! 用 loopback 地址,后面 LDP 传输地址也取它 R1(config-router)#network 1.1.1.1 0.0.0.0 area 0 ! 反掩码全 0 表示精确匹配这一条 /32 R1(config-router)#network 12.1.1.1 0.0.0.0 area 0 R1(config-router)#end R1#write

network后面的反掩码是容易写错的地方:0.0.0.0精确匹配一个地址,0.0.0.255匹配整个 /24。两种写法在这份实验里效果一样,只要宣告的地址落在接口网段内就行;写成255.255.255.255就一条都宣告不进去,show ip ospf interface brief里那个接口的 Area 会是空的。

R2、R3、R4 是中间节点,两个串口网段都要宣告,漏一个方向,整条链就断在中间。R2 的写法:

R2#config t R2(config)#router ospf 110 R2(config-router)#router-id 2.2.2.2 R2(config-router)#network 2.2.2.2 0.0.0.0 area 0 R2(config-router)#network 12.1.1.2 0.0.0.0 area 0 R2(config-router)#network 23.1.1.2 0.0.0.0 area 0 ! 两个方向都要宣告 R2(config-router)#end R2#write

验证分三步。先看邻居:show ip ospf neighbor里 State 必须是FULL,卡在INIT或EXSTART说明宣告或 MTU 有问题。再看路由表:show ip route 5.5.5.5,应该是一条 O 路由,下一跳指向对端串口地址、出接口是 s1/x。最后看 OSPF 接口状态:show ip ospf interface brief,参与宣告的接口都应该在 Area 0 里、状态是 P2P。

R5 侧只宣告5.5.5.5和45.1.1.5两条即可。全部配完,在 R1 上ping 5.5.5.5 source 1.1.1.1,五个感叹号回来,三层就算通了——带source是关键,不带的话源地址用的是出接口地址,测不出环回口到环回口的可达性。

4. 开 MPLS 与 LDP:ip cef 是地基,mpls ip 要两头都开

4.1 ip cef 是整套标签转发的地基

MPLS 的标签转发依赖 CEF(Cisco 快速转发)维护的 FIB 表,12.4 的镜像默认就开着 CEF。检查方式:

R1#show ip cef summary IPv4 CEF is enabled for distributed only ...

如果之前有人执行过no ip cef,在接口下敲mpls ip会被直接拒绝,报% MPLS requires CEF to be enabled。全局补一条就行:

R1#config t R1(config)#ip cef ! 显式开启,幂等操作,开过再敲不报错 R1(config)#end

这一步建议五台都显式敲一遍。看起来是废话,但真遇到镜像被改过配置的情况,mpls ip敲不进去而你又找不到原因,最后发现是 CEF 被关了,这种坑最耗时间。

4.2 逐台开接口 MPLS:LER 和 LSR 的配置其实一样

先看 R1 和 R2 的写法:

R1#config t R1(config)#ip cef R1(config)#int s1/0 R1(config-if)#mpls label protocol ldp ! 该接口用 LDP 分发标签,不写默认也是 LDP R1(config-if)#mpls ip ! 在该接口启用 MPLS 转发 R1(config-if)#end R1#write
R2#config t R2(config)#ip cef R2(config)#int s1/0 R2(config-if)#mpls label protocol ldp R2(config-if)#mpls ip R2(config-if)#exit R2(config)#int s1/1 R2(config-if)#mpls label protocol ldp R2(config-if)#mpls ip R2(config-if)#end R2#write

mpls label protocol ldp是接口级的协议选择,可选ldp和tdp,12.4 里默认就是 LDP,写出来是为了让配置可读,也避免继承到旧配置。mpls ip才是真正打开转发的那条命令。

这里有个必须强调的点:mpls ip要开在所有参与转发的接口上,入方向和出方向都要。R2 有两个串口,两个都得开;只开 s1/0 不开 s1/1,LDP 邻居可能照样能起来(邻居是靠直连链路和传输地址建 TCP 会话的),但转发时出接口没有标签可用,show mpls forwarding-table里那一条要么没有、要么出标签显示为Untagged,数据包到这一跳就被迫走 IP 转发。

LER 和 LSR 的区别不在命令上,在角色上。R1、R5 是边缘设备(LER),收 IP 包时压入标签、出 MPLS 域时弹出标签;R2、R3、R4 是核心(LSR),只做标签交换。配置代码一模一样,区别体现在转发表里:R1 的入方向没有入标签,R2 到 R4 的每一行都有一对入标签和出标签。R3、R4 照 R2 的结构配两个口,R5 照 R1 配一个口,五台都配完再进下一步。

4.3 LDP 会话和标签绑定表的初次检查

配完不要急着看转发表,先确认邻居起来没有:

R1#show mpls ldp neighbor Peer LDP Ident: 2.2.2.2:0; Local LDP Ident 1.1.1.1:0 TCP connection: 2.2.2.2.646 - 1.1.1.1.11021 State: Oper; Msgs sent/rcvd: 24/25; Downstream; Last TIB ver: 12 Up time: 00:03:41

State: Oper才算真的建立完成,TCP connection那一行显示的是 646 端口上的会话,后面的 11021 是本端随机高位端口。Peer LDP Ident是对方的 LDP 标识,注意它默认取路由器上所有接口里最大的 IP 地址,不一定是 loopback。

这就引出一个细节:如果某台设备后来加了一个地址更大的接口,LDP 标识会变,会话重建,全网的标签跟着重算。稳妥做法是在全局固定:

R2#config t R2(config)#mpls ldp router-id loopback0 force ! 固定用 loopback0 作标识,force 立即生效 R2(config)#end

五台都按各自 loopback 固定一遍,后面的标签表才稳定可复现。

再看接口状态和绑定表:

R1#show mpls interfaces Interface IP Tunnel Operational Serial1/0 Yes (ldp) No Yes

Operational一列是Yes说明 MPLS 在这个接口上真的生效了。绑定表用show mpls ldp bindings看,输出里每个目的网段都有一行 local 和一行 remote:local 是本机给这个前缀分配的入标签,remote 是下游邻居通告过来的出标签。远端环回5.5.5.5/32这一条五台都应该有记录,如果某台缺了,说明它没有从邻居那里学到这条路由,回到路由表去看。

5. 常见问题排查:LDP 邻居起不来与标签不分发的五种现场

5.1 五种翻车记录:现象、原因、解决

第一条,设备开机 CPU 跑满、命令行延迟几秒才回显。现象是 GNS3 里五台都显示 running,但 SecureCRT 敲enable要等三四秒;原因是没有设置 idle-pc,dynamips 用满核在跑轮询;解决是逐台右键 Idle-PC 采样取值,然后进设备show processes cpu确认降到个位数。顺便说,idle-pc 选错值也会出现类似现象,只是没那么严重,判断标准永远是show processes cpu的实际读数。

第二条,两台设备之间拖不出连线,GNS3 直接拒绝建链。现象是鼠标从一个设备的f0/0拖到另一个设备的s1/0,松开就报错、线不出现;原因是接口类型不匹配,以太网口只能接以太网模块、串口只能接串口;解决是把两端统一,要么都插 NM-4T 走s1/x,要么都插 NM-1FE-TX 走f0/x。原报告里 R1 的f0/0和 R2 的s1/0属于同一段互联,就是踩了这个坑,我这一版统一改成串口。改完之后编址不变、命令不变,只是接口名换了。

第三条,`show ip

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进