🐯

Cloud Router で AS PATH Prepend を実装する

2024/05/29に公開

はじめに

記事の目的

こんにちは、クラウドエース SRE部 に所属している\textcolor{red}{赤髪}がトレードマークの Shanks です。
好きなプロダクトは Cloud Router です。

以前執筆した「Cloud Router の BGP ルート ポリシー」機能の解説記事はすでにご覧になりましたか?
こちらの記事では BGP で学習したルートのフィルタリングについてご紹介いたしました。

本記事では、上記の姉妹記事の建付けで、「AS PATH Prepend」機能について解説いたします。
上記記事とあわせてぜひ経路制御の手法としてご活用ください。

ターゲットとなる読者層

  • Cloud Interconnect を設計・運用・計画している方
    • Google Cloud と オンプレミス / 他クラウド を VPN で接続し、経路制御を行っている
  • Cloud VPN を設計・運用・計画している方
    • Google Cloud と オンプレミス / 他クラウド を VPN で接続し、経路制御を行っている
    • VPC ネットワーク と VPC ネットワーク を VPN で接続し、経路制御を行っている
  • BGP と周辺技術の知識を有する方

記事のゴール

  • 新機能「BGP ルート ポリシー」を使って経路制御の新しい方法を学ぶ

Cloud Router とは

Cloud Router とは、BGP(Border Gateway Protocol)を使用して対向ルータと Google Cloud との間でルート情報を広報する完全分散型のマネージド サービスです。
BGP スピーカーおよびレスポンダーとして機能するため、Google Cloud における BGP を利用した相互接続では必須のプロダクトです。

簡単な説明は以下の姉妹記事でも記載していますので、本記事では省略させていただきます。

高可用性の落とし穴

loop
上述したとおり、Cloud Router は VPN 接続や、閉域網を利用した相互接続において利用される BGP スピーカーおよびレスポンダーとして機能します。

通常、このように異なるネットワーク空間を相互接続する場合、可用性を高めるために複数回線で冗長構成を採用するケースが一般的です。
このような冗長構成を採用することで、安定した信頼性のある回線を利用することが大きなメリットとしてあげられます。

しかし、このような BGP 経路の冗長構成は時として悩みの種となります。
それは上記姉妹記事でもお伝えしているように「ルーティング ループ」を引き起こす可能性がある、ということです。
ルーティング ループが発生しなくても、意図しない経路が優先される可能性があります。

これは「Cloud Router のソフトウェア タスクは AS PATH Prepend を考慮するが、コントロール プレーンは AS PATH Prepend を考慮しない」という仕様に直結しています。

AS PATH Prepend とは

BGP におけるアルゴリズムとして、AS PATH と呼ばれる属性値の長さを元に最適な経路を決定します。
AS PATH とは、宛先ネットワークに到達するために経由する AS(自律システム)のリストからなる PATH のことです。
つまり、AS PATH が短ければ短いほど最短経路として扱われ優先的に利用されます。

このとき、不要な経路や重複する優先度の経路を制御するためには、優先されてほしい経路よりも優先度を下げる必要があります。

この優先度を制御する仕組みとして活用されるのが AS PATH Prepend です。
AS PATH Prepend とは、経路情報を伝播する際に、AS PATH を意図的に付け足し長くする機能です。

主な用途として、トラフィック エンジニアリングや、フェイルオーバー時の経路制御に使われます。

詳細は以下の参考情報をご確認ください。

新機能「BGP ルート ポリシー」で AS PATH Prepend を実装する

release_note

上述のとおり、Cloud Router に限らず、BGP を扱ううえで優先経路制御というのは非常に重要なポイントです。
今までは Cloud Router で AS PATH Prepend 機能が利用できず、対向ルータ側で制御するなどなんらかの対応措置が必要でした。

本記事で紹介する「BGP ルート ポリシー」機能を使えばその課題を解決することができます。
この機能の1つとして、AS PATH Prepend を設定することができます。

また、受信と送信の両方で設定することができるため、Google Cloud と対向の双方にメリットがあります。

  • MED値 の変更による優先経路選択
  • 不要な BGP ルートのフィルタリング
  • AS PATH Prepend による経路制御

BGP ルート ポリシーでできること

BGP ルート ポリシーは IP アドレス ベースでのポリシーを設定できます。
詳細については姉妹記事にまとめていますのでぜひご覧ください。

試してみる

環境用意

検証環境は上述の姉妹記事で用意したものを再利用しました。
Cloud VPN 同士で BGP 接続をする環境を実際に構築し、動作を確認しました。

BGP ルート ポリシーを作成する

BGP ルート ポリシー は CEL(Common Expression Language)を用いて定義します。
定義している句とその値についての説明は、上述の姉妹記事で掲載していますのでぜひご覧ください。

# Add BGP AS PATH Prepend within the range
# 192.168.99.0/24
name: add-as-path-prepend
type: ROUTE_POLICY_TYPE_EXPORT
terms:
- priority: 1
  match:
    expression: >
      destination == '192.168.99.0/24'
  actions:
  - expression: asPath.prependSequence([64514, 64514])

今回は、以下のルールを定義しました。

  • 送信経路を制御するポリシー
  • 「192.168.99.0/24」を広告したときを条件とする
  • 条件に合致した場合、AS PATH の先頭に値を追加する(AS PATH Prepend)
  • ルールの優先度は1(非常に高い)

通常、AS PATH Prepend で追加される ASN は、自ネットワークの ASN とするのが一般的です。
今回のケースでは、64514 という ASN が元々設定されているため、同じく ASN64514 を2つ追加してみましょう。
成功すれば、以下のような AS PATH となると予想されます。

64514 64514 64514

ポリシーを設定する

CEL で記述した BGP ルート ポリシーを Cloud Router に設定するには、Cloud Router の BGP ピアに適用する必要があります。

手順やコマンドは上述の姉妹記事にあるフィルタリング機能と同様ですので本記事では省略いたします。

Cloud Router のルーティングテーブルを確認する

Cloud Router が学習しているルート情報のうち、 192.168.99.0/24 のルート情報に付随する AS PATH を確認します。

Before

Before では asPaths には1つだけ ASN(AS番号)がセットされていることが確認できます。

$ gcloud compute routers get-status ${Cloud Router 名} \
  --project ${プロジェクトID} \
  --region ${リージョン} \
  --format json \
  | jq '.result.bestRoutes[] | select(.destRange == "192.168.99.0/24") | .asPaths[]'

# BGP Peer ①
{
  "asLists": [
    64514
  ],
  "pathSegmentType": "AS_SEQUENCE"
}
# BGP Peer ②
{
  "asLists": [
    64514
  ],
  "pathSegmentType": "AS_SEQUENCE"
}

After

After では CEL で定義した ASN が追加され、AS PATH が長いものへと変化していることが確認できます。
これにより、BGP の最適経路を導き出すアルゴリズムが動作した際に、より短い AS PATH が最適経路として、より長い AS PATH が後回しの経路として利用されます。

また、本記事では Cloud Router 同士を BGP 接続しているため、ここでは ポリシーを定義していない方の Cloud Router を確認 する点に注意してください。

$ gcloud compute routers get-status ${Cloud Router 名} \
  --project ${プロジェクトID} \
  --region ${リージョン} \
  --format json \
  | jq '.result.bestRoutes[] | select(.destRange == "192.168.99.0/24") | .asPaths[]'

# BGP Peer ①
{
  "asLists": [
    64514,    # <-┬  ASN が追加されている
    64514,    # <-┘
    64514
  ],
  "pathSegmentType": "AS_SEQUENCE"
}
# BGP Peer ②
{
  "asLists": [
    64514
  ],
  "pathSegmentType": "AS_SEQUENCE"
}

まとめ

本記事では以前執筆した「Cloud Router で BGP の学習ルートをフィルタリングする新機能の紹介」という記事の姉妹記事として追加執筆しました。

Cloud Router で BGP の経路制御を扱う際は、フィルタリングだけでなく「どの経路を主系副系として扱うのか」にもフォーカスをあてていく必要があります。
本機能をぜひ活用して、安定した信頼ある相互接続を実現してください。

Google Cloud との相互接続で迷えるネットワークエンジニアの方々の一助となれば幸いです。

Discussion