【実務・中級編】 SASEエッジにおけるBGP(Border Gateway Protocol)ルーティングプレーンとルートリーク対策 – ゼロトラスト&エンタープライズセキュリティ実践ガイド

SASE環境の「出口」を守れ:BGPルーティング設計とルートリーク対策の現場論

「インターネットは信頼できない場所である」――ゼロトラストの基本原則ですが、それを支えるSASE(Secure Access Service Edge)のインフラを構築する際、我々ネットワークエンジニアが直面するのは、物理的な境界の消滅と、ダイナミックルーティングの魔物です。

特に、拠点(SD-WAN)とSASE PoPをBGPで接続する際、何も考えずに経路をアドバタイズすれば、あっという間に自社のトラフィックが意図しないASを駆け巡る「ルートリーク」の罠に落ちます。今日は、机上の空論ではない、現場の泥臭い知見を共有しましょう。

—

1. AS番号設計とBGPの「距離感」をどう制御するか

SASE環境では、各拠点のSD-WANルータは、SASE PoPに対してプライベートAS(64512-65534)を用いてBGPピアリングを張るのが一般的です。ここで重要なのは、「自分の経路がどこまで伝播するか」を制御するポリシーです。

なぜルートリークが起きるのか

多くの現場で、「とりあえず全経路を流し込む」という設定が見受けられます。しかし、SASE PoP側で受診した経路が、別の拠点へ再配布(Redistribution)されたり、さらにはインターネットのフルルートを誤って吸い込んでしまうと、ネットワークは瞬時に破綻します。

現場のベストプラクティス:Prefix-Listの厳格化

BGPの設定には、必ず prefix-list を適用し、許可するサブネットを「1ビット単位」で指定してください。

# Cisco IOS風の設定例:許可リストの定義
ip prefix-list PL_FROM_BRANCH permit 10.10.0.0/16 ge 24 le 28
!
route-map RM_SASE_IN permit 10
 match ip address prefix-list PL_FROM_BRANCH
 set community 65000:100  # 自社の属性タグを付与し、後続のポリシーで識別可能にする
!
# BGPピアへの適用
router bgp 65001
 neighbor 192.168.1.1 route-map RM_SASE_IN in

—

2. ルートリークを防ぐための「コミュニティ」活用術

BGPの威力を最大限に発揮するのは、単なる接続性ではなく、community 属性による経路制御です。私は常に、拠点ごとに特定のコミュニティ値を付与し、SASE PoP側で「この経路はどの拠点から来たのか」を明確にタグ付けするようにしています。

もし、ある拠点が誤って学習した別拠点のルートを再度広告(再配布)しようとした場合、このコミュニティ値がバリケードになります。

経路の伝播を抑止するフィルター(PoP側の設定イメージ)

# 誤った経路広告を弾くためのRoute-Map
route-map RM_SASE_OUT deny 5
 match community NO_ADVERTISE_TAG  # 特定のタグが付いた経路は外に出さない
!
route-map RM_SASE_OUT permit 10
 match community MY_ENTERPRISE_TAG # 自社内経路のみを許可

—

3. 実践:CASBとAPIを通じた可視化

SASE環境下での通信フローをデバッグする際、単に show ip bgp を眺めるだけでは不十分です。今やトラフィックの多くはSaaSに向いています。CASB(Cloud Access Security Broker)が介在する通信では、HTTPヘッダーに特定のトークンが付与されているか確認することがトラブルシューティングの鍵となります。

以下は、PythonでSASE経由の通信を確認するデバッグ用スクリプトの断片です。

import requests

def check_sase_path(url):
    # SASE経由であるかを検証するため、特定のヘッダーを注入してレスポンスを確認
    headers = {
        'User-Agent': 'Security-Audit-Bot/1.0',
        'X-SASE-Debug': 'True'
    }
    try:
        response = requests.get(url, headers=headers, timeout=5)
        # SASEのPoPで付与されるはずのヘッダーを確認
        if 'X-SASE-PoP-Location' in response.headers:
            print(f"成功: PoP拠点 {response.headers['X-SASE-PoP-Location']} を通過しました")
        else:
            print("警告: 直接通信、またはSASEを通っていない可能性があります")
    except requests.exceptions.RequestException as e:
        print(f"通信エラー: {e}")

check_sase_path("https://api.internal-app.example.com")

—

4. エンジニアへの助言:デバッグの心構え

最後に、現場で障害に遭遇した際の「三種の神器」を伝授します。

1. debug ip bgp updates は諸刃の剣: 本番環境でこれを叩くときは、必ずログバッファのサイズを確認し、フィルタリングをかけてください。さもないと、ルータのCPU負荷が急上昇し、通信が停止する「自己攻撃」に陥ります。
2. AS-Pathの可視化: show ip bgp regexp ^$ を使い、自分自身のASから発生した経路のみを抽出する癖をつけましょう。AS-Pathが長すぎる経路は、ルートリークの兆候です。
3. ベンダーのPoP情報を信用しすぎない: SASEベンダーの管理画面で「接続中」となっていても、BGPのステータスが Idle や Active を繰り返していることは多々あります。必ずCLIでピアリングの HoldTime や Keepalive タイマーが適切か(推奨は30秒/90秒)を確認してください。

ゼロトラストは、境界をネットワーク機器から「アイデンティティとポリシー」へ移す作業ですが、その土台となるBGPルーティングが腐っていては、どれほど高度なCASBポリシーも無意味です。

まずは自身のルータの show ip bgp neighbors を叩くところから、今日の業務を始めてみてください。その一行が、ネットワークの平和を守る第一歩です。

コメント

タイトルとURLをコピーしました