↔️

中学生がBGPで経路交換して遊んでみた

に公開

はじめに

インターネットの仕組みを知る中で、BGPという仕組みがインターネットを支えていることを知りました。
自宅サーバーを運用する中で、インターネットは欠かせないものです。
今回は、自宅サーバー内で2つのコンテナを作成し、BGPで経路交換をしてみます。

BGPとはなにか

BGP(Border Gateway Protocol)は、ざっくり言うと「インターネットの地図を交換するプロトコル」です。
インターネットは無数のネットワーク(AS: Autonomous System)がつながってできています。BGPは、それぞれのネットワークが「どの経路でどこに行けるか」を互いに伝え合う仕組みを担っています。

普通の家庭用ルーターで使われるルーティングとは違い、BGPはインターネット規模で経路を決めるために使われます。たとえば、あるサーバーにアクセスする経路が複数あった場合、BGPは「どのルートが最適か」を決めてデータを流します。

ポイントは大きく2つ:

  1. 経路情報の交換 – 他のネットワークに「ここに行きたいならこの経路だよ」と教える
  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