Back to Blog
Tutorial8 min

IPv6 Multi-Vendor Lab: Dual-Stack, OSPFv3 & BGP

Build a dual-stack IPv6 lab across Cisco, Juniper, and Arista — OSPFv3 in the core, an iBGP IPv6 overlay, and end-to-end verification.

S
Sarah Chen
Network Engineer

IPv6 is no longer optional — RIRs are out of IPv4, mobile carriers are v6-only, and every greenfield data center ships dual-stack. But IPv6 is exactly where multi-vendor labs get painful: OSPFv3 needs an explicit router-id on every box, BGP carries v6 prefixes in a separate address-family, and each vendor names the commands differently. This lab builds a dual-stack core across Cisco IOL (BYOI), Juniper cRPD (BYOI), and Arista cEOS (BYOI) so you can practice the parts that actually trip people up.

Bottom line: A 3-vendor IPv6 lab traditionally means sourcing three images, wiring OSPFv3 by hand, and debugging link-local next-hops. As of 2026, NetPilot deploys this dual-stack OSPFv3 + iBGP-for-IPv6 topology with real CLIs in ~2 minutes — copy the prompt at the bottom and run it.

Lab topology

Three routers run OSPFv3 in area 0 to carry loopback reachability, then form an iBGP IPv6 overlay (AS 65000) on those loopbacks to advertise a customer prefix.

            2001:db8:12::/64            2001:db8:23::/64
 [R1 Cisco] ------------------- [R2 Juniper] ------------------- [R3 Arista]
  lo0 ::1/128                    lo0 ::2/128                       lo0 ::3/128
  AS 65000                       AS 65000 (full-mesh iBGP)         AS 65000
  advertises 2001:db8:cafe::/48
  • Loopbacks: 2001:db8:0:1::1, 2001:db8:0:2::2, 2001:db8:0:3::3 (each /128)
  • OSPFv3 area 0.0.0.0 on every link + loopback
  • iBGP full mesh (3 nodes) peering on loopbacks, address-family ipv6 unicast

Cisco IOL configuration (R1)

ipv6 unicast-routing
!
interface Loopback0
 ipv6 address 2001:DB8:0:1::1/128
 ospfv3 1 ipv6 area 0
!
interface Loopback1
 ipv6 address 2001:DB8:CAFE::1/128
!
interface Ethernet0/0
 ipv6 address 2001:DB8:12::1/64
 ospfv3 1 ipv6 area 0
!
ipv6 route 2001:DB8:CAFE::/48 Null0
!
router ospfv3 1
 router-id 1.1.1.1
 address-family ipv6 unicast
 exit-address-family
!
router bgp 65000
 bgp router-id 1.1.1.1
 neighbor 2001:DB8:0:2::2 remote-as 65000
 neighbor 2001:DB8:0:2::2 update-source Loopback0
 neighbor 2001:DB8:0:3::3 remote-as 65000
 neighbor 2001:DB8:0:3::3 update-source Loopback0
 address-family ipv6 unicast
  network 2001:DB8:CAFE::/48
  neighbor 2001:DB8:0:2::2 activate
  neighbor 2001:DB8:0:3::3 activate
  • ipv6 unicast-routing is the master switch — forget it and v6 forwarding silently stays off.
  • OSPFv3 has no IPv4 interface to borrow a router-id from, so router-id 1.1.1.1 is mandatory, not optional.
  • IOS only originates a BGP network statement when a matching route already exists in the RIB — the ipv6 route 2001:DB8:CAFE::/48 Null0 provides it, while Loopback1 (::1) answers the verification ping.
  • BGP IPv6 prefixes only move once you activate the neighbor under address-family ipv6 unicast — the neighbor statement alone does nothing for v6.

Juniper cRPD configuration (R2)

set interfaces lo0 unit 0 family inet6 address 2001:db8:0:2::2/128
set interfaces eth1 unit 0 family inet6 address 2001:db8:12::2/64
set interfaces eth2 unit 0 family inet6 address 2001:db8:23::2/64
set routing-options router-id 2.2.2.2
set routing-options autonomous-system 65000
 
set protocols ospf3 area 0.0.0.0 interface lo0.0 passive
set protocols ospf3 area 0.0.0.0 interface eth1.0
set protocols ospf3 area 0.0.0.0 interface eth2.0
 
set protocols bgp group ibgp type internal
set protocols bgp group ibgp local-address 2001:db8:0:2::2
set protocols bgp group ibgp family inet6 unicast
set protocols bgp group ibgp neighbor 2001:db8:0:1::1
set protocols bgp group ibgp neighbor 2001:db8:0:3::3
  • Junos calls it ospf3, not OSPFv3 — and you mark lo0.0 passive so the loopback is advertised without forming an adjacency on it.
  • family inet6 unicast under the BGP group is Junos' equivalent of Cisco's activate step.

Arista cEOS configuration (R3)

ipv6 unicast-routing
!
interface Loopback0
 ipv6 address 2001:db8:0:3::3/128
 ipv6 ospf 1 area 0.0.0.0
!
interface Ethernet1
 ipv6 address 2001:db8:23::3/64
 ipv6 ospf 1 area 0.0.0.0
!
ipv6 router ospf 1
 router-id 3.3.3.3
!
router bgp 65000
 router-id 3.3.3.3
 neighbor 2001:db8:0:1::1 remote-as 65000
 neighbor 2001:db8:0:1::1 update-source Loopback0
 neighbor 2001:db8:0:2::2 remote-as 65000
 neighbor 2001:db8:0:2::2 update-source Loopback0
 address-family ipv6
  neighbor 2001:db8:0:1::1 activate
  neighbor 2001:db8:0:2::2 activate
  • Arista enables OSPFv3 per-interface with ipv6 ospf 1 area (the process id is required), then a global ipv6 router ospf 1 for the router-id — close to Cisco, but the interface keyword differs from IOL's ospfv3 stanza.

Verification

Lead with the agent — one prompt checks every device at once and translates the per-vendor show syntax for you:

"Check OSPFv3 adjacencies and the iBGP IPv6 overlay across R1, R2, and R3, then confirm R3 can reach 2001:db8:cafe::1."

NetPilot runs the right command on each box in parallel — Cisco show ospfv3 neighbor, Juniper show ospf3 neighbor, Arista show ipv6 ospf neighbor — and returns one table with anomalies flagged. You can also verify by hand; SSH into any device and run the native commands:

! Cisco R1
show ospfv3 neighbor
show bgp ipv6 unicast summary
ping 2001:DB8:0:3::3 source Loopback0
# Juniper R2
show ospf3 neighbor
show bgp summary
show route table inet6.0 protocol bgp
! Arista R3
show ipv6 ospf neighbor
show bgp ipv6 unicast summary
ping ipv6 2001:db8:cafe::1

Expected: a FULL OSPFv3 adjacency on each link, three established iBGP sessions, and 2001:db8:cafe::/48 in every router's inet6.0 / IPv6 RIB.

Common multi-vendor IPv6 gotchas

  1. Missing router-id. OSPFv3 won't start without one — there's no IPv4 address to auto-derive it from. Every vendor needs it set explicitly.
  2. Forgot to activate / set family inet6. The BGP session comes up, but no v6 prefixes exchange. This is the single most common "BGP is up but routes are missing" cause in IPv6 labs.
  3. Link-local next-hops. iBGP-learned IPv6 routes can carry a link-local next-hop that isn't resolvable across the core — peering on loopbacks (as above) and running an IGP for reachability avoids it.
  4. OSPFv3 instance-id mismatch. All neighbors on a link must share instance-id 0 (the default) — easy to break if you copy a stanza between vendors.
  5. ipv6 unicast-routing off. Interfaces show addresses, adjacencies even form, but transit forwarding fails. Check it first when pings die mid-path.

Build this lab with AI

Instead of typing three vendors' worth of config and chasing the gotchas above, describe the intent and let the agent build it:

"Build a 3-router dual-stack lab with Cisco IOL, Juniper cRPD, and Arista cEOS. Run OSPFv3 in area 0 across all links and loopbacks, then add an iBGP IPv6 overlay in AS 65000 peering on loopbacks. Advertise 2001:db8:cafe::/48 from R1. Verify OSPFv3 adjacencies and end-to-end IPv6 reachability."

NetPilot designs the topology, generates the per-vendor OSPFv3 and BGP-for-IPv6 configs, deploys to cloud ContainerLab, and confirms reachability — then you SSH into real CLIs to explore. Iterate conversationally ("add SLAAC on R3's access segment and a DHCPv6 relay") and it updates every affected device.


Copy-paste ready: Grab the IPv6 dual-stack prompt from our example library — multi-vendor IPv6, OSPFv3, and BGP variants included.

Want to skip the manual config? Spin this up on an online network lab — or see how the AI network emulator builds dual-stack topologies from a prompt. Related: OSPF Multi-Vendor Lab and FRRouting in the Cloud. Try NetPilot — describe any IPv6 topology and get a working multi-vendor lab in ~2 minutes.

Try NetPilot Free

Build enterprise-grade network labs in seconds with AI assistance

Get Started Free