クイックスタート(5分):FRRoutingで大容量DDoSトラフィックを破棄する
深夜2時、PagerDutyのアラートが鳴り響きます。40 GbpsのDNSアンプ攻撃がデータセンター内の単一パブリックIPに殺到し、毎秒600万パケット以上を生成しています。ホストのファイアウォールは機能不全に陥り、CPUのsoftirq負荷は100%に達し、10 Gbpsのアップリンクは完全に飽和。同一サブネット内の正規顧客のトラフィックまで巻き添えを食らって停止しています。
ホストレベルでの悪意あるトラフィックの破棄は、設計上破綻しています。パケットがホストのNICに到達した時点で、トランジット帯域幅とPCIeバスの処理能力はすでに消費し尽くされているからです。Remotely Triggered Black Hole (RTBH) ルーティングは、この根本問題を解決します。BGP Communityタグを付与した単一のルートを広報するだけで、エッジルーターや上位トランジットキャリアに対し、標的となったIP宛てのパケットが内部スイッチに届く前にすべて破棄(ブラックホール化)するよう指示できます。
以下は、Linux上でFRRouting (FRR) を使用してエッジルーターをRTBH破棄ノードとして構成し、最初のブラックホールルートを発動するための、検証済みの5分間セットアップ手順です。
1. 破棄用Next-Hopとエッジポリシーの設定
エッジLinuxルーターでFRRの統合設定シェルを起動します:
vtysh
RFC 5737で予約されているテスト用アドレス(192.0.2.1)への静的ブラックホールルートを追加します。次に、受信したRTBHルートをこの破棄宛先に書き換えるroute-mapを作成します:
configure terminal
! 1. アンカールート: ここ宛てに送信されたトラフィックを破棄するようLinuxカーネルに指示
ip route 192.0.2.1/32 blackhole
! 2. 内部RTBHコミュニティ文字列の一致条件(AS 65001、タグ 666)
bgp community-list standard CL-RTBH permit 65001:666
! 3. Next-Hopの書き換えとルート再エクスポートの抑止
route-map RM-APPLY-BLACKHOLE permit 10
match community CL-RTBH
set ip next-hop 192.0.2.1
set local-preference 500
set community no-export additive
exit
route-map RM-APPLY-BLACKHOLE permit 20
exit
2. コントローラーノードからのブラックホール発動
管理ノードまたはルートインジェクターに切り替えます。エッジルーターとの内部BGPセッション経由で、被害対象のIP(例: 203.0.113.75/32)を広報します:
configure terminal
router bgp 65001
bgp router-id 10.0.0.10
neighbor 10.0.0.1 remote-as 65001
neighbor 10.0.0.1 send-community
!
address-family ipv4 unicast
network 203.0.113.75/32 route-map RM-SET-RTBH
exit-address-family
exit
route-map RM-SET-RTBH permit 10
set community 65001:666
exit
エッジルーター上で ip route を実行し、カーネルルーティングテーブルを確認します:
ip route show 203.0.113.75
Linux FIBにより、ルートがハードウェア/カーネル空間で静かに破棄されていることが確認できます:
blackhole 203.0.113.75 proto bgp metric 20
詳細解説:Destination RTBHとLinuxカーネルの連携動作
本番環境におけるRTBHは、FRRのコントロールプレーンルーティングとLinuxカーネルの転送情報ベース(FIB)という2つのレイヤー間の再帰的Next-Hop解決に依存しています。
通常のルーティングは物理的なネイバーIPを探索しますが、RTBHは意図的に対象のNext-Hopを行き止まりへと誘導します:
- トリガーソース: ネットワーク管理ホストまたは自動コレクターが異常(例: 受信トラフィックが50,000 ppsを超過)を検知します。コミュニティ
65001:666が付与されたiBGPの/32プレフィックス(IPv6の場合は/128)を生成・広報します。 - ボーダールーター: FRRの
bgpdがアップデートを処理します。RM-APPLY-BLACKHOLEポリシーがNext-Hop属性をダミーIP192.0.2.1に書き換え、ローカルプリファレンスを500に設定して、標準テーブルの経路よりも優先されるようにします。 - ZebraとNetlinkの同期:
bgpdは選択されたパスをzebraに渡します。zebraはip route 192.0.2.1/32 blackholeを保持しているため、宛先を破棄シンクとして認識します。ZebraはRTM_NEWROUTENetlinkメッセージを発行し、カーネルFIBにblackhole 203.0.113.75を直接書き込みます。
境界でのハードウェアやカーネルによるパケット破棄が行われない場合、大容量のフラッド攻撃は深刻な損害をもたらします。トランジットキャリアからの95パーセンタイル超過料金はインシデント1回あたり数千ドルに達する可能性があり、ハードウェアスイッチのキューは溢れ、Linuxのコネクショントラッカー(nf_conntrack)のメモリ上限枯渇によってステートフルな通信がシステム全体で遮断されます。
厳格なプレフィックス長フィルターの適用
緊迫した運用中にはミスが起こり得ます。もし誰かが誤って顧客の /24 サブネットをRTBHコミュニティ付きで広報してしまうと、254台のアクティブホストがインターネットから瞬時に消失します。完全一致のホストルートのみを許可することで、BGPポリシーを厳格に保護してください:
! /32の単一ホストルートのみを厳格に許可
ip prefix-list PL-ONLY-HOST-ROUTES permit 0.0.0.0/0 ge 32
! 受信iBGPネイバーポリシーに厳格なマッチングを適用
route-map RM-TRIGGER-IN permit 10
match ip address prefix-list PL-ONLY-HOST-ROUTES
match community CL-RTBH
set ip next-hop 192.0.2.1
set local-preference 500
set community no-export additive
exit
route-map RM-TRIGGER-IN deny 20
exit
router bgp 65001
neighbor 10.0.0.10 route-map RM-TRIGGER-IN in
exit
高度な設定:自動緩和とアップストリームキャリア連携
攻撃の最中に vtysh を手動入力していては、貴重な稼働時間が失われます。FastNetMon、pmacct、Kentikなどの自動検知エンジンを使用すれば、シェルスクリプトフックを介して2秒未満でFRRルートをトリガー可能です。
1. vtyshによるルート注入の自動化
非対話型の vtysh -c 呼び出しにより、直接変更を実行できます。この手法はインシデント対応スクリプトに簡単に組み込めます:
#!/usr/bin/env bash
set -euo pipefail
VICTIM_IP="${1:-}"
ACTION="${2:-add}"
AS_NUM="65001"
if [[ ! "$VICTIM_IP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "使用方法: $0 <ipv4_address> [add|remove]" >&2
exit 1
fi
case "$ACTION" in
add)
vtysh -c "configure terminal" \
-c "router bgp ${AS_NUM}" \
-c "address-family ipv4 unicast" \
-c "network ${VICTIM_IP}/32 route-map RM-SET-RTBH" \
-c "exit-address-family"
logger -t rtbh "[SECURITY] Activated RTBH route for ${VICTIM_IP}"
;;
remove)
vtysh -c "configure terminal" \
-c "router bgp ${AS_NUM}" \
-c "address-family ipv4 unicast" \
-c "no network ${VICTIM_IP}/32 route-map RM-SET-RTBH" \
-c "exit-address-family"
logger -t rtbh "[SECURITY] Cleared RTBH route for ${VICTIM_IP}"
;;
*)
echo "アクションは add または remove を指定してください" >&2
exit 1
;;
esac
スクリプトを実行パスに配置し、ルート注入をテストします:
chmod 750 /usr/local/bin/rtbh-trigger.sh
/usr/local/bin/rtbh-trigger.sh 203.0.113.88 add
2. 上位トランジット(eBGP)へのブラックホール伝播
ローカルでのブラックホール化は内部サーバーの負荷を軽減しますが、物理的な光アップリンクが攻撃で飽和している場合、上位トランジット回線の逼迫を解消することはできません。上位プロバイダーは専用のBGPブラックホールコミュニティを提供しています。RFC 7999の標準コミュニティ(65535:666)や、Lumen/Level3(3356:9999)、Cogent(174:9999)、Arelion/Telia(1299:999)といったベンダー固有のタグを広報できます。
送信eBGPセッションにおいて、内部トリガータグを上位キャリアのコミュニティに変換します:
! 内部RTBHタグをRFC 7999のWell-knownブラックホールコミュニティにマッピング
route-map RM-EBGP-OUT permit 10
match community CL-RTBH
set community 65535:666 additive
exit
route-map RM-EBGP-OUT permit 20
! 通常のアウトバウンドアナウンスの通過を許可
exit
router bgp 65001
neighbor 198.51.100.1 remote-as 64496
neighbor 198.51.100.1 send-community
neighbor 198.51.100.1 route-map RM-EBGP-OUT out
exit
運用のベストプラクティスと検証
- 重要インフラのホワイトリスト化: トリガー自動化ロジック内に明示的な除外リストをハードコードしてください。デフォルトゲートウェイ、Anycast DNSリゾルバー(例: BIND/PowerDNSエンドポイント)、リバースプロキシのVIPは絶対にブラックホール化してはなりません。100,000 ppsでIPが自動破棄される挙動を攻撃者に把握された場合、ドメイン全体をダウンさせるためにDNSサーバーが集中的に狙われる危険性があります。
- 両テーブルでの伝播確認: ルートがBGPコントロールプレーンとOSのFIBの双方に反映されているか確認します:
# BGPパスとコミュニティ属性の検証 vtysh -c "show ip bgp 203.0.113.88/32" # Zebraによる再帰Next-Hopの登録を確認 vtysh -c "show ip route 203.0.113.88" # Linuxカーネル転送パスの照会 ip route get 203.0.113.88カーネルは即座に
RTNETLINK answers: Network is unreachableを返すか、アクティブなblackholeルートを表示するはずです。 - 自動クールダウンウィンドウの適用: 現代の大容量攻撃が連続して続くことは稀で、大抵は10〜20分間パルス状に攻撃した後に標的IPを切り替えます。systemdタイマーやRedis連携のCeleryジョブをスケジューリングし、45〜60分後にブラックホールを自動解除するように設定してください。これにより、手動の対応チケットを起票することなく被害サービスの復旧が可能になります。
- 常にサイレントディスカードを使用: Linuxの
blackholeルートはカーネルメモリ内でパケットを静かに破棄します。DDoS緩和にunreachableやprohibitターゲットを決して使用しないでください。これらの設定はネットワークスタックにICMP Type 3(到達不能)パケットを強制生成させるため、マルチギガビット規模の攻撃下では送信帯域を急速に圧迫・枯渇させる原因となります。

