πŸ”€ CML Lab Rebuild, Part 3: VLANs, OSPF & a Resilient Routed Core

Welcome back! πŸ‘‹ In Part 2, I ripped up my original plans, pivoted to a modern routed campus design, and planned out our dual-stack /16 and /48 addressing scheme. This time, the lab finally stops being just a drawing and starts behaving like an actual network! πŸš€

VLAN services are going live on the access switch, our routed links are getting their point-to-point IP addresses, and OSPF is officially stepping in to handle the heavy lifting of finding the best path.

The goal for this stage was simple: build each layer in a way that I can prove. Rather than just stopping at a green topology diagram and hoping for the best, I wanted hard evidence at every step: gateway checks, neighbour adjacencies, routing-table verifications, and end-to-end dual-stack pings. πŸ•΅οΈβ€β™‚οΈ

Build stageWhat changedProof point
Access servicesSite 1 VLANs and dual-stack SVIs on HQ-ASW-01IPv4 and IPv6 gateway status
Routed corePoint-to-point IPv4 /31 and IPv6 /127 links, plus loopbacksTransit reachability from the access and distribution layers
Dynamic routingOSPF for IPv4 and IPv6Neighbours, ECMP routes, and a resilient path to HQ-EDGE-01

🏒 HQ Access Services: Bringing VLANs to Life

I started right at the edge on HQ-ASW-01. This is where those Site 1 VLANs we planned in Part 2 graduate from being just rows in a spreadsheet to actual, useful services.

Each Switch Virtual Interface (SVI) gives its VLAN a shiny new IPv4 and IPv6 default gateway. I was careful to keep the naming and addressing conventions we hashed out in the previous post. This is the moment the routed-access design starts to feel real. Eventually, end-user devices will use these SVIs as their first hop, but for now, the switch itself can use these dual-stack gateways to cleanly participate in the wider infrastructure.

HQ-ASW-01 terminal output showing the configured Site 1 VLANs.
Site 1 VLANs created on HQ-ASW-01, ready for their SVI gateway services.
HQ-ASW-01 terminal output showing combined IPv4 and IPv6 gateway interface status for the Site 1 VLANs.
Combined IPv4 and IPv6 gateway state for the Site 1 VLAN SVIs.

πŸ”— The Routed Core: Small Prefixes, Zero Waste

Next up: the infrastructure links. Remember how deep we went into the subnetting weeds in Part 2? 🌿 That discipline continues here.

For the point-to-point uplinks, I used IPv4 /31 and IPv6 /127 allocations. That means exactly two usable addresses per link β€” absolutely zero wasted space! I also configured Loopback interfaces to provide stable, always-on identities for routing and troubleshooting, just in case a physical cable gets yanked later on.

I also wanted to make sure the inter-switch bundle between the distribution switches was solid. A neat design on paper is great, but checking the VLAN, LACP state, and port-channel addresses is what makes it something I can confidently build on. Oh, and on HQ-DSW-01 and HQ-DSW-02, I spun up VLAN 998 purely as a "parking VLAN" for unused ports β€” gotta keep things secure! πŸ”’

Need a quick refresher on the addressing math? Review the dual-stack endpoint allocation from Part 2.

HQ-DSW-01 terminal output showing LACP port-channel status.
LACP status on HQ-DSW-01.
HQ-DSW-02 terminal output showing LACP port-channel status.
LACP status on HQ-DSW-02, confirming both sides agree on the bundle.
HQ-ASW-01 terminal output showing successful IPv4 and IPv6 pings to the routed transit interfaces on both distribution switches.
HQ-ASW-01 reaches both distribution switches’ routed transit interfaces over IPv4 and IPv6 before OSPF is enabled.

πŸ”€ Dynamic Routing: Firing STP, Hiring OSPF

With the interfaces addressed and happily pinging each other, it was time for the fun part: OSPF! πŸŽ‰

I enabled the IPv4 (OSPFv2) and IPv6 (OSPFv3) processes across the routed infrastructure, advertised those loopbacks I mentioned earlier, and let each node learn the rest of the core dynamically.

HQ-ASW-01 terminal output showing OSPF IPv4 and IPv6 neighbour adjacencies.
HQ-ASW-01 sees its OSPF neighbours for both IPv4 and IPv6.
HQ-ASW-01 IPv4 routing table showing learned OSPF routes.
IPv4 routes learned by HQ-ASW-01 through OSPF.
HQ-ASW-01 IPv6 routing table showing learned OSPF routes.
The IPv6 routing-table view — dual stack means validating twice.

This right here is the ultimate payoff for our Part 2 architecture pivot! πŸ† The routing tables show the learned OSPF routes, meaning we finally get Equal-Cost Multi-Path (ECMP) routing. Instead of having redundant uplinks sitting idle and blocked by Spanning Tree, we get to use all our bandwidth. It gives the lab better performance and a much cleaner failure story.

πŸ§ͺ Validation: Dual-Stack Pings and ECMP Path Selection

With OSPF established, I needed to prove it actually worked. I ran reachability tests from HQ-ASW-01 all the way to HQ-EDGE-01’s Loopback0. Hitting successful IPv4 and IPv6 pings confirmed that the transit links, learned routes, and return paths were functioning end-to-end.

To make the routing decision visible, I ran a traceroute. It was satisfying to watch the responses alternate through both HQ-DSW-01 and HQ-DSW-02. OSPF successfully installed two equal-cost paths to the edge! The simulation below illustrates this exact behavior.

HQ-ASW-01 traceroute to HQ-EDGE-01 showing alternating first-hop and second-hop addresses across active equal-cost paths.
The traceroute alternates between both equal-cost paths: 10.254.1.7 and 10.254.1.9 at hop 1, then 10.254.1.5 and 10.254.1.3 at hop 2.
HQ-ASW-01 ping test output to HQ-EDGE-01 using OSPF-learned routing.
End-to-end reachability from HQ-ASW-01 to HQ-EDGE-01 over the OSPF-routed core.

πŸ›‘οΈ The Failover Test: Proving the Network Survives

ECMP is awesome, but it’s most valuable when things go wrong. To test our failure path, I deliberately took HQ-DSW-01 completely out of service, just to watch OSPF rip its links out of the topology.

The result? The IPv6 traceroute seamlessly completed through HQ-DSW-02. This is exactly what I wanted: the core automatically shifted to a single path, keeping 100% reachability without me touching a single route. 😎

Network topology showing HQ-DSW-01 down for resiliency testing while HQ-DSW-02 remains online.
HQ-DSW-01 is intentionally down for the failover test; the HQ-DSW-02 branch remains available.
HQ-ASW-01 IPv6 traceroute to HQ-EDGE-01 completing through HQ-DSW-02 after the DSW1 failure.
The IPv6 traceroute completes through HQ-DSW-02, proving the surviving route still reaches the edge.

πŸ” Bonus Validation: LACP Resiliency

Finally, if a unidirectional link error breaks one cable in the bundle, what happens?

HQ-DSW-01 and HQ-DSW-02 are joined by Port-channel12, a Layer-3 LACP EtherChannel built from GigabitEthernet0/1 and GigabitEthernet0/2. OSPFv2 and OSPFv3 run on that logical port-channel, not on its individual physical members. I used a continuous ping from HQ-ASW-01 to HQ-DSW-02 Loopback0 (10.255.1.2) to observe the result.

Troubleshooting path

Three one-sided tests exposed the same stale member state

I worked from the CML GUI to a manual interface action, keeping the same continuous ping running from HQ-ASW-01 to HQ-DSW-02 Loopback0.

  1. 01

    Stop the link in the CML GUI

    The affected member was stopped, but HQ-DSW-02 still showed it as bundled (P). The remote switch had not yet removed it from Po12.

  2. 02

    Disconnect the link in the CML GUI

    The interface status now read as "down", yet the same Po12 member still remained (P) on HQ-DSW-02. The virtual link looked unavailable while the remote bundle still treated it as usable.

  3. 03

    Manually shut the member on HQ-DSW-01 only

    I then manually disabled the affected physical member on the HQ-DSW-01 side only. The one-sided state again left HQ-DSW-02 with stale membership, so it could continue sending traffic and OSPF Hellos toward an unavailable path until the OSPF dead timer expired and the adjacency reconverged.

EtherChannel summaries showing GigabitEthernet0/1 down on HQ-DSW-01 while HQ-DSW-02 still lists both members as bundled in Port-channel12.
Look closely at the EtherChannel summaries above: HQ-DSW-01 removed Gi0/1 locally, but HQ-DSW-02 is trapped in a stale state, still listing the port as an active bundled member (P). This stale state is the culprit behind our 88% ping result below. HQ-DSW-02 blindly keeps firing OSPF Hellos (and our ping traffic) down the dead link, causing packet loss right up until the OSPF dead timer finally expires and forces the adjacency to reconverge.

This dropped traffic is just an artifact of a one-sided administrative shutdown in CML/IOSv, not evidence of a broken Layer-3 port-channel config. On real physical hardware (AFAIK), a pulled cable signals "down" on both sides, and the remaining member takes over seamlessly!

HQ-ASW-01 continuous ping showing packet loss during the one-sided LACP member shutdown test.
The one-sided test records the earlier 88% ping outcome. It documents the emulation edge case and is not evidence of seamless member resiliency.
04

Run the controlled two-sided validation

I therefore ran the continuous ping again while manually shutting down the same physical member — GigabitEthernet0/2 — on both distribution switches. Both devices immediately agreed on the active bundle membership, while Port-channel12 remained operational over the remaining member.

OSPF neighbor output on both distribution switches showing the Port-channel12 adjacency remains FULL after the controlled member-removal test.
Control-plane continuity over the logical port-channel: the Po12 OSPF adjacency remains FULL after the controlled test.

Three-terminal controlled LACP member-removal test showing HQ-ASW-01 completing 1000 of 1000 pings while GigabitEthernet0/2 is shut down on both distribution switches.
Final controlled member-removal validation: HQ-ASW-01 completes 1000 of 1000 pings while the same member is shut down on both distribution switches.

📋 Part 3 summary

Part 3 turned the planned topology into a working dual-stack routed campus core:

  • Created the Site 1 VLAN services and dual-stack gateway SVIs on HQ-ASW-01.
  • Applied the compact point-to-point addressing approach to the routed infrastructure and checked the inter-switch bundle.
  • Formed OSPF adjacencies for IPv4 and IPv6, then verified learned routes and end-to-end reachability.
  • Validated ECMP forwarding and the surviving path through HQ-DSW-02 after a simulated distribution-switch failure.
  • Confirmed that Port-channel12 retains routing and OSPF reachability when one LACP member is removed in the controlled test.

🔌 What’s next?

The routed core is alive, resilient, and ready for traffic. Up next in Part 4: we start plugging in external endpoints, enterprise services, and our VMware integration to make this lab truly functional. Onward! πŸƒβ€β™‚οΈπŸ’¨

📍 The full series roadmap

  • ✅ Part 1: CML Environment Setup & Platform Verification
  • ✅ Part 2: Five-Node Topology, Dual-Stack Addressing & Routed-Access Foundation
  • ✅ Part 3: Dynamic Dual-Stack Routing, ECMP & Path Resiliency (You are here!)
  • 🔌 Part 4: External Endpoints, Enterprise Services & VMware Integration
  • 🛡️ Part 5: Segmentation, Management & Edge Security
  • ☎️ Part 6: Voice, QoS & Unified Communications Integration
  • 🤖 Part 7: Network Automation, Programmability & Monitoring
  • 🚀 Part 8: CML Personal Expansion — Full Campus, Wireless & Advanced Services

📓 Why I’m documenting the build

This blog is part of my networking portfolio. I want to share my progress, explain what I’m trying to achieve, and be transparent about what goes wrong and how I fix it.

Stay tuned for Part 4!