6️⃣

中学生がBGPでIPv6経路交換して遊んでみた(BGPハイジャック対策もしたかった)

に公開

はじめに

前回の記事では、BGP(Border Gateway Protocol)を使ってIPv4の経路交換を行いました。
あれから少しBGPの世界にハマってしまい、今回はついにIPv6の経路交換に挑戦してみました。

今回やること

今回は、IPv6でBGPの経路交換を体験してみます。

前回はIPv4だけの環境で、2つのコンテナ間でBGPピアを張り、経路を交換するところまでやりました。
でも実際のインターネットは、すでにIPv6が普通に使われています。
つまり「BGPを本当に理解した」と言うためには、IPv6でも経路交換を試してみる必要があるってわけです。

やることはシンプルです。

  1. ProxmoxVE上で前回のコンテナと同じような環境を作る。(ubuntu server)
  2. それぞれにIPv6アドレスを設定して、デュアルスタック環境を作る
  3. FRRouting(FRR)でIPv6用のBGPピアを設定
  4. 実際にIPv6経路が交換できるか確認してみる

環境構築

一旦、ASとなるコンテナは普通にインターネットに繋がるコンテナとして作成します。
今回のコンテナのバージョンは以下のとおりです。

root@BGPv6:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 25.04
Release:        25.04
Codename:       plucky
root@BGPv6:~#

そして、FRRoutingをインストールするために以下のコマンドを実行します。

apt update && apt install frr

インストールが完了したら、vmbr2に付け替え、以下のようにIPアドレスを設定します。

AS65001:

AS65002:

IPv6アドレスを設定

IPv6でもBGPを動かすには、2種類のアドレスが必要になります。
1つは「隣のBGPルーターと通信するためのアドレス(ピア用)」、もう1つは「広告(アナウンス)する経路として登録するアドレス(ループバック用)」です。
前者は“BGPの通信用チャンネル”、後者は“BGPで世界に知らせたい住所”みたいな役割を持っています。

今回の実験ではこの構成にしました:

用途 インターフェース BGP1 BGP2
BGPピア同士の接続 eth0 fd00::2/64 fd00::3/64
広告(アナウンス)したい自ネットワーク lo(ループバック) 2001:db8:1::1/64 2001:db8:2::1/64

それを踏まえて、各コンテナで以下を設定します。

AS65001:

ip -6 addr add 2001:db8:1::1/64 dev lo

AS65002:

ip -6 addr add 2001:db8:2::1/64 dev lo

FRR設定ファイルを書く

まず、bgpdを起動するための設定を書きます。設定ファイルの場所は、/etc/frr/daemonsです。

bgpd=no

bgpd=yes

と書き換えます。

設定ファイルの場所は、/etc/frr/frr.confです。

AS65001:

router bgp 65001
 bgp router-id 10.10.10.2
 neighbor fd00::3 remote-as 65002

 address-family ipv6 unicast
  network 2001:db8:1::/64
  neighbor fd00::3 activate
  no bgp ebgp-requires-policy
 exit-address-family

AS65002:

router bgp 65002
 bgp router-id 10.10.10.3
 neighbor fd00::2 remote-as 65001

 address-family ipv6 unicast
  network 2001:db8:2::/64
  neighbor fd00::2 activate
  no bgp ebgp-requires-policy
 exit-address-family

設定したらsystemctl restart frrで再起動します。

ピアリング確認

それぞれのコンテナでvtyshを起動して確認します。

root@BGPv6:~# vtysh

Hello, this is FRRouting (version 10.2.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

BGPv6# show bgp ipv6 summary

IPv6 Unicast Summary:
BGP router identifier 10.10.10.2, local AS number 65001 VRF default vrf-id 0
BGP table version 2
RIB entries 3, using 384 bytes of memory
Peers 1, using 24 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
fd00::3         4      65002         6         6        2    0    0 00:00:34            1        2 N/A

Total number of neighbors 1
BGPv6# show bgp ipv6
BGP table version is 2, local router ID is 10.10.10.2, vrf id 0
Default local pref 100, local AS 65001
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
 *>  2001:db8:1::/64  ::                       0         32768 i
 *>  2001:db8:2::/64  fe80::be24:11ff:fe7e:7e16
                                             0             0 65002 i

Displayed 2 routes and 2 total paths
BGPv6# 

と表示され、見事経路交換に成功しました!!

最後に

今回は、BGPでIPv6の経路交換をしてみました。
IPv4より設定が少し複雑でしたが、実際にピアが確立して経路が流れた瞬間は本当に感動しました。

本当はRPKIでBGPハイジャック対策までやりたかったんですが、ネット上の情報が少なすぎて今回は見送りです。
でも、仕組みを理解できたことで次に挑戦する準備はできた気がします。

ここまで読んでいただいてありがとうございました。Likeもよろしくお願いします。

Discussion