このチュートリアルでは、Virtual Private Cloud(VPC)ネットワーク、Border Gateway Protocol(BGP)、バーチャル プライベート ネットワーク(VPN)、IPsec トンネルの基本コンセプトについて理解していることを前提としています。
Google Cloud では、高可用性(HA)VPN サービスを使用して、IPsec VPN 接続経由で VPC ネットワークを Google Cloud の外部で(オンプレミスや AWS などで)実行されている環境に接続できます。HA VPN は、Google のベスト プラクティスに基づいて構成した場合、99.99% のサービス可用性の SLA を実現します。
アーキテクチャの概要
このドキュメントで説明するアーキテクチャには、次のコンポーネントが含まれています。
- Cloud Router: 完全に分散されたフルマネージドの Google Cloud サービスを使用して、VPC ネットワークで BGP による動的ルーティングを実現できます。
- HA VPN ゲートウェイ: Google Cloud 上で実行される Google 管理の VPN ゲートウェイ。各 HA VPN ゲートウェイは、それぞれ独自の外部 IP アドレスを持つインターフェース 0 と 1 の 2 つのインターフェースがあるリージョン リソースです。
- VPN トンネル: 暗号化されたトラフィックが通過する HA VPN ゲートウェイから AWS 上のピア VPN ゲートウェイへの接続。
- ピア VPN ゲートウェイ: 2 つの AWS サイト間 VPN エンドポイント。AWS 仮想プライベート ゲートウェイまたは AWS トランジット ゲートウェイのいずれかから指定できます。
各ピア VPN ゲートウェイ接続には、1 つのカスタマー ゲートウェイ(この場合は Google Cloud HA VPN インターフェース)を指すように事前構成された 2 つのトンネルがあります。この構成では、99.99% のサービス可用性 SLA を満たすトンネルの最小数は 4 です。
VPN トンネルを介したルーティング オプションと組み合わせる帯域幅は、AWS 側で使用されるサイト間 VPN オプションによって異なります。
トランジット ゲートウェイ: BGP 設定なしで AWS トランジット ゲートウェイを作成すると、ECMP はアクティブなトンネル間でトラフィックを均等に分散します。
複数の Google Virtual Private Cloud ネットワーク間で VPN 接続を使用するには、Google Cloud でのハブアンドスポーク システムの構築に関するベスト プラクティスをご覧ください。
AWS トランジット ゲートウェイの詳細については、Amazon Virtual Private Cloud のドキュメントをご覧ください。
仮想プライベート ゲートウェイ: AWS 仮想プライベート ゲートウェイを使用する場合は、ゲートウェイのすべての接続で 1 つのトンネルのみが選択されます。複数のトンネルを使用するには、ECMP を利用できるように AWS トランジット ゲートウェイを使用します。
AWS での VPN ルート優先度の詳細については、AWS サイト間 VPN ルーティング オプションのドキュメントをご覧ください。
AWS 仮想プライベート ゲートウェイの詳細については、AWS サイト間 VPN トンネルのドキュメントをご覧ください。
次の図にアーキテクチャを示します。
目標
- Google Cloud で VPC ネットワークを作成します。
- Google Cloud で HA VPN ゲートウェイと Cloud Router を作成します。
- AWS でカスタマー ゲートウェイを作成します。
- AWS で動的ルーティングを使用して VPN 接続を作成します。
- Google Cloud で外部 VPN ゲートウェイと VPN トンネルを作成します。
- Google Cloud と AWS で VPC ネットワーク間の VPN 接続を検証し、テストします。
費用
このチュートリアルでは、以下のものをはじめとする Google Cloud の課金対象となるコンポーネントを使用します。
Google Cloud コンポーネントの費用を見積もるには、Google Cloud 料金計算ツールを使用してください。
このチュートリアルでは、以下のものをはじめとするアマゾン ウェブ サービス(AWS)の課金対象となるコンポーネントを使用します。
- AWS トランジット ゲートウェイ
- AWS サイト間 VPN
AWS コンポーネントの費用を見積もるには、AWS 料金計算ツールを使用してください。
始める前に
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine API.
-
In the Google Cloud console, activate Cloud Shell.
-
ネットワーク コンポーネントの構成に必要な管理者ロールを付与されていることを確認します。
- ネットワーク管理者:
compute.networkAdmin
- セキュリティ管理者:
compute.securityAdmin
- Compute 管理者:
compute.admin
これらのロールの目的の詳細については、ネットワーク関連ジョブ機能の IAM のロールをご覧ください。
- ネットワーク管理者:
Google Cloud で HA VPN ゲートウェイと Cloud Router を作成する
このセクションでは、Google Cloud で VPC ネットワーク、HA VPN ゲートウェイ、Cloud Router を作成します。
Cloud Shell で、ご自身が作成または選択した Google Cloud プロジェクトで作業していることを確認します。
gcloud config set project YOUR_PROJECT_ID export PROJECT_ID=`gcloud config list --format="value(core.project)"`
YOUR_PROJECT_ID
を実際の Google Cloud プロジェクト ID に置き換えます。単一のサブネットを使用して、カスタム VPC ネットワークを作成します。
gcloud compute networks create NETWORK \ --subnet-mode SUBNET_MODE \ --bgp-routing-mode BGP_ROUTING_MODE
次のように置き換えます。
NETWORK
: ネットワークの名前SUBNET_MODE
: サブネット モードBGP_ROUTING_MODE
: BGP ルーティング モード
コマンドは次の例のようになります。
gcloud compute networks create gc-vpc \ --subnet-mode custom \ --bgp-routing-mode global
テスト用 VM をホストするサブネットを 1 つ作成します。
gcloud compute networks subnets create SUBNET_NAME \ --network NETWORK \ --region SUBNET_REGION \ --range IP_ADDRESS_RANGE
次のように置き換えます。
SUBNET_NAME
: サブネット名SUBNET_REGION
: サブネットを作成するリージョンIP_ADDRESS_RANGE
: サブネットの IP アドレス範囲
コマンドは次の例のようになります。
gcloud compute networks subnets create subnet-east4 \ --network gc-vpc \ --region us-east4 \ --range 10.1.1.0/24
HA VPN ゲートウェイを作成します。
gcloud compute vpn-gateways create HA_VPN_GATEWAY_NAME \ --network NETWORK \ --region REGION
HA_VPN_GATEWAY_NAME
は HA VPN ゲートウェイの名前に置き換えます。Cloud Router を作成します。
gcloud compute routers create ROUTER_NAME \ --region REGION \ --network NETWORK \ --asn GOOGLE_ASN \ --advertisement-mode custom \ --set-advertisement-groups all_subnets
次のように置き換えます。
ROUTER_NAME
: Cloud Router の名前GOOGLE_ASN
: 作成する Cloud Router のプライベート ASN(自律システム番号)64512~65534 または 4200000000~4294967294 の範囲の任意のプライベート ASN を指定できます。ただし、同じリージョンおよびネットワークでまだピア ASN として使用していないことが条件です。
コマンドは次の例のようになります。
gcloud compute routers create cloud-router \ --region us-east4 \ --network gc-vpc \ --asn 65534 \ --advertisement-mode custom \ --set-advertisement-groups all_subnets
この手順では、2 つのインターフェースを持つ VPN ゲートウェイを作成します。AWS 側で環境を設定するときに使用できるように、外部アドレスをメモしておきます。
AWS でゲートウェイと VPN 接続を作成する
このセクションでは、カスタマー ゲートウェイ、ターゲット ゲートウェイ、動的ルーティングを使用する VPN 接続を作成します。
AWS コマンドを実行するには、AWS コマンドライン インターフェースを使用します。
次の AWS コマンドを使用してカスタマー ゲートウェイを 2 つ作成します。
aws ec2 create-customer-gateway --type ipsec.1 --public-ip INTERFACE_0_IP_ADDRESS --bgp-asn GOOGLE_ASN aws ec2 create-customer-gateway --type ipsec.1 --public-ip INTERFACE_1_IP_ADDRESS --bgp-asn GOOGLE_ASN
INTERFACE_0_IP_ADDRESS
とINTERFACE_1_IP_ADDRESS
は、前のセクションの最後のステップで取得したパブリック IP アドレスに置き換えます。ターゲット ゲートウェイを作成し、VPC ネットワークに接続します。
ターゲット ゲートウェイは、仮想プライベート ゲートウェイまたはトランジット ゲートウェイです。詳細については、ターゲット ゲートウェイの作成をご覧ください。
仮想プライベート ゲートウェイまたはトランジット ゲートウェイの手順に沿って操作します。
仮想プライベート ゲートウェイ:
特定の AWS 側の ASN を使用して、仮想プライベート ゲートウェイを作成します。
aws ec2 create-vpn-gateway --type ipsec.1 --amazon-side-asn AWS_SIDE_ASN
AWS_SIDE_ASN
は、AWS 側の ASN に置き換えます。このコマンドは、次の例のようになります。
aws ec2 create-vpn-gateway --type ipsec.1 --amazon-side-asn 65001
仮想プライベート ゲートウェイを VPC ネットワークに接続します。
aws ec2 attach-vpn-gateway --vpn-gateway-id VPN_GATEWAY_ID --vpc-id VPC_ID
トランジット ゲートウェイ:
トランジット ゲートウェイを作成します。
aws ec2 create-transit-gateway --description TRANSIT_GATEWAY_DESCRIPTION \ --options=AmazonSideAsn=65001,AutoAcceptSharedAttachments=enable,DefaultRouteTableAssociation=enable,DefaultRouteTablePropagation=enable,VpnEcmpSupport=enable,DnsSupport=enable
TRANSIT_GATEWAY_DESCRIPTION
は、トランジット ゲートウェイの説明に置き換えます。VPC ネットワークをトランジット ゲートウェイに接続します。
aws ec2 create-transit-gateway-vpc-attachment \ --transit-gateway-id TRANSIT_GATEWAY_ID \ --vpc-id VPC_ID \ --subnet-id SUBNET_ID
動的ルーティングを使用して VPN 接続を作成します。
動的ルーティングを使用して VPN 接続を作成する方法は、ターゲット ゲートウェイが仮想プライベート ゲートウェイかトランジット ゲートウェイかによって異なります。詳細については、サイト間 VPN 接続を作成するをご覧ください。
仮想プライベート ゲートウェイまたはトランジット ゲートウェイの手順に沿って操作します。
仮想プライベート ゲートウェイ:
仮想プライベート ゲートウェイとカスタマー ゲートウェイの間の動的ルーティングを使用して VPN 接続を作成し、VPN 接続にタグを適用します。
aws ec2 create-vpn-connection \ --type ipsec.1 \ --customer-gateway-id CUSTOMER_GATEWAY_1 \ --vpn-gateway-id VPN_GATEWAY_ID \ --options TunnelOptions='[{TunnelInsideCidr=AWS_T1_IP,PreSharedKey=SHARED_SECRET_1},{TunnelInsideCidr=AWS_T2_IP,PreSharedKey=SHARED_SECRET_2}]' aws ec2 create-vpn-connection \ --type ipsec.1 \ --customer-gateway-id CUSTOMER_GATEWAY_2 \ --vpn-gateway-id VPN_GATEWAY_ID \ --options TunnelOptions='[{TunnelInsideCidr=AWS_T3_IP,PreSharedKey=SHARED_SECRET_3},{TunnelInsideCidr=AWS_T4_IP,PreSharedKey=SHARED_SECRET_4}]'
トランジット ゲートウェイ:
トランジット ゲートウェイとカスタマー ゲートウェイの間の動的ルーティングを使用する VPN 接続を作成します。
aws ec2 create-vpn-connection \ --type ipsec.1 \ --customer-gateway-id CUSTOMER_GATEWAY_1 \ --transit-gateway-id TRANSIT_GATEWAY_ID \ --options TunnelOptions='[{TunnelInsideCidr=AWS_T1_IP,PreSharedKey=SHARED_SECRET_1},{TunnelInsideCidr=AWS_T2_IP,PreSharedKey=SHARED_SECRET_2}]' aws ec2 create-vpn-connection \ --type ipsec.1 \ --customer-gateway-id CUSTOMER_GATEWAY_2 \ --transit-gateway-id TRANSIT_GATEWAY_ID \ --options TunnelOptions='[{TunnelInsideCidr=AWS_T3_IP,PreSharedKey=SHARED_SECRET_3},{TunnelInsideCidr=AWS_T4_IP,PreSharedKey=SHARED_SECRET_4}]'
次のように置き換えます。
CUSTOMER_GATEWAY_1
: Google Cloud VPN ゲートウェイ、インターフェース 0CUSTOMER_GATEWAY_2
: Google Cloud VPN ゲートウェイ、インターフェース 1AWS_T1_IP
: 接続 1、トンネル 1 の仮想プライベート ゲートウェイの内部 IP アドレスAWS_T2_IP
: 接続 1、トンネル 2 の仮想プライベート ゲートウェイの内部 IP アドレスAWS_T3_IP
: 接続 2、トンネル 1 の仮想プライベート ゲートウェイの内部 IP アドレスAWS_T4_IP
: 接続 2、トンネル 2 の仮想プライベート ゲートウェイの内部 IP アドレスSHARED_SECRET_1
: 接続 1、トンネル 1 の事前共有キーSHARED_SECRET_2
: 接続 1、トンネル 2 の事前共有キーSHARED_SECRET_3
: 接続 2、トンネル 1 の事前共有キーSHARED_SECRET_4
: 接続 2、トンネル 2 の事前共有キー
AWS は一部の CIDR 範囲を予約しているため、これらの範囲の値を内部 IP アドレス(
AWS_T1_IP
、AWS_T2_IP
、AWS_T3_IP
、AWS_T4_IP
)として使用することはできません。AWS が予約する CIDR ブロックについては、内部トンネル IPv4 CIDR をご覧ください。これらのコマンドにより、Google Cloud への 4 つのトンネルが作成されます。
2 つの VPN 接続の構成ファイルをダウンロードします。
この後の手順では、構成ファイルの値を使用して、Google Cloud 側でリソースの作成と構成を行います。
Google Cloud で VPN トンネルと Cloud Router インターフェースを作成する
このセクションでは、前のセクションで作成した AWS VPN 接続の情報を使用して、Google Cloud でコンポーネントの作成と構成を行います。
AWS への VPN トンネルを構成する場合は、IKEv2 暗号化プロトコルを使用し、AWS 側で選択する変換セットを低減します。たとえば、単一のフェーズ 1 およびフェーズ 2 暗号化アルゴリズム、認証アルゴリズム、Diffie-Hellman(DH)グループ番号の組み合わせを選択します。このように選択しないと、デフォルトの AWS 変換セットのセキュリティ アソシエーション(SA)ペイロード サイズが大きいため、Cloud VPN トンネルが鍵交換に失敗する可能性があります。ペイロード サイズが大きいため、Cloud VPN ではサポートされていない、IKE パケットの IP 断片化が AWS 側で発生します。詳細については、サイト間 VPN 接続用のトンネル オプションをご覧ください。
Cloud Shell で、AWS 外部 IP アドレス用の 4 つのインターフェースを持つ外部 VPN ゲートウェイを作成します。
gcloud compute external-vpn-gateways create PEER_GATEWAY_NAME --interfaces \ 0=AWS_GW_IP_1,1=AWS_GW_IP_2,2=AWS_GW_IP_3,3=AWS_GW_IP_4
次のように置き換えます。
AWS_GW_IP_1
: 接続 1、トンネル 1 の仮想プライベート ゲートウェイの外部 IP アドレスAWS_GW_IP_2
: 接続 1、トンネル 2 の仮想プライベート ゲートウェイの外部 IP アドレスAWS_GW_IP_3
: 接続 2、トンネル 1 の仮想プライベート ゲートウェイの外部 IP アドレスAWS_GW_IP_4
: 接続 2、トンネル 2 の仮想プライベート ゲートウェイの外部 IP アドレス
4 つの VPN トンネルを作成します。
トンネル 1:
gcloud compute vpn-tunnels create tunnel-1 \ --peer-external-gateway PEER_GATEWAY_NAME \ --peer-external-gateway-interface 0 \ --region REGION \ --ike-version IKE_VERSION \ --shared-secret SHARED_SECRET_1 \ --router ROUTER_NAME \ --vpn-gateway HA_VPN_GATEWAY_NAME \ --interface 0
トンネル 2:
gcloud compute vpn-tunnels create tunnel-2 \ --peer-external-gateway PEER_GATEWAY_NAME \ --peer-external-gateway-interface 1 \ --region REGION \ --ike-version IKE_VERSION \ --shared-secret SHARED_SECRET_2 \ --router ROUTER_NAME \ --vpn-gateway HA_VPN_GATEWAY_NAME \ --interface 0
トンネル 3:
gcloud compute vpn-tunnels create tunnel-3 \ --peer-external-gateway PEER_GATEWAY_NAME \ --peer-external-gateway-interface 2 \ --region REGION \ --ike-version IKE_VERSION \ --shared-secret SHARED_SECRET_3 \ --router ROUTER_NAME \ --vpn-gateway HA_VPN_GATEWAY_NAME \ --interface 1
トンネル 4:
gcloud compute vpn-tunnels create tunnel-4 \ --peer-external-gateway PEER_GATEWAY_NAME \ --peer-external-gateway-interface 3 \ --region REGION \ --ike-version IKE_VERSION \ --shared-secret SHARED_SECRET_4 \ --router ROUTER_NAME \ --vpn-gateway HA_VPN_GATEWAY_NAME \ --interface 1
4 つの Cloud Router インターフェースを作成します。
次のコマンドで、各
GOOGLE_BGP_IP_TUNNEL
プレースホルダを Google Cloud 側のトンネルの内部 IP アドレスに置き換えます。AWS VPN 構成ファイルの値は、各トンネルのカスタマー ゲートウェイ アドレスとして表示されます。これらのアドレスはそれぞれ、169.254.0.0/16
ネットワーク範囲内の/30
CIDR 範囲内にある必要があります。Cloud Router インターフェース 1:
gcloud compute routers add-interface ROUTER_NAME \ --interface-name int-1 \ --vpn-tunnel tunnel-1 \ --ip-address GOOGLE_BGP_IP_TUNNEL_1 \ --mask-length 30 \ --region REGION
Cloud Router インターフェース 2:
gcloud compute routers add-interface ROUTER_NAME \ --interface-name int-2 \ --vpn-tunnel tunnel-2 \ --ip-address GOOGLE_BGP_IP_TUNNEL_2 \ --mask-length 30 \ --region REGION
Cloud Router インターフェース 3:
gcloud compute routers add-interface ROUTER_NAME \ --interface-name int-3 \ --vpn-tunnel tunnel-3 \ --ip-address GOOGLE_BGP_IP_TUNNEL_3 \ --mask-length 30 \ --region REGION
Cloud Router インターフェース 4:
gcloud compute routers add-interface ROUTER_NAME \ --interface-name int-4 \ --vpn-tunnel tunnel-4 \ --ip-address GOOGLE_BGP_IP_TUNNEL_4 \ --mask-length 30 \ --region REGION
BGP ピアを追加します。
次のコマンドで、
PEER_ASN
を BGP セッションの AWS 側の ASN に置き換えます。AWS 接続 1、トンネル 1
gcloud compute routers add-bgp-peer ROUTER_NAME \ --peer-name aws-conn1-tunn1 \ --peer-asn PEER_ASN \ --interface int-1 \ --peer-ip-address AWS_T1_IP \ --region REGION
AWS 接続 1、トンネル 2
gcloud compute routers add-bgp-peer ROUTER_NAME \ --peer-name aws-conn1-tunn2 \ --peer-asn PEER_ASN \ --interface int-2 \ --peer-ip-address AWS_T2_IP \ --region REGION
AWS 接続 2、トンネル 1
gcloud compute routers add-bgp-peer ROUTER_NAME \ --peer-name aws-conn2-tunn1 \ --peer-asn PEER_ASN \ --interface int-3 \ --peer-ip-address AWS_T3_IP \ --region REGION
AWS 接続 2、トンネル 2
gcloud compute routers add-bgp-peer ROUTER_NAME \ --peer-name aws-conn2-tunn2 \ --peer-asn PEER_ASN \ --interface int-4 \ --peer-ip-address AWS_T4_IP \ --region REGION
構成を確認する
Cloud Shell で、Cloud Router のステータスを確認します。
gcloud compute routers get-status ROUTER_NAME \ --region REGION \ --format='flattened(result.bgpPeerStatus[].name, result.bgpPeerStatus[].ipAddress, result.bgpPeerStatus[].peerIpAddress)'
出力は次のようになります。
result.bgpPeerStatus[].peerIpAddress)' result.bgpPeerStatus[0].ipAddress: 169.254.171.18 result.bgpPeerStatus[0].name: aws-conn1-tunn1 result.bgpPeerStatus[0].peerIpAddress: 169.254.171.17 result.bgpPeerStatus[1].ipAddress: 169.254.156.154 result.bgpPeerStatus[1].name: aws-conn1-tunn2 result.bgpPeerStatus[1].peerIpAddress: 169.254.156.153 result.bgpPeerStatus[2].ipAddress: 169.254.123.38 result.bgpPeerStatus[2].name: aws-conn2-tunn1 result.bgpPeerStatus[2].peerIpAddress: 169.254.123.37 result.bgpPeerStatus[3].ipAddress: 169.254.48.186 result.bgpPeerStatus[3].name: aws-conn2-tunn2 result.bgpPeerStatus[3].peerIpAddress: 169.254.48.185
すべてのトンネルを一覧表示します。
gcloud compute vpn-tunnels list
出力は次のようになります。
NAME REGION GATEWAY PEER_ADDRESS tunnel-1 us-east4 ha-vpn-gw 34.205.x.x tunnel-2 us-east4 ha-vpn-gw 52.203.x.x tunnel-3 us-east4 ha-vpn-gw 3.208.x.x tunnel-4 us-east4 ha-vpn-gw 52.204.x.x
トンネルのステータスを確認します。
gcloud compute vpn-tunnels describe tunnel-1 \ --region REGION \ --format='flattened(status,detailedStatus)'
出力は次のようになります。
detailed_status: Tunnel is up and running. status: ESTABLISHED
Cloud Router によって学習された動的ルートを一覧表示します。
gcloud compute routers get-status ROUTER_NAME \ --region REGION \ --format="flattened(result.bestRoutes)"
出力は次のようになります。
result.bestRoutes[0].creationTimestamp: 2021-01-19T20:42:07.366-08:00 result.bestRoutes[0].destRange: 10.2.2.0/24 result.bestRoutes[0].kind: compute#route result.bestRoutes[0].nextHopIp: 169.254.171.17 result.bestRoutes[0].priority: 100 result.bestRoutes[1].creationTimestamp: 2021-01-19T20:42:07.366-08:00 result.bestRoutes[1].destRange: 10.2.2.0/24 result.bestRoutes[1].kind: compute#route result.bestRoutes[1].nextHopIp: 169.254.156.153 result.bestRoutes[1].priority: 100 result.bestRoutes[2].creationTimestamp: 2021-01-19T20:56:26.588-08:00 result.bestRoutes[2].destRange: 10.2.2.0/24 result.bestRoutes[2].kind: compute#route result.bestRoutes[2].nextHopIp: 169.254.123.37 result.bestRoutes[2].priority: 100 result.bestRoutes[3].creationTimestamp: 2021-01-19T20:56:26.588-08:00 result.bestRoutes[3].destRange: 10.2.2.0/24 result.bestRoutes[3].kind: compute#route result.bestRoutes[3].nextHopIp: 169.254.48.185 result.bestRoutes[3].priority: 100
接続をテストする
ping リクエストをテストするため、トンネルの両側にテスト VM を作成します。
ICMP トラフィックを許可するようにファイアウォール ルールを設定していることを確認してください。
ping
コマンドを使用して接続をテストします。iperf を使用してテストマシン間の帯域幅を測定します。
サーバー側:
iperf3 -s
クライアント側:
iperf3 -c SERVER_IP_ADDRESS -P NUMBER_OF_PARALLEL_SESSIONS
クリーンアップ
このチュートリアルで作成した Google Cloud と AWS のリソースを削除します。
Google Cloud プロジェクトを削除する
このチュートリアルで使用したリソースに対する Google Cloud アカウントへの課金を回避するには、プロジェクトを削除します。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
AWS リソースを削除する
次のステップ
- Google Cloud VPN の詳細を確認する。
- VPC 設計のためのベスト プラクティスとリファレンス アーキテクチャの詳細を確認する。