SRv6 on Linux: Modernizing Your ISP Backbone with FRRouting

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

The 2 AM Network Overhaul: Why SRv6?

It’s 2 AM, and I’m staring at a legacy MPLS core that is finally hitting its limit. LDP flaps are triggering micro-loops, and the RSVP-TE tunnels we built for traffic engineering have become a management nightmare. This is the moment I realized that clinging to 20-year-old protocols while scaling a modern 100G backbone is a losing battle.

The industry is rapidly shifting toward Segment Routing over IPv6 (SRv6). Unlike traditional MPLS, SRv6 doesn’t need a separate label signaling protocol. It uses the IPv6 header itself to carry instructions, known as Segments. If your hardware can route IPv6, you are already halfway to a fully programmable network. Mastering this on Linux is the best way to escape proprietary hardware lock-in and build flexible, open infrastructure.

SRv6 vs. Traditional MPLS: The Paradigm Shift

The way we move packets is changing fundamentally. Traditional MPLS relies on a fragile stack of 32-bit labels. Every router in the path must agree on what those labels mean using LDP or BGP-LU. SRv6 replaces this complexity by using the 128-bit IPv6 address as the instruction set itself.

Key Differences

  • Traditional MPLS: Requires LDP/RSVP. It maintains state at every hop. Troubleshooting becomes a headache when labels mismatch between vendors.
  • SR-MPLS: This removes LDP but keeps the MPLS data plane. It’s a decent middle ground, but you’re still stuck with label depth limitations on older chipsets.
  • SRv6: No labels required. The “Segment Identifier” (SID) is just a standard IPv6 address. You get native reachability and end-to-end programmability without an MPLS-aware underlay.

Real-World Pros and Cons

Before migrating your production core, you need to weigh the trade-offs I’ve seen in actual deployments.

The Pros

  • Operational Simplicity: You can finally kill off LDP and RSVP. Your IGP (IS-IS or OSPFv3) handles the heavy lifting alone.
  • Granular Traffic Engineering: You can steer low-latency voice traffic over a specific path just by changing the destination IPv6 prefix.
  • Unified Monitoring: Everything is IPv6. Your existing Netflow collectors and Wireshark filters work out of the box because they don’t need to peek under an MPLS stack.

The Cons

  • MTU Overhead: This is the big one. Every SID added to the Segment Routing Header (SRH) adds 16 bytes. If you have a path with 5 SIDs, you lose 80 bytes of MTU.
  • Hardware Offloading: While the Linux kernel handles SRv6 perfectly in software, older NICs like the Intel i350 won’t offload the encapsulation. This can spike CPU usage on 10Gbps+ links.

Recommended Setup

SRv6 support has matured since Linux kernel 5.4. However, for a stable production environment, I recommend 5.15 or newer to avoid known bugs in the SRH processing logic.

  • OS: Ubuntu 22.04 LTS or Debian 12.
  • Routing Suite: FRRouting (FRR) version 8.5 or higher.
  • Kernel: 5.15+ with CONFIG_IPV6_SEG6_LWTUNNEL enabled.

Implementation: Configuring an SRv6 Node

This setup configures a Linux node as an SRv6 LER (Label Edge Router). We will use IS-IS for the control plane and define a “Locator”—the IPv6 block used for this node’s specific instructions.

Step 1: Prep the Kernel

You must enable IPv6 forwarding and explicitly tell the kernel to process SRv6 packets on your interfaces. Run these commands:

# Enable IPv6 Forwarding
sudo sysctl -w net.ipv6.conf.all.forwarding=1

# Enable SRv6 processing on the backbone interface (e.g., eth0)
sudo sysctl -w net.ipv6.conf.eth0.seg6_enabled=1
sudo sysctl -w net.ipv6.conf.lo.seg6_enabled=1

Step 2: Install FRRouting

Don’t use the default distro packages; they are often too old for advanced SRv6 features. Use the official FRR repository instead.

curl -s https://deb.frrouting.org/frr/keys.asc | sudo apt-key add -
FRR_REPO="deb https://deb.frrouting.org/frr $(lsb_release -s -c) frr-stable"
echo "$FRR_REPO" | sudo tee /etc/apt/sources.list.d/frr.list
sudo apt update && sudo apt install frr frr-pythontools

Step 3: Define the SRv6 Locator

The locator is the pool of addresses that represent your node’s functions. Edit /etc/frr/daemons to set isisd=yes, then enter the FRR shell (vtysh).

conf t
!
segment-routing
 srv6
  locators
   locator MAIN
    prefix 2001:db8:1::/64
  exit
 !
exit
!

Step 4: Link IS-IS to SRv6

IS-IS needs to advertise your locator to the rest of the network so other routers know how to reach your segments. Use this configuration:

router isis 1
 net 49.0001.0000.0000.0001.00
 is-type level-2-only
 topology ipv6-unicast
 !
 segment-routing srv6
  locator MAIN
 !
interface eth0
 ipv6 router isis 1
 isis network point-to-point
exit
!

Step 5: Verify the Data Plane

The magic happens in the kernel’s localsid table. This is where the OS maps incoming IPv6 SIDs to specific actions, like decapsulating traffic or cross-connecting to a VRF.

# View active SRv6 localsids
ip -6 sr localsid show

Expected output: 2001:db8:1::1 dev lo action End. This confirms the router will process any packet destined for that address as an SRv6 endpoint rather than a standard host packet.

Final Thoughts from the Field

Deploying SRv6 on Linux requires a change in how you think about prefixes. You are no longer managing static circuits; you are managing a programmable address space. When I migrated our first test segment, the immediate benefit was the visibility. The routing table was cleaner, and we stopped chasing LDP neighbor timeouts. If you are building a private cloud or a regional ISP, Linux and FRRouting provide the most cost-effective path to mastering the tech powering modern 5G cores.

Share: