BGP Anycast環境におけるHealthcheckデーモン(ExaBGP / Anycast-Healthchecker)構築と障害時経路自動引込SOP
要旨:DNS権威サーバ、NTP、Webキャッシュ配信など、同一IPアドレスを複数拠点で広報して最寄り拠点へトラフィックを誘導するBGPアニーキャスト基盤において、ローカルデーモン停止時の経路自動取り下げは必須である。本SOPでは、Python製軽量BGPインジェクタ「ExaBGP」と死活監視ツール「anycast-healthchecker」を連携させ、ヘルスチェック失敗時にサブ秒でBGP Withdrawを発行する自動退行プロトコルの構築手順を解説する。
1. BGPアニーキャストにおけるブラックホールリスクと自動退行要件
BGPアニーキャスト(RFC 4786)では、世界または国内各拠点(東京・大阪・福岡など)から同一のIPプレフィックス(例: 203.0.113.1/32)をインターネット上流へ広告する。クライアントはBGPルーティングの最短パス(AS-Path長等)に基づき最寄りのノードへ自動誘導される。
しかし、対象ノード上のサービスプロセス(例: BIND/PowerDNSやNginx)が異常終了したにもかかわらずBGP広告を継続した場合、その拠点へ誘導された全ユーザーが接続不能となる致命的なブラックホール障害が発生する。これを防ぐため、ローカルサービスのポート・プロトコル健全性を数秒単位で能動監視し、異常検知時に直ちにBGP経路を取り下げる(Withdraw)自動化デーモンの常駐が絶対条件となる。
2. ExaBGPとanycast-healthcheckerのインストールと構成
Rocky Linux 9 / Ubuntu 24.04環境において、Python仮想環境または公式パッケージよりExaBGPおよびanycast-healthcheckerを導入する。
# ExaBGPおよびanycast-healthcheckerの導入
python3 -m venv /opt/anycast
/opt/anycast/bin/pip install exabgp anycast-healthchecker
# /etc/exabgp/exabgp.conf の設定
neighbor 192.0.2.254 {
router-id 192.0.2.11;
local-address 192.0.2.11;
local-as 65001;
peer-as 65001;
api {
processes [ anycast-check ];
}
}
process anycast-check {
run /opt/anycast/bin/anycast-healthchecker --stdout;
encoder text;
}
3. ヘルスチェック判定ロジックとBGP Withdrawの実務検証
anycast-healthcheckerの設定ファイル /etc/anycast-healthchecker.d/dns.conf において、実際のDNS応答(Aレコードクエリ成功)を検証条件に設定する。
[DEFAULT] interface = lo check_interval = 2 check_timeout = 1 check_rise = 2 check_fall = 2 [dns-service] check_cmd = /usr/bin/dig @127.0.0.1 -p 53 health.example.jp +time=1 +tries=1 prefix = 203.0.113.1/32
検証手順として、ローカルDNSサービスを手動停止(systemctl stop pdns)させた際、2回の判定失敗(計4秒)以内にExaBGP経由で withdraw route 203.0.113.1/32 が上流ルータへ送信され、隣接ノードへトラフィックが迂回することを確認する。