Turning on RFC 8950
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 neighborsshows 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 (theRTA_VIAattribute) since Linux 5.2.
R1 also passes both routes on (PfxSnt 2), so each customer now learns the other's prefix.
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.
set protocols bgp neighbor 2001:db8:0:2::1 capability extended-nexthop- Line 1: Both ends must advertise it.
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.
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.
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-nexthopon each IPv6 neighbor. - Lines 18–21: IPv4 unicast activated for both.