2026年5月26日
2026年5月26日
BGPの基本とLinuxでのBGP設定(FRRouting):検証環境でピアを張り経路を広報するまで
Linux で BGP を動かすには、FRRouting(FRR)を入れて bgpd を有効にし、vtysh で「自分の AS 番号」「相手のアドレスと AS 番号」「広報する経路」「受け入れと送り出しのポリシー」の4つを設定します。この記事では、BGP の仕組みを必要な範囲で説明したうえで、2台の Linux で eBGP のピアを張り、経路を交換して確認するところまでを手順として示します。つまずきやすい「つながったのに経路が来ない」原因の調べ方も扱います。
BGPの基本
AS と BGP の役割
インターネットは、プロバイダーやデータセンター、大学などがそれぞれ管理するネットワークの集まりです。1つの組織が一貫した方針で運用するネットワークを AS(自律システム)と呼び、AS 番号(ASN)で区別します。BGP は、AS どうしが「自分の先にはこの IP アドレスの範囲がある」という経路情報を交換するためのプロトコルです。
BGP は TCP の 179 番ポートで相手(ピア、ネイバー)と接続し、経路を交換します。OSPF のように隣の機器を自動で見つける仕組みはなく、相手は1つずつ設定します。
- eBGP: 異なる AS の間で使う BGP です。プロバイダーとの接続はこちらです。
- iBGP: 同じ AS の中のルーターどうしで、外から受け取った経路を共有するために使います。
経路の選び方
同じ宛先への経路を複数の相手から受け取ったとき、BGP は経路に付いた属性を順に比べて1つを選びます。主な属性は次のとおりです。
- AS_PATH: その経路が通ってきた AS 番号の列です。短いほど優先されます。自分の AS 番号が含まれる経路は、ループを防ぐために捨てられます。
- LOCAL_PREF: 自分の AS の中で決める優先度です。大きいほど優先されます。「回線 A を主に使う」といった方針はこれで表します。
- NEXT_HOP: その宛先へ送るときの次の転送先です。
- MED: 隣の AS に「こちらの入口を使ってほしい」と伝えるための値です。
比べる順序は実装によって細かく異なり、FRR ではこれらの前に、その機器だけで使う weight という値も比べます。正確な順序は FRR の公式ドキュメントで確認してください。
WordPress の運用で BGP が必要になる場面
一般的な WordPress サイトの運用で BGP を設定することはまずありません。必要になるのは、自前の AS 番号と IP アドレスで複数のプロバイダーにつなぐ場合、エニーキャストを組む場合、データセンター内でサーバーから上位のルーターへ仮想 IP を広報する場合などです。この記事の手順は、そうした設定を理解するための検証環境づくりとして読んでください。
検証環境の構成
同じネットワークにつながった Linux の仮想マシンを2台用意します。アドレスは説明用に予約された範囲(RFC 5737)、AS 番号は私的に使える範囲(16ビットなら 64512〜65534、RFC 6996)を使います。
| R1 | R2 | |
|---|---|---|
| AS 番号 | 65001 | 65002 |
| ピア用アドレス | 192.0.2.1 | 192.0.2.2 |
| 広報する経路 | 198.51.100.0/24 | 203.0.113.0/24 |
本番のネットワークや、インターネットにつながるルーターでは試さないでください。誤った経路を広報すると、自分だけでなく他の組織の通信にも影響します。
FRRouting のインストールと有効化
# Debian / Ubuntu(ディストリビューションのパッケージ)
sudo apt install frr
# 状態の確認
systemctl status frr
ディストリビューションのパッケージは FRR の最新版より古いことがあり、新しい版が必要なら FRR プロジェクトが提供するリポジトリを使う方法があります(2026年10月現在、手順は公式サイトで案内されています)。版によって既定の動作が変わるため、vtysh -c 'show version' で版を確認してから設定してください。
FRR はプロトコルごとに別のデーモンで動きます。BGP を使うには /etc/frr/daemons で bgpd を有効にし、サービスを再起動します。
sudo sed -i 's/^bgpd=no/bgpd=yes/' /etc/frr/daemons
sudo systemctl restart frr
設定は vtysh という専用のシェルで行います。ルーター機器のような操作感で、? を入力すると次に入力できる項目が表示されます。一般ユーザーで使うには frrvty グループへの所属が必要な構成が多いため、まずは sudo vtysh で入ります。
R1 の設定
R1 の vtysh で次のように設定します。R2 も AS 番号・アドレス・経路を入れ替えて同じように設定します。
configure terminal
!
! 広報する経路と受け入れる経路を prefix-list で決める
ip prefix-list LAB-OUT seq 10 permit 198.51.100.0/24
ip prefix-list LAB-IN seq 10 permit 203.0.113.0/24
!
route-map R2-OUT permit 10
match ip address prefix-list LAB-OUT
exit
route-map R2-IN permit 10
match ip address prefix-list LAB-IN
exit
!
! 広報する経路を経路表に載せておく(network の条件を満たすため)
ip route 198.51.100.0/24 blackhole
!
router bgp 65001
bgp router-id 192.0.2.1
neighbor 192.0.2.2 remote-as 65002
neighbor 192.0.2.2 description lab-r2
address-family ipv4 unicast
network 198.51.100.0/24
neighbor 192.0.2.2 route-map R2-IN in
neighbor 192.0.2.2 route-map R2-OUT out
exit-address-family
exit
end
write memory
各設定の意味と、つまずきやすい点は次のとおりです。
- route-map は省略しない: FRR は、eBGP の相手にポリシー(route-map)が設定されていないと、経路を受け入れも送り出しもしない動作が既定になっています(RFC 8212 に沿った動作)。ピアはつながるのに経路が交換されない、という状態の多くはこれが原因です。route-map は上から順に評価され、どの permit にも一致しなかった経路は捨てられます。
- network には経路表の裏付けが必要: FRR の既定では、
networkで指定した経路が経路表に存在しないと広報されません。ここではblackholeの静的経路を置いて条件を満たしています。実際の環境では、その範囲が実際にどこかのインターフェースにつながっているのが普通です。 - router-id を明示する: 指定しないとインターフェースのアドレスから自動で選ばれます。アドレスの変更で ID が変わると混乱のもとになるため、固定しておきます。
- write memory で保存する: 保存しないと、再起動で設定が消えます。保存先は通常
/etc/frr/frr.confです。
動作を確認する
まず、ピアが確立しているかを見ます。
show bgp summary
一覧の右端の列(State/PfxRcd)に数字が出ていれば、接続が確立し、その数の経路を受け取っています。Active や Connect のままなら TCP の接続ができていません。(Policy) と表示される場合は、前述の route-map が設定されていない状態です。
次に、経路の中身と、相手に送っている経路を確認します。
show ip bgp
show ip bgp neighbors 192.0.2.2 advertised-routes
show ip bgp neighbors 192.0.2.2 routes
show ip route bgp
show ip bgp で先頭に *> が付いている経路が、有効かつ最良として選ばれたものです。show ip route bgp に出ていれば、FRR が Linux カーネルの経路表に登録しています。Linux 側からは ip route show proto bgp でも確認できます(表示は iproute2 の版によって異なることがあります)。
route-map を変更した後は、新しいポリシーを経路に適用し直すため、clear ip bgp 192.0.2.2 soft を実行します。soft を付けないとピアが切断されて張り直されるため、本番では注意が必要です。
つながらない・経路が来ないときの調べ方
原因として多いものから順に確認します。
- TCP 179 番が通っていない: 状態が
Activeのままなら、まずこれを疑います。両側のファイアウォールで、相手のアドレスからの 179/tcp を許可しているかを確認し、ss -tn '( sport = :179 or dport = :179 )'で接続の有無を見ます。 - AS 番号やアドレスの食い違い:
remote-asに書いた番号が相手の実際の AS 番号と違うと、接続直後に切断されます。show ip bgp neighbors 192.0.2.2の出力に、最後に切断された理由が表示されるので確認します。 - ポリシーが無い、または一致しない:
(Policy)の表示や、受け取った経路数が0の場合です。prefix-list のアドレスとプレフィックス長が、実際の経路と一致しているかを確認します。 - 広報する経路が経路表に無い:
advertised-routesに出てこない場合は、show ip route 198.51.100.0/24で経路表に載っているかを確認します。 - 直接つながっていない相手: eBGP は既定で、直接つながった相手としか接続しません。間にルーターを挟む構成では
neighbor 192.0.2.2 ebgp-multihop 2のような設定が必要です。
詳しいやり取りを見たいときは、debug bgp neighbor-events を有効にし、FRR のログ(設定により syslog か /var/log/frr/ 配下)を確認します。調べ終わったら no debug bgp neighbor-events で戻してください。
なお、BGP で経路を受け取っても、Linux がパケットを転送するには net.ipv4.ip_forward=1 の設定が必要です。また、複数の回線をつなぐ構成では、行きと帰りの経路が異なるとカーネルの逆経路フィルター(rp_filter)でパケットが捨てられることがあります。
本番で使う前に考えること
検証環境で動いても、インターネットに経路を広報するには、技術以外の準備が多く必要です。
- AS 番号と IP アドレスは、地域インターネットレジストリ(日本では JPNIC など)から割り当てを受け、接続するプロバイダーと広報する経路について事前に合意します。
- 経路の正当性を示す RPKI の ROA や、IRR への登録が求められるのが一般的になっています。
- 受け入れる経路の数に上限を設ける
neighbor 192.0.2.2 maximum-prefix 数や、ピアの認証neighbor 192.0.2.2 password 文字列などの保護を設定します。パスワードは推測されにくい値にし、設定ファイルの権限にも注意します。 - 接続中のネットワークや静的経路をまとめて広報する
redistributeは、送り出しの route-map で対象を絞らずに使わないでください。意図しない経路の漏れは、広い範囲の障害につながります。
設定を変えるときは、/etc/frr/frr.conf のバックアップを取り、検証環境で試してから本番に反映します。
まとめ
- BGP は AS どうしが経路を交換するプロトコルで、TCP 179 番で相手を1つずつ設定する。経路は AS_PATH や LOCAL_PREF などの属性で選ばれる。
- FRR では
/etc/frr/daemonsで bgpd を有効にし、vtyshでrouter bgp、neighbor、network、route-map を設定してwrite memoryで保存する。 - eBGP は route-map が無いと経路を交換しない。
networkの経路は経路表に存在している必要がある。 show bgp summaryの状態表示から、TCP、AS 番号、ポリシー、経路表の順に原因を切り分ける。- 本番では AS 番号とアドレスの割り当て、プロバイダーとの合意、RPKI、経路数の上限などの準備が欠かせない。