HA VPNの経路制御で使うVPNトンネルとCloud RouterとBGPピアの関係

HA VPNを理解するときは、VPNトンネル、HA VPN gateway、Cloud Router、BGPピアを分けて見る必要があります。

HA VPNは、オンプレミスとGoogle Cloud VPCをつなぐVPN経路を高可用にする構成です。ただし「VPNトンネルを2本張る」という説明だけだと、Cloud RouterやBGPピアがなぜ出てくるのかが見えにくくなります。

本記事では、HA VPNの接続部分と経路制御に絞って、各部品の役割を整理します。Cloud VPN全体の可用性パターンは『Cloud VPNの可用性: HA VPN・multi-region VPN・各region gateway構成』で扱っています。

HA VPNの構図

まず、HA VPNの構図を押さえます。基本形は、GCP側のHA VPN gatewayからオンプレ側のVPN deviceへ、VPNトンネルを2本張る構成です。

最初に全体の位置関係を見ます。

flowchart TB
  subgraph region["Region A"]
    havpn["HA VPN gateway<br/>interface 0 / 1"]
    router["Cloud Router<br/>BGP"]
    vpc["VPC"]
    havpn <--> router
    router --> vpc
  end

  subgraph onprem["On-prem network"]
    devA["VPN device A"]
    devB["VPN device B"]
    lan["On-prem LAN"]
    devA --- lan
    devB --- lan
  end

  havpn <-->|"VPNトンネル 0"| devA
  havpn <-->|"VPNトンネル 1"| devB

この図の要素を分解すると、次のようになります。

要素役割
HA VPN gatewayGCP側でVPNトンネルを張るためのリソース
interface 0 / 1HA VPN gatewayにあるVPNトンネル用の接続点
VPN device A/Bオンプレ側のVPNエンドポイント
VPNトンネル 0/1GCP側とオンプレ側をつなぐIPsecの暗号化経路
Cloud RouterGCP側で経路情報を扱うリソース
BGPルーター同士が経路情報を交換するプロトコル

IPsecは、IP通信を暗号化してVPNトンネルを作る仕組みです。

HA VPNはGoogle CloudのCloud VPN機能名です。オンプレ側に同じ名前のHA VPN gatewayがあるとは限りません。本番のオンプレ側では、ルーター、Firewall、VPN専用機器、仮想アプライアンスなどがVPN deviceとして登場します。

HA VPN gatewayのinterface 0interface 1は、GCP側でVPNトンネルを張るための接続点です。それぞれ外部IPを持ちます。GCP内部のVMへ出る出口ではありません。

この図で冗長化しているのは、オンプレネットワークとGoogle Cloud側をつなぐVPN経路です。GCP内のVMやアプリそのものを冗長化しているわけではありません。

前提:VPNは外部IPで接続して内部IPで通信する

ここはHA VPN固有の話ではなく、VPN全般の前提です。

VPNトンネル自体は、VPNエンドポイントの外部IP同士で作ります。HA VPNでも同じで、GCP側のHA VPN gatewayとオンプレ側のVPN deviceの外部IP同士でIPsecトンネルを作ります。

観点使うIP
VPNトンネルの外側VPNエンドポイントの外部IPHA VPN gatewayの外部IPとVPN deviceの外部IP
VPNで運ぶ中身オンプレとVPCの内部IP192.168.1.x10.1.1.x

VPNなしでGCP内のVMへインターネット越しに直接アクセスする場合は、GCP側にも外部から到達できる入口が必要になります。VPNを使うと、外部IP同士で作ったIPsecトンネルの中に、内部IP宛ての通信を入れて運べます。

flowchart TB
  subgraph logical["通信として見える宛先"]
    direction LR
    opvm["On-prem server<br/>192.168.1.10"]
    vm["GCP VM<br/>10.1.1.2"]
    opvm -. "internal IP通信" .-> vm
  end

  subgraph vpn["実際に通るVPN経路"]
    direction LR
    dev["VPN device<br/>external IP"]
    gw["HA VPN gateway<br/>external IP"]
    dev -->|"IPsecトンネル"| gw
  end

  logical -. "この通信を包んで運ぶ" .-> vpn

この図では、通信としては192.168.1.10から10.1.1.2へ向かいます。ただし、その内部IP通信がインターネット上をそのまま流れるわけではありません。下段のように、VPN deviceとHA VPN gatewayの外部IP同士でIPsecトンネルを作り、その中に内部IP通信を入れて運びます。

Cloud RouterとBGPはVPN経路の行き先を判断する

VPNトンネルを2本作るだけでは、どのIP範囲へどのトンネルで行けるかを動的に判断できません。HA VPNでは、Cloud RouterとBGPがVPN経路の行き先を判断するための経路情報を扱います。

flowchart LR
  subgraph gcp["Google Cloud側"]
    subnet["VPC subnet<br/>10.1.1.0/24"]
    cr["Cloud Router"]
  end

  subgraph onprem["On-prem側"]
    peer["On-prem router<br/>またはVPN device"]
    lan["On-prem subnet<br/>192.168.1.0/24"]
  end

  subnet -. "GCP側にあるIP範囲" .-> cr
  cr <-->|"BGPで経路情報を交換"| peer
  peer -. "オンプレ側にあるIP範囲" .-> lan

BGPは経路情報を交換するプロトコル

BGPはBorder Gateway Protocolの略で、GCP専用の用語ではありません。ルーター同士が「どのIP範囲がどちら側にあるか」を交換するためのプロトコルです。

たとえば、オンプレ側に192.168.1.0/24、GCP側に10.1.1.0/24があるとします。このとき、BGPでは次のような経路情報を交換します。

ルーター相手に知らせる内容
GCP側ルーター10.1.1.0/24はGCP側にある
オンプレ側ルーター192.168.1.0/24はオンプレ側にある

この情報があると、オンプレ側は10.1.1.x宛ての通信をGCP側へ流せます。GCP側も192.168.1.x宛ての通信をオンプレ側へ戻せます。

つまりBGPは、通信を暗号化する仕組みではありません。どのIP範囲へどの経路で行けるかをルーター同士で共有する仕組みです。

Cloud RouterはGCP側でBGPを扱う

Cloud Routerは、GCP側でBGPを使って経路情報を交換するためのregional resourceです。

HA VPNでは、Cloud Routerがオンプレ側のルーターやVPN機器とBGPで経路情報を交換します。

BGPを担当するもの相手に知らせる経路の例
GCP側Cloud Router10.1.1.0/24
オンプレ側オンプレルーターまたはVPN機器192.168.1.0/24

Cloud Routerは、BGP接続が成立すると、自分のVPC側の経路を相手に知らせます。同時に、相手から知らされた経路を学習します。

たとえばGCP側は、オンプレ側から192.168.1.0/24を学習します。その結果、GCP側は192.168.1.x宛ての通信をVPNトンネルへ流せます。

BGPはVPNの暗号化ではなく経路制御を担当する

VPNトンネルとBGPは役割が違います。

部品役割
VPNトンネル外部IP同士で作る暗号化された通信路
BGPどの内部IP範囲へどの経路で行くかを交換する仕組み
Cloud RouterGCP側でBGPを扱うルーターリソース

VPNがあるから必ずBGPが必要、というわけではありません。静的ルートで足りるVPN構成もあります。

HA VPNでは2本のVPNトンネルを使います。片方のVPNトンネルが落ちたときに、落ちた経路を使わず、残ったVPNトンネルへ切り替える必要があります。そのため、HA VPNでは動的ルーティングとしてBGPを使います。

flowchart LR
  router["Cloud Router"]
  peer0["相手ルーター<br/>VPNトンネル 0側"]
  peer1["相手ルーター<br/>VPNトンネル 1側"]

  router <-->|"BGPセッション<br/>VPNトンネル 0上"| peer0
  router <-->|"BGPセッション<br/>VPNトンネル 1上"| peer1

各VPNトンネル上でBGPの経路交換を行うことで、Cloud RouterはどちらのVPNトンネル経由の経路が使えるかを判断できます。

BGPで知らせる経路はサブネットから決まる

Cloud RouterのBGP設定では、通常の基本構成では相手に知らせるサブネット範囲を直接列挙しません。

たとえばGCP側に10.1.1.0/24のサブネットがある場合、そのサブネット範囲はVPCの設定として存在します。Cloud Routerは、そのVPC側の経路をBGPで相手に知らせます。

flowchart LR
  subnet["GCP subnet<br/>10.1.1.0/24"]
  cr["Cloud Router"]
  peer["相手ルーター"]

  subnet -. "VPC側の経路" .-> cr
  cr -->|"BGPで知らせる"| peer

相手側も同じです。オンプレ側に192.168.1.0/24があるなら、オンプレ側ルーターがその経路をGCP側へ知らせます。GCP側Cloud Routerは、それを学習してVPN経由のルートとして扱います。

BGP接続は自分側と相手側の情報で成り立つ

ここまでで、BGPは経路情報を交換するためのプロトコルだと整理しました。ただし、Cloud Routerを作っただけで、自動的にオンプレ側ルーターとBGPを始めるわけではありません。

BGP接続は、Cloud Router側だけを見ても、自分側の情報と相手側の情報に分かれます。Cloud Routerでは、VPNトンネルごとに次の2種類の設定を持ちます。

設定意味
ルーターインターフェースそのVPNトンネル上で、Cloud Router自身が使うBGP用IP
BGPピアそのVPNトンネルの向こう側にいる相手ルーターの情報

peerは「相手」という意味です。つまりBGPピアは、BGPで経路情報を交換する相手ルーター、またはその相手をCloud Routerに登録する設定を指します。

ルーターインターフェースは自分側のBGP設定

Cloud Routerで出てくるルーターインターフェースは、HA VPN gatewayのinterface 0 / 1とは別物です。

Cloud Routerのルーターインターフェースは、特定のVPNトンネル上でBGPを扱うための自分側設定です。

設定項目意味
ルーターインターフェース名Cloud Router上の設定名
VPNトンネルこのBGP設定を紐づけるVPNトンネル
BGP用IPそのVPNトンネル上で自分側が使うBGP用IP

例として、VPNトンネル 0ではGCP側が169.254.0.1を使い、オンプレ側が169.254.0.2を使うようにできます。

flowchart LR
  cr["Cloud Router<br/>169.254.0.1"]
  peer["相手ルーター<br/>169.254.0.2"]

  cr <-->|"BGP<br/>VPNトンネル 0上"| peer

この169.254.0.1は、VMのIPでもVPN gatewayの外部IPでもありません。BGP用の制御通信に使うIPです。

BGPピアは相手ルーターの登録

BGPピアは、Cloud Routerに登録する相手ルーター情報です。

ルーターインターフェースが自分側の設定だとすると、BGPピアは相手側の設定です。

設定項目意味
BGPピア名BGPピア設定の名前
ルーターインターフェースどのルーターインターフェースを使うか
相手IPアドレス相手ルーターのBGP用IP
相手ASN相手ルーターのASN

ASNはAutonomous System Numberの略で、BGPで使うネットワークの識別番号です。GCP側とオンプレ側で、それぞれ異なるASNを使います。

VPNトンネル 0で見ると、GCP側Cloud Routerには次のような対応関係を設定します。

種類値の例意味
自分側BGP用IP169.254.0.1Cloud RouterがVPNトンネル 0上で使うIP
相手側BGP用IP169.254.0.2オンプレ側ルーターがVPNトンネル 0上で使うIP
自分側ASN65001GCP側のASN
相手側ASN65002オンプレ側のASN

BGPは「自分の情報だけを流せば相手が拾う」方式ではありません。両側のルーターで、自分のBGP用IPとASN、相手のBGP用IPとASNを対応させます。

169.254.x.xはBGP用のリンクローカルIP

HA VPNでIPv4のBGP用IPを手動指定する場合、169.254.0.0/16の範囲から選びます。これはVPCサブネットのIP範囲ではありません。

VPNトンネルごとに、重複しない/30のペアを使います。

VPNトンネルGCP側BGP用IP相手側BGP用IP
VPNトンネル 0169.254.0.1/30169.254.0.2/30
VPNトンネル 1169.254.1.1/30169.254.1.2/30

/30では、2つのホストアドレスを両端のルーターに割り当てます。たとえば169.254.0.0/30なら、実際に両端で使うのは169.254.0.1169.254.0.2です。

このIPは実際のVMアクセスには使いません。VMアクセスで使うのは、オンプレ側やVPC側の内部IPです。

まとめ

  • HA VPN gatewayのinterface 0 / 1は、GCP側でVPNトンネルを張るための接続点
  • VPN deviceは、オンプレ側のVPNエンドポイント
  • VPNトンネルの外側は外部IP同士で作り、中で内部IP通信を運ぶ
  • Cloud Routerは、GCP側でBGPによる経路情報交換を担当する
  • BGPは、どのIP範囲がどちら側にあるかを交換するプロトコル
  • ルーターインターフェースは、自分側BGP用IPとVPNトンネルの紐づけ設定
  • BGPピアは、相手側BGP用IPと相手ASNの登録
  • 169.254.x.xはBGP用リンクローカルIPであり、VPCサブネットのIPではない
  • HA VPNでは、2本のVPNトンネルの経路切替のためにBGPを使う

参考

タグ: GCP, クラウド設計, ネットワーク