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 gateway | GCP側でVPNトンネルを張るためのリソース |
| interface 0 / 1 | HA VPN gatewayにあるVPNトンネル用の接続点 |
| VPN device A/B | オンプレ側のVPNエンドポイント |
| VPNトンネル 0/1 | GCP側とオンプレ側をつなぐIPsecの暗号化経路 |
| Cloud Router | GCP側で経路情報を扱うリソース |
| BGP | ルーター同士が経路情報を交換するプロトコル |
IPsecは、IP通信を暗号化してVPNトンネルを作る仕組みです。
HA VPNはGoogle CloudのCloud VPN機能名です。オンプレ側に同じ名前のHA VPN gatewayがあるとは限りません。本番のオンプレ側では、ルーター、Firewall、VPN専用機器、仮想アプライアンスなどがVPN deviceとして登場します。
HA VPN gatewayのinterface 0とinterface 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エンドポイントの外部IP | HA VPN gatewayの外部IPとVPN deviceの外部IP |
| VPNで運ぶ中身 | オンプレとVPCの内部IP | 192.168.1.x と 10.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 Router | 10.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 Router | GCP側で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用IP | 169.254.0.1 | Cloud RouterがVPNトンネル 0上で使うIP |
| 相手側BGP用IP | 169.254.0.2 | オンプレ側ルーターがVPNトンネル 0上で使うIP |
| 自分側ASN | 65001 | GCP側のASN |
| 相手側ASN | 65002 | オンプレ側の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トンネル 0 | 169.254.0.1/30 | 169.254.0.2/30 |
| VPNトンネル 1 | 169.254.1.1/30 | 169.254.1.2/30 |
/30では、2つのホストアドレスを両端のルーターに割り当てます。たとえば169.254.0.0/30なら、実際に両端で使うのは169.254.0.1と169.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を使う