TTR Networks

Intermediate · IPv4 over an IPv6-only core (RFC 8950) · section 5 of 8

Turning on RFC 8950

✓ Lab-tested 17 October 2026 on VyOS 2026.10.16-0024-rolling, FRR 10.2.1

VyOS needs one line per IPv6 neighbor that carries IPv4: capability extended-nexthop. Both ends must have it; the capability is only used if both sides advertise it. Add it on R1 for C1 and R2, and on R2 for R1.

After the sessions re-establish:

  • show bgp neighbors shows Extended nexthop: advertised and received.
  • Both IPv4 routes are valid and best, with IPv6 link-local next hops. The detail view shows the peer's global IPv6 address and, in brackets, the link-local address actually used for forwarding.
  • R1's IPv4 routing table holds two BGP routes and nothing else. There's no connected IPv4 route, because R1 has no IPv4 subnet.
  • In the Linux kernel underneath, the routes are via inet6 fe80::…: an IPv4 route with an IPv6 gateway. The kernel has supported this (the RTA_VIA attribute) since Linux 5.2.

R1 also passes both routes on (PfxSnt 2), so each customer now learns the other's prefix.

R1: extended next hop on both IPv6 sessions
set protocols bgp neighbor 2001:db8:0:1::2 capability extended-nexthop
set protocols bgp neighbor 2001:db8:0:2::2 capability extended-nexthop
  • Lines 1–2: One line per IPv6 neighbor that carries IPv4.
R2: and on its side of the R1 session
set protocols bgp neighbor 2001:db8:0:2::1 capability extended-nexthop
  • Line 1: Both ends must advertise it.
IPv4 routes with IPv6 next hops (real output)
vyos@R1:~$ show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 0.0.0.1, local AS number 64500 VRF default vrf-id 0
BGP table version 2
RIB entries 2, using 320 bytes of memory
Peers 2, using 60 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
2001:db8:0:1::2 4      64512         9         9        2    0    0 00:00:17            1        2 C1
2001:db8:0:2::2 4      64501        15        13        2    0    0 00:00:03            1        2 R2

Total number of neighbors 2
vyos@R1:~$ show bgp neighbors 2001:db8:0:2::2 | match "Extended nexthop|Address Family IPv4 Unicast:"
    Extended nexthop: advertised and received
    Address Family IPv4 Unicast: advertised and received
vyos@R1:~$ show ip bgp
BGP table version is 2, local router ID is 0.0.0.1, vrf id 0
Default local pref 100, local AS 64500
Status codes:  s suppressed, d damped, h history, u unsorted, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>  198.51.100.0/24  fe80::78c8:f1ff:fe05:427
                                               0             0 64512 i
 *>  203.0.113.0/24   fe80::5054:ff:fe02:1
                                                             0 64501 64502 i

Displayed 2 routes and 2 total paths
vyos@R1:~$ show bgp ipv4 203.0.113.0/24
BGP routing table entry for 203.0.113.0/24, version 2
Paths: (1 available, best #1, table default)
  Advertised to peers:
  2001:db8:0:1::2 2001:db8:0:2::2
  64501 64502
    2001:db8:0:2::2 from 2001:db8:0:2::2 (192.0.2.1)
    (fe80::5054:ff:fe02:1) (used)
      Origin IGP, valid, external, best (First path received)
      Last update: Sat Oct 17 01:26:13 2026
vyos@R1:~$ show ip route 203.0.113.0/24
Routing entry for 203.0.113.0/24
  Known via "bgp", distance 20, metric 0, best
  Last update 00:00:05 ago
  Flags: Selected
  Status: Installed
  * fe80::5054:ff:fe02:1, via eth1, weight 1

vyos@R1:~$ show ip route
Codes: K - kernel route, C - connected, L - local, S - static,
       R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric, t - Table-Direct,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

IPv4 unicast VRF default:
B>* 198.51.100.0/24 [20/0] via fe80::78c8:f1ff:fe05:427, eth0, weight 1, 00:00:19
B>* 203.0.113.0/24 [20/0] via fe80::5054:ff:fe02:1, eth1, weight 1, 00:00:05
  • Lines 10–11: Routes now flow both ways (PfxSnt 2).
  • Line 15: The capability is negotiated.
  • Lines 27–30: IPv4 prefixes, IPv6 link-local next hops, valid and best.
  • Line 39: Learnt from R2's global address…
  • Line 40: …forwarded via its link-local address.
  • Lines 60–61: R1's whole IPv4 routing table: two BGP routes, no connected routes.
In the Linux kernel (real output)
vyos@R1:~$ ip -4 route
198.51.100.0/24 nhid 12 via inet6 fe80::78c8:f1ff:fe05:427 dev eth0 proto bgp metric 20
203.0.113.0/24 nhid 14 via inet6 fe80::5054:ff:fe02:1 dev eth1 proto bgp metric 20
vyos@R1:~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
  • Lines 2–3: IPv4 routes with IPv6 gateways: via inet6.
  • Lines 4–7: R1's only IPv4 address is 127.0.0.1.
What VyOS rendered into FRR (real output)
vyos@R1:~$ vtysh -c 'show running-config bgpd'
...
router bgp 64500
 bgp router-id 0.0.0.1
 no bgp ebgp-requires-policy
 no bgp reject-as-sets
 no bgp default ipv4-unicast
 no bgp network import-check
 neighbor 2001:db8:0:1::2 remote-as 64512
 neighbor 2001:db8:0:1::2 description C1
 no neighbor 2001:db8:0:1::2 enforce-first-as
 neighbor 2001:db8:0:1::2 capability extended-nexthop
 neighbor 2001:db8:0:2::2 remote-as 64501
 neighbor 2001:db8:0:2::2 description R2
 no neighbor 2001:db8:0:2::2 enforce-first-as
 neighbor 2001:db8:0:2::2 capability extended-nexthop
 !
 address-family ipv4 unicast
  neighbor 2001:db8:0:1::2 activate
  neighbor 2001:db8:0:2::2 activate
 exit-address-family
exit
  • Line 4: The manual router ID.
  • Lines 12–16: capability extended-nexthop on each IPv6 neighbor.
  • Lines 18–21: IPv4 unicast activated for both.