Classroom Glossary Public page

Lab 1: MPLS LSP Setup in Containerlab -- SR-MPLS Baseline

336 words

Week: 1 -- Carrier and WAN Protocols
Points: 20
Time estimate: 90 min lab + 3 hr independent
Deliverable: lab-1-report.md + Containerlab topology file + captured screenshots


Objectives

  1. Deploy a multi-router SR-MPLS topology in Containerlab using FRRouting 9.x.
  2. Configure IS-IS with SR extensions; assign Prefix-SIDs to each router.
  3. Verify label-switched path connectivity using traceroute with MPLS label observation.
  4. Demonstrate non-shortest-path forwarding using an SR Policy.

Topology

  R1 (SR-Node-SID: 101)
  / \
 /   \
R2   R3
 \   /
  \ /
  R4 (SR-Node-SID: 104)
  |
  R5 (SR-Node-SID: 105) -- destination

5 FRR routers; IS-IS area 49.0001; SR Global Block 16000-23999.


Part A: Containerlab Topology Bootstrap (30 min)

Create lab1/topology.yaml:

name: sr-mpls-lab1

topology:
  nodes:
    r1:
      kind: linux
      image: frrouting/frr:v9.1.0
      binds:
        - lab1/configs/r1/frr.conf:/etc/frr/frr.conf
        - lab1/configs/r1/daemons:/etc/frr/daemons
    r2:
      kind: linux
      image: frrouting/frr:v9.1.0
      binds:
        - lab1/configs/r2/frr.conf:/etc/frr/frr.conf
        - lab1/configs/r2/daemons:/etc/frr/daemons
    r3:
      kind: linux
      image: frrouting/frr:v9.1.0
      binds:
        - lab1/configs/r3/frr.conf:/etc/frr/frr.conf
        - lab1/configs/r3/daemons:/etc/frr/daemons
    r4:
      kind: linux
      image: frrouting/frr:v9.1.0
      binds:
        - lab1/configs/r4/frr.conf:/etc/frr/frr.conf
        - lab1/configs/r4/daemons:/etc/frr/daemons
    r5:
      kind: linux
      image: frrouting/frr:v9.1.0
      binds:
        - lab1/configs/r5/frr.conf:/etc/frr/frr.conf
        - lab1/configs/r5/daemons:/etc/frr/daemons

  links:
    - endpoints: ["r1:eth1", "r2:eth1"]
    - endpoints: ["r1:eth2", "r3:eth1"]
    - endpoints: ["r2:eth2", "r4:eth1"]
    - endpoints: ["r3:eth2", "r4:eth2"]
    - endpoints: ["r4:eth3", "r5:eth1"]

Enable the MPLS kernel modules before deploying:

sudo modprobe mpls_router mpls_gso mpls_iptunnel
sudo containerlab deploy -t lab1/topology.yaml

Create the daemons file for each router:

zebra=yes
isisd=yes

Part B: IS-IS with SR Extensions (30 min)

Configure IS-IS and Segment Routing on each router. Example for R1:

! /etc/frr/frr.conf for R1
!
hostname R1
!
interface lo
 ip address 10.255.0.1/32
 ip router isis 1
 isis passive
!
interface eth1
 ip address 10.0.12.1/30
 ip router isis 1
 isis network point-to-point
!
interface eth2
 ip address 10.0.13.1/30
 ip router isis 1
 isis network point-to-point
!
router isis 1
 net 49.0001.0000.0000.0001.00
 is-type level-2-only
 !
 segment-routing on
 segment-routing global-block 16000 23999
 segment-routing node-msd 8
 !
 segment-routing prefix 10.255.0.1/32 index 101
!

Assign Prefix-SID indexes:

  • R1: index 101 → label 16101
  • R2: index 102 → label 16102
  • R3: index 103 → label 16103
  • R4: index 104 → label 16104
  • R5: index 105 → label 16105

Verify adjacencies from R1:

docker exec clab-sr-mpls-lab1-r1 vtysh -c "show isis neighbor"
docker exec clab-sr-mpls-lab1-r1 vtysh -c "show isis segment-routing prefix-sids"

Record: are all expected neighbors adjacent? Are Prefix-SID entries present?


Part C: SR Policy for Non-Shortest-Path Forwarding (30 min)

The IGP shortest path from R1 to R5 is R1 → R2 → R4 → R5 (or R1 → R3 → R4 → R5; both are equal cost). Create an SR Policy on R1 that forces traffic to R5 via the explicit path R1 → R3 → R4 → R5:

! On R1: explicit-path SR Policy
segment-routing
 traffic-eng
  segment-list explicit-via-r3
   index 1 mpls label 16103   ! Adj-SID to R3 (use actual Adj-SID from 'show isis segment-routing adjacencies')
   index 2 mpls label 16104   ! Node-SID for R4
   index 3 mpls label 16105   ! Node-SID for R5
  !
  policy color 100 endpoint 10.255.0.5
   name "via-R3"
   candidate-paths
    preference 100
     explicit segment-list explicit-via-r3

Verify using traceroute with MPLS label observation:

# From R1 to R5 loopback -- should show 3 hops via R3, R4
docker exec clab-sr-mpls-lab1-r1 traceroute -M mpls 10.255.0.5

# Without the SR Policy (IGP default -- via R2 or R3, equal-cost)
docker exec clab-sr-mpls-lab1-r1 traceroute 10.255.0.5

Record: do the two traceroutes take different paths? What labels are observed at each hop?


Lab Report

Create lab-1-report.md with:

  1. show isis neighbor output from R1 (verify all neighbors adjacent)
  2. show isis segment-routing prefix-sids output (verify all 5 Prefix-SIDs present)
  3. Traceroute output: IGP default path vs. SR Policy path -- confirm they differ
  4. Label stack observed at each hop of the SR Policy path
  5. One-paragraph analysis: explain why SR-MPLS can enforce a non-shortest path without RSVP-TE state at transit routers

Grading

Component Points
IS-IS adjacencies: all 5 routers adjacent 4
Prefix-SIDs: all 5 present with correct labels 4
SR Policy: traceroute confirms non-shortest path via R3 8
Analysis paragraph: RSVP-TE state comparison correct 4
Total 20