2 minutes
Modern BGP Operations: Dual-Stack & RPKI Implementation via GoBGP
GoBGPを利用して、自身のAS(AS154486)からIPv4/IPv6両方の経路を広報し、さらにRPKIによる経路検証を導入する手順をまとめます。GoBGPは設定がTOML形式で扱いやすく、systemdとの組み合わせで運用を自動化しやすいのが利点です。
1. 環境情報(パラメーター)
構築にあたり、使用する変数および固定値を以下に定義します。実際の運用環境に合わせて適宜書き換えてください。 ※本記事内のIPアドレスやパスワードはドキュメント用のダミー値に置き換えています。
| 項目 | 設定値(サンプル) | 備考 |
|---|---|---|
| 自組織AS番号 | 154486 |
自身のAS番号 |
| Router ID | 192.168.100.1 |
自身の識別子(IPv4形式) |
| Neighbor IPv4 | 10.0.0.1 |
接続先(Peer)のIPv4アドレス |
| Neighbor IPv6 | 2001:db8::1 |
接続先(Peer)のIPv6アドレス |
| Peer AS | 64515 |
接続先のAS番号 |
| MD5 Password | DUMMY_PASSWORD |
BGPセッション認証用パスワード |
| 広報IPv4セグメント | 192.168.1.0/24 |
外部へ広告する自社IPv4経路 |
| 広報IPv6セグメント | 2001:db8:1234::/48 |
外部へ広告する自社IPv6経路 |
2. GoBGPのインストール
GoBGPはシングルバイナリで動作するため、GitHubのリリースから取得して配置するだけで完了します。
- バイナリのダウンロード(環境に合わせてアーキテクチャを選択)
wget [https://github.com/osrg/gobgp/releases/download/v3.30.0/gobgp_3.30.0_linux_amd64.tar.gz](https://github.com/osrg/gobgp/releases/download/v3.30.0/gobgp_3.30.0_linux_amd64.tar.gz)
tar -zxvf gobgp_3.30.0_linux_amd64.tar.gz
- パスの通った場所へ移動
sudo mv gobgp gobgpd /usr/bin/
3. 設定ファイルの作成 (/etc/gobgp/gobgp.conf)
- RPKIサーバー(Cloudflare)との連携、Neighbors設定、および意図しない経路広報(Route Leak)を防ぐためのポリシー定義を記述します。
[global.config]
as = 154486
router-id = "192.168.100.1"
# --- RPKIサーバー設定 (Cloudflare) ---
[[rpki-servers]]
[rpki-servers.config]
address = "rtr.rpki.cloudflare.com"
port = 8282
[zebra.config]
enabled = false
# --- Neighbors (IPv4) ---
[[neighbors]]
[neighbors.config]
neighbor-address = "10.0.0.1"
peer-as = 64515
auth-password = "DUMMY_PASSWORD"
[[neighbors.afi-safis]]
[neighbors.afi-safis.config]
afi-safi-name = "ipv4-unicast"
[neighbors.apply-policy.config]
import-policy-list = ["policy-in"]
export-policy-list = ["policy-out"]
# --- Neighbors (IPv6) ---
[[neighbors]]
[neighbors.config]
neighbor-address = "2001:db8::1"
peer-as = 64515
auth-password = "DUMMY_PASSWORD"
[[neighbors.afi-safis]]
[neighbors.afi-safis.config]
afi-safi-name = "ipv6-unicast"
[neighbors.apply-policy.config]
import-policy-list = ["policy-in"]
export-policy-list = ["policy-out"]
# --- ポリシー定義 ---
# 全ての受信経路を許可
[[policy-definitions]]
name = "policy-in"
[[policy-definitions.statements]]
[policy-definitions.statements.actions]
route-disposition = "accept-route"
# 自社ネットワークのみを広報し、それ以外を拒否
[[policy-definitions]]
name = "policy-out"
[[policy-definitions.statements]]
[policy-definitions.statements.conditions.match-prefix-set]
prefix-set = "my-networks"
[policy-definitions.statements.actions]
route-disposition = "accept-route"
[[policy-definitions.statements]]
[policy-definitions.statements.actions]
route-disposition = "reject-route"
[defined-sets]
[[defined-sets.prefix-sets]]
prefix-set-name = "my-networks"
[[defined-sets.prefix-sets.prefix-list]]
ip-prefix = "192.168.1.0/24"
[[defined-sets.prefix-sets.prefix-list]]
ip-prefix = "2001:db8:1234::/48"
4. systemdサービスの設定 (/etc/systemd/system/gobgpd.service)
OS起動時に自動でデーモンを立ち上げ、自身の経路(RIB)を注入するように設定します。ExecStartPost を使い、注入時に origin igp 属性を明示的に付与するのがポイントです。
[Unit]
Description=GoBGP Daemon
After=network.target
[Service]
Type=exec
ExecStart=/usr/bin/gobgpd -f /etc/gobgp/gobgp.conf
# 起動直後に待機し、自社経路をOrigin IGPとして注入
ExecStartPost=/usr/bin/sleep 5
ExecStartPost=-/usr/bin/gobgp global rib add 192.168.1.0/24 origin igp
ExecStartPost=-/usr/bin/gobgp global rib add 2001:db8:1234::/48 -a ipv6 origin igp
TimeoutStartSec=60
Restart=on-failure
User=root
[Install]
WantedBy=multi-user.target
- 設定後、サービスを有効化して起動します。
sudo systemctl daemon-reload
sudo systemctl enable --now gobgpd
5. 動作確認
実装後、gobgp コマンドを使用して各ステータスが正常であることを確認します。
- ピアリング状態の確認
- State が Establ (Established) となり、経路(Received)が正しくカウントされていることを確認します。
$ gobgp neighbor
Peer AS Up/Down State |#Received Accepted
10.0.0.1 64515 00:05:12 Establ | 1034175 1034174
2001:db8::1 64515 00:05:17 Establ | 234658 234657
- RPKIセッションの確認
- RPKIキャッシュサーバーと Up 状態で同期し、IPv4/IPv6それぞれのレコードが取得できているか確認します。
$ gobgp rpki server
Session State Uptime #IPv4/IPv6 records
rtr.rpki.cloudflare.com:8282 Up 00:06:37 646702/182397
- 自身の広報経路(RIB)の確認
- 注入した経路に I* (Internal/Valid) フラグが立ち、属性に {Origin: i} が含まれていることを確認します。
### IPv4の確認
$ gobgp global rib 192.168.1.0/24
Network Next Hop AS_PATH Age Attrs
I*>192.168.1.0/24 0.0.0.0 00:00:15 [{Origin: i}]
IPv6の確認
$ gobgp -a ipv6 global rib 2001:db8:1234::/48
Network Next Hop AS_PATH Age Attrs
I*>2001:db8:1234::/48 :: 00:07:38 [{Origin: i}]
- 受信経路の検証(RPKI Valid)
- 外部から受信した経路(例:1.1.1.0/24)を確認し、行頭に V (Valid) が付与されていれば、RPKIによる正当性確認が成功しています。
$ gobgp global rib 1.1.1.0/24
Network Next Hop AS_PATH Age Attrs
V*>1.1.1.0/24 10.0.0.1 64515 65534 20473 13335 00:07:46 [{Origin: i} {Communities: ...}]
6. まとめ
GoBGPを活用することで、管理しやすく堅牢なBGP環境を構築できました。特にポリシー設定によるルートリーク対策と、RPKIによる経路検証を組み合わせることで、個人AS運用においてもプロフェッショナルに近い安全性を確保することが可能です。