中学生がBGPで経路交換して遊んでみた
はじめに
インターネットの仕組みを知る中で、BGPという仕組みがインターネットを支えていることを知りました。
自宅サーバーを運用する中で、インターネットは欠かせないものです。
今回は、自宅サーバー内で2つのコンテナを作成し、BGPで経路交換をしてみます。
BGPとはなにか
BGP(Border Gateway Protocol)は、ざっくり言うと「インターネットの地図を交換するプロトコル」です。
インターネットは無数のネットワーク(AS: Autonomous System)がつながってできています。BGPは、それぞれのネットワークが「どの経路でどこに行けるか」を互いに伝え合う仕組みを担っています。
普通の家庭用ルーターで使われるルーティングとは違い、BGPはインターネット規模で経路を決めるために使われます。たとえば、あるサーバーにアクセスする経路が複数あった場合、BGPは「どのルートが最適か」を決めてデータを流します。
ポイントは大きく2つ:
- 経路情報の交換 – 他のネットワークに「ここに行きたいならこの経路だよ」と教える
- 経路選択の最適化 – 複数の経路がある場合、最適なルートを選ぶ
つまり、BGPは「インターネットを動かす大きな交通整理係」みたいなものです。
この記事では、このBGPを自宅サーバー内のコンテナ同士で体験してみます。実際に経路交換をしてみると、ネットワークがどうやって情報をやり取りしているのか、肌感覚で理解できます。
内部ブリッジを作る
今回は、ProxmoxVE内に2つのコンテナを作成し、そのコンテナ専用の内部ネットワークを使用します。
ブリッジの設定は以下の通りにしました。
コンテナを作る & 必要なソフトウェアをインストール
とりあえず、FRRoutingをインストールしたいので、内部ブリッジを割り当てる前に一旦インターネットに繋がるブリッジを接続してコンテナを作成します。OSはUbuntu 24.10です。
次に、以下のコマンドでFRRoutingをインストールします。
apt update && apt install frr
実行できたら、もうインターネットは使わないのでブリッジを先程作った内部ネットワークに変更します。
1台目のコンテナは、以下のように設定しました。
インストール後、/etc/frr/daemons
で、bgpd=yes
のようにしてsystemctl restart frr
します。
完了したら、このコンテナをクローンして2台目を作ります。
スナップショットを作成→コンテナをシャットダウン→クローンです。
1台目のコンテナには、以下のIPアドレスを設定します。10.10.10.2/24
2台目のコンテナには、以下のIPアドレスを設定します。10.10.10.3/24
設定ファイルを書く
ここまで来たら、あとは設定ファイルを書くだけです。
設定ファイルの場所は/etc/frr/frr.conf
です。
コンテナ1にはこう書きます。
router bgp 65001
bgp router-id 10.10.10.2
neighbor 10.10.10.3 remote-as 65002
network 192.168.1.0/24
コンテナ2にはこう書きます。
router bgp 65002
bgp router-id 10.10.10.3
neighbor 10.10.10.2 remote-as 65001
network 192.168.2.0/24
次に、ルーティングテーブルにIPを載せるために以下のコマンドを2つのコンテナで実行します。
コンテナ1: ip addr add 192.168.1.1/24 dev eth0
コンテナ2: ip addr add 192.168.2.1/24 dev eth0
書き込めたら、両方systemctl restart frr
してfrrを再起動します。
BGPピアできたか確認する
ここまで来たらあとは確認するだけです。以下のコマンドで確認できます。
まず、以下のようにしてFRRデーモン用のシェルを立ち上げます。
root@BGP1:~# vtysh
Hello, this is FRRouting (version 10.0.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
BGP1#
そして、以下のコマンドを打ちます。
show ip bgp summary
root@BGP1:~# vtysh
Hello, this is FRRouting (version 10.0.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
BGP1# show ip bgp summary
IPv4 Unicast Summary:
BGP router identifier 10.10.10.2, local AS number 65001 VRF default vrf-id 0
BGP table version 1
RIB entries 1, using 96 bytes of memory
Peers 1, using 20 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
10.10.10.3 4 65002 6 6 1 0 0 00:03:14 (Policy) (Policy) N/A
Total number of neighbors 1
BGP1# show ip bgp
BGP table version is 1, 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, * 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
*> 192.168.1.0/24 0.0.0.0 0 32768 i
Displayed 1 routes and 1 total paths
BGP1#
しかし、Policyと書いてあり、ピアリングはできているものの経路交換ができていないようです...
解決した方法
/etc/frr/frr.conf
に、以下のように設定を付け足しました。
router bgp 65001
bgp router-id 10.10.10.2
neighbor 10.10.10.3 remote-as 65002
network 192.168.1.0/24
no bgp ebgp-requires-policy
no bgp ebgp-requires-policy
の部分です。
↓結果↓
root@BGP1:~# vtysh
Hello, this is FRRouting (version 10.0.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
BGP1# show ip bgp summary
IPv4 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 288 bytes of memory
Peers 1, using 20 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
10.10.10.3 4 65002 6 6 2 0 0 00:01:27 1 2 N/A
Total number of neighbors 1
BGP1# show ip bgp
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, * 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
*> 192.168.1.0/24 0.0.0.0 0 32768 i
*> 192.168.2.0/24 10.10.10.3 0 0 65002 i
Displayed 2 routes and 2 total paths
BGP1#
と表示され、見事経路交換に成功しました。
最後に
これで、インターネットの仕組みを完全に理解しました。(いぇーい)
そして、最初にも書いたように、私はBGPをちょっとだけ理解した中学生です。
もし間違いがありましたら、コメントでご享受いただけると幸いです。
ぜひLikeとフォローもしていただけると嬉しいです。
最後まで見ていただきありがとうございました。
Discussion