インフラ・DevOps
RFC8950: IPv6ネクストホップでIPv4を発表する
RFC8950: Announce IPv4 with an IPv6 next-hop (anuragbhatia.com)
要約
RFC8950は、IPv6ネットワーク上でIPv4をルーティングすることを可能にする技術です。これにより、ネットワークコアをIPv6のみにしつつ、エッジデバイスでIPv4をサポートすることが可能になります。この技術は、ISPやIXPがIPv4をオプション機能として維持しながら、ネットワークインフラストラクチャをIPv6のみで運用することを可能にし、管理オーバーヘッドを削減するのに役立ちます。
全文翻訳
RFC8950: IPv6ネクストホップでIPv4を発表する
ここ数日間、RFC8950の設定を試しています。これは、IPv6上でIPv4をルーティングすることを可能にします。論理的には非常にシンプルですが、トンネルなしでIPv6ネットワーク上で「IPv4をオプション機能」にするための非常に強力な応用があります。
興味深いユースケースのいくつか:
大規模ネットワークは、コア全体でIPv6のみを実行し、エッジデバイスにIPv4のみを残すことができます。これは、顧客がエンドで何も調整しなくても機能します。彼らは古い方法で物事を続けますが、バックボーンはコアでIPv6のみを実行できます。
IPトランジットバックボーンはIPv6のみを実行しながら、IPv6セッションを介して顧客/ピア/アップストリームとIPv4ルートを交換できます。したがって、IPv4は「機能」として残りますが、ネットワーク自体はIPv4インターフェイス設定、BGPセッション設定、ファイアウォール設定などのオーバーヘッドなしでIPv6のみになります。
IXPは、(一意の) IPv6をIX LANで提供し、ルートサーバーを実行してIPv4およびIPv6ルートをIPv6のみのセッションで交換することにより、本質的にIPv4なしでサービスを提供できます。
したがって、464XLATがモバイルネットワークに対して行ったことは、これがバックボーンネットワークに対して行う可能性を秘めています。
仕組みは?
マルチプロトコルBGP (MP-BGP) は、IPv4セッションでIPv6ルートを発表し、IPv6ネクストホップを持つことをサポートします。RFC8950は、IPv4がIPv6ネクストホップを持つようにこの機能を拡張します。したがって、IPv4アドレスの場合、ネクストホップはIPv6であり、IPv6到達性は通常のNDPを介して行われ、IPv4はNDPによって検出された同じMACアドレスでイーサネットフレームに乗って送信されます。技術的には、RFC8950はコントロールプレーンをIPv6として使用することでコントロールプレーンの決定にのみ影響しますが、データプレーンはそのまま維持されます。IPv4はIPv4のままで、ワイヤ上をIPv4として送信されます。これは、トンネルや464xLATなどとは異なります。
ハードウェアサポート
現在、Juniper JunOS、Cisco IOS XR、Nokia SR OS、Mikrotik、Huawei、BIRD、FRRなど、多くのルーティングプラットフォームで広くサポートされています。したがって、最新バージョンのOSを実行している場合は、ほぼ確実にサポートされています。
デモラボ
ここでは、2つの顧客ルーターを持つ楽しいラボを紹介します。C1とC2は、コンテナラボのプロバイダー ルーターR1-R2-R3を介して接続されています。ここでのすべてのルーターは、オープンソースFRRを実行しています。
C1は、WAN側がR1に面しており、IPv6のみです。これは、IPv6セッションを介してR1に10.0.0.0/24をオリジネートします。
R1とR2はIPv6のみで、インターフェイスにはIPv4は一切ありません(ただし、テーブルにはIPv4ルートを運びます)。
R3はR2とIPv6を持っていますが、C2とはIPv4のみです。したがって、C2は、IPv6展開がなく、IPv4のみの動作を望む典型的なエンタープライズユーザーのようなものです。
R3は100.64.0.0/24を持っており、IPv4テーブル(IPv6隣接性 - R2へ)にオリジネートします。
C2はR3から与えられた100.64.0.2/30に接続されており、IPv4のみで通信します。
C1とC2は、トンネルなしでIPv6のみの部分があるこのネットワークを介して互いに到達できます。
topology.yml
```yaml
name: rfc8950
topology:
nodes:
R1:
kind: linux
image: frr-with-bgpd
binds:
- configs/R1.conf:/etc/frr/frr.conf
R2:
kind: linux
image: frr-with-bgpd
binds:
- configs/R2.conf:/etc/frr/frr.conf
R3:
kind: linux
image: frr-with-bgpd
binds:
- configs/R3.conf:/etc/frr/frr.conf
C1:
kind: linux
image: frr-with-bgpd
binds:
- configs/C1.conf:/etc/frr/frr.conf
C2:
kind: linux
image: frr-with-bgpd
binds:
- configs/C2.conf:/etc/frr/frr.conf
links:
- endpoints: ["C1:eth1", "R1:eth1"]
- endpoints: ["R1:eth2", "R2:eth1"]
- endpoints: ["R2:eth2", "R3:eth1"]
- endpoints: ["R3:eth2", "C2:eth1"]
```
```bash
> clab deploy -t topology.yml
16:37:08 INFO Containerlab started version=0.76.1
16:37:08 INFO Parsing & checking topology file=topology.yml
16:37:09 INFO Creating lab directory path=~/ipv4-over-ipv6/clab-rfc8950
16:37:09 INFO Creating container name=C2
16:37:09 INFO Creating container name=C1
16:37:09 INFO Creating container name=R1
16:37:09 INFO Creating container name=R2
16:37:09 INFO Creating container name=R3
16:37:09 INFO Created link: R3:eth2 ▪┄┄▪ C2:eth1
16:37:09 INFO Created link: C1:eth1 ▪┄┄▪ R1:eth1
16:37:09 INFO Created link: R1:eth2 ▪┄┄▪ R2:eth1
16:37:09 INFO Created link: R2:eth2 ▪┄┄▪ R3:eth1
16:37:09 INFO Adding host entries path=/etc/hosts
16:37:09 INFO Adding SSH config for nodes path=/etc/ssh/ssh_config.d/clab-rfc8950.conf
╭─────────────────┬───────────────┬─────────┬───────────────────╮
│ Name │ Kind/Image │ State │ IPv4/6 Address │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-C1 │ linux │ running │ 172.20.20.6 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::6 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-C2 │ linux │ running │ 172.20.20.4 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::4 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-R1 │ linux │ running │ 172.20.20.2 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::2 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-R2 │ linux │ running │ 172.20.20.8 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::8 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-R3 │ linux │ running │ 172.20.20.5 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::5 │
╰─────────────────┴───────────────┴─────────┴───────────────────╯
Checking C1 for route to C2
C1# show ip bgp 100.64.0.2
BGP routing table entry for 100.64.0.0/24, version 2
Paths: (1 available, best #1, table default)
Advertised to non-peer-group peers: 2001:db8:0:1::1 65501 65502 65503
2001:db8:0:1::1 from 2001:db8:0:1::1 (172.20.20.2) (fe80::a8c1:abff:fe60:5467) (used)
Origin IGP, valid, external, best (First path received)
Last update: Mon Jun 22 18:57:38 2026
C1#
C1 -> C2 trace
C1# traceroute 100.64.0.2
traceroute to 100.64.0.2 (100.64.0.2), 30 hops max, 46 byte packets
1 clab-rfc8950-R1.clab (172.20.20.2) 0.004 ms 0.004 ms 0.002 ms
2 clab-rfc8950-R2.clab (172.20.20.8) 0.002 ms 0.003 ms 0.003 ms
3 clab-rfc8950-R3.clab (172.20.20.5) 0.002 ms 0.003 ms 0.003 ms
4 100.64.0.2 (100.64.0.2) 0.002 ms 0.006 ms 0.003 ms
C1#
Note: It took IPv4 from the eth0 management interfaces as deployed by Container Lab for TTL exceeded used in the trace.
If I check R1, it has only IPv6 sessions but no IPv6 prefixes
R1# sh bgp ipv6 summary
IPv6 Unicast Summary (VRF default):
BGP router identifier 172.20.20.2, local AS number 65501
VRF-ID 0
BGP table version 0
RIB entries 0, using 0 bytes of memory
Peers 2, using 1434 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
2001:db8:0:1::2 4 64512 151 141 0 0 0 00:39:19 0 0 N/A
2001:db8:0:2::2 4 65502 65 64 0 0 0 00:36:46 0 0 N/A
Total number of neighbors 2
R1#
Checking for IPv4 routes on R1
R1# sh bgp ipv4
BGP table version is 4, local router ID is 172.20.20.2, vrf id 0
Default local pref 100, local AS 64512
Status codes: s suppressed, d damped, h history, * 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
*> 10.0.0.0/24 fe80::a8c1:abff:fe44:afb8 0 0 64512 i
*> 100.64.0.0/24 fe80::a8c1:abff:fed8:5eb5 0 65502 65503 i
Displayed 2 routes and 2 total paths
R1#
Router Configs
Router | Link
R1 | Click here
R2 | Click here
R3 | Click here
C1 | Click here
C2 | Click here