GCPからAzureにサイト間VPNを接続した手順です。
以下にあるように、2019/10/18時点では、GCPとAzureのBGP接続はサポートされていないようなので、ルートベースのVPNを設定手順です。
VPN interoperability guides | Cloud VPN | Google Cloud
全体像
このフローの通り作業していきます。
- 全体像
- 変数
- [GCP] ① パブリックIPの取得
- [GCP] ② VPCネットワーク作成
- [GCP] ③ Cloud VPNゲートウェイ作成・設定
- [Azure] ④ リソースグループ作成
- [Azure] ⑤ パブリックIPの取得
- [Azure] ⑥ 仮想ネットワーク作成
- [Azure] ⑦ ローカル ネットワーク ゲートウェイ作成
- [Azure] ⑧ 仮想ネットワーク ゲートウェイ作成
- [Azure] ⑨ VPN接続作成
- [GCP] ⑩ Cloud VPNトンネル作成
- [GCP] ⑪ ルートテーブル設定
変数
全てCLIで作業するので、変数を最初に設定します。変数は適当に設定調整してください。
少なくとも GCP_PROJECT
と AZURE_SUBSCRIPTION
は変更する必要があります。
# GCP 関連変数 GCP_PROJECT=YOUR_PROJECT_ID GCP_REGION=asia-northeast1 GCP_PUBLIC_IP_NAME=mypubip GCP_VPC_NAME=myvpc GCP_VPC_PREFIX=10.1.0.0/16 GCP_SUBNET_NAME=mysubnet GCP_SUBNET_RANGE=10.1.0.0/24 GCP_GW_NAME=vpn-gw-azure GCP_TUNNEL_NAME=azure-tunnel GCP_GW_ROUTE=azure-gw-route # Azure 関連変数 AZURE_SUBSCRIPTION=YOUR_SUBSCRIPTION_ID AZURE_RG_NAME=VPN_RG AZURE_PUBLIC_IP_NAME=AzurePubIP AZURE_LOCATION=japaneast AZURE_VNET_NAME=MyVNet AZURE_VNET_PREFIX=10.10.0.0/16 AZURE_SUBNET_NAME=MySubnet AZURE_SUBNET_PREFIX=10.10.0.0/24 AZURE_GW_SUBNET_NAME=GatewaySubnet AZURE_GW_SUBNET_PREFIX=10.10.255.0/27 AZURE_LOCAL_GW_NAME=GCPGW AZURE_GW_NAME=VNetGW AZURE_GW_SKU=VpnGw1 AZURE_CONN_NAME=GCPTunnel # 共通 IKE_PRE_SHARED_KEY=abcd1234
[GCP] ① パブリックIPの取得
gcloud compute addresses create ${GCP_PUBLIC_IP_NAME} \ --project=${GCP_PROJECT} \ --region=${GCP_REGION}
GCP側のパブリックIPを変数に入れておきます。
GCP_PUBLIC_IP=$(gcloud compute addresses describe ${GCP_PUBLIC_IP_NAME} \ --project=${GCP_PROJECT} \ --region=${GCP_REGION} \ --format text | grep address: | awk '{print $2}') && echo ${GCP_PUBLIC_IP}
[GCP] ② VPCネットワーク作成
gcloud compute --project=${GCP_PROJECT} networks create ${GCP_VPC_NAME} --subnet-mode=custom gcloud compute --project=${GCP_PROJECT} networks subnets create ${GCP_SUBNET_NAME} \ --network=${GCP_VPC_NAME} \ --range=${GCP_SUBNET_RANGE} \ --region=${GCP_REGION}
[GCP] ③ Cloud VPNゲートウェイ作成・設定
# VPN Gatewayの作成 gcloud compute target-vpn-gateways create ${GCP_GW_NAME} \ --network ${GCP_VPC_NAME} \ --region ${GCP_REGION} \ --project ${GCP_PROJECT} # Firewall Ruleの追加 gcloud compute forwarding-rules create "${GCP_GW_NAME}-rule-esp" \ --address ${GCP_PUBLIC_IP} \ --target-vpn-gateway ${GCP_GW_NAME} \ --ip-protocol "ESP" \ --region ${GCP_REGION} \ --project ${GCP_PROJECT} gcloud compute forwarding-rules create "${GCP_GW_NAME}-rule-udp500" \ --address ${GCP_PUBLIC_IP} \ --ip-protocol "UDP" --ports "500" \ --target-vpn-gateway ${GCP_GW_NAME} \ --region ${GCP_REGION} \ --project ${GCP_PROJECT} gcloud compute forwarding-rules create "${GCP_GW_NAME}-rule-udp4500" \ --address ${GCP_PUBLIC_IP} \ --ip-protocol "UDP" --ports "4500" \ --target-vpn-gateway ${GCP_GW_NAME} \ --region ${GCP_REGION} \ --project ${GCP_PROJECT}
[Azure] ④ リソースグループ作成
az group create --name ${AZURE_RG_NAME} \ --location ${AZURE_LOCATION}
[Azure] ⑤ パブリックIPの取得
az network public-ip create \ -n ${AZURE_PUBLIC_IP_NAME} \ --allocation-method Dynamic \ -g ${AZURE_RG_NAME}
[Azure] ⑥ 仮想ネットワーク作成
# 仮想ネットワーク作成 az network vnet create \ -n ${AZURE_VNET_NAME} \ --subnet-name ${AZURE_SUBNET_NAME} \ --address-prefix ${AZURE_VNET_PREFIX} \ --subnet-prefix ${AZURE_SUBNET_PREFIX} \ -g ${AZURE_RG_NAME} -l ${AZURE_LOCATION} # Gateway Subnet作成 az network vnet subnet create \ --vnet-name ${AZURE_VNET_NAME} \ -n ${AZURE_GW_SUBNET_NAME} \ --address-prefix ${AZURE_GW_SUBNET_PREFIX} \ -g ${AZURE_RG_NAME}
[Azure] ⑦ ローカル ネットワーク ゲートウェイ作成
az network local-gateway create \ -n ${AZURE_LOCAL_GW_NAME} \ -g ${AZURE_RG_NAME} \ --gateway-ip-address ${GCP_PUBLIC_IP} \ --local-address-prefixes ${GCP_VPC_PREFIX}
[Azure] ⑧ 仮想ネットワーク ゲートウェイ作成
ゲートウェイの作成には10分以上の時間がかかります。 --no-wait
オプションで非同期実行するので、コマンド打ったら作成されるまで待ちます。
az network vnet-gateway create \ -n ${AZURE_GW_NAME} \ --vnet ${AZURE_VNET_NAME} \ --public-ip-address ${AZURE_PUBLIC_IP_NAME} \ --sku ${AZURE_GW_SKU} \ --gateway-type Vpn --vpn-type RouteBased \ -g ${AZURE_RG_NAME} -l ${AZURE_LOCATION} --no-wait
以下のようなコマンドでステータスをウォッチできます。 Updating
-> Succeeded
になればOKです。
watch -n 10 "az network vnet-gateway show -n ${AZURE_GW_NAME} -g ${AZURE_RG_NAME} --query 'provisioningState'"
[Azure] ⑨ VPN接続作成
az network vpn-connection create -n ${AZURE_CONN_NAME} \ --vnet-gateway1 /subscriptions/${AZURE_SUBSCRIPTION}/resourceGroups/${AZURE_RG_NAME}/providers/Microsoft.Network/virtualNetworkGateways/${AZURE_GW_NAME} \ --local-gateway2 /subscriptions/${AZURE_SUBSCRIPTION}/resourceGroups/${AZURE_RG_NAME}/providers/Microsoft.Network/localNetworkGateways/${AZURE_LOCAL_GW_NAME} \ --shared-key ${IKE_PRE_SHARED_KEY} \ -g ${AZURE_RG_NAME} -l ${AZURE_LOCATION}
Azure側のIPアドレスも変数に入れておきます。
AZURE_PUBLIC_IP=$(az network public-ip show \ -n ${AZURE_PUBLIC_IP_NAME} \ -g ${AZURE_RG_NAME} --query 'ipAddress' --output tsv) && echo ${AZURE_PUBLIC_IP}
[GCP] ⑩ Cloud VPNトンネル作成
gcloud compute vpn-tunnels create ${GCP_TUNNEL_NAME} \ --peer-address ${AZURE_PUBLIC_IP} \ --target-vpn-gateway ${GCP_GW_NAME} \ --shared-secret ${IKE_PRE_SHARED_KEY} \ --local-traffic-selector=0.0.0.0/0 \ --remote-traffic-selector=0.0.0.0/0 \ --ike-version 2 \ --region ${GCP_REGION} \ --project ${GCP_PROJECT}
以下のコマンドで Tunnel is up and running.
となっていることを確認します。
gcloud compute vpn-tunnels describe ${GCP_TUNNEL_NAME} \ --flatten detailedStatus \ --region ${GCP_REGION} \ --project ${GCP_PROJECT}
[GCP] ⑪ ルートテーブル設定
最後にルートテーブルを調整して完了です。後はFirewall調整すれば繋がるはずです。
gcloud compute routes create ${GCP_GW_ROUTE} \ --destination-range ${AZURE_VNET_PREFIX} \ --next-hop-vpn-tunnel ${GCP_TUNNEL_NAME} \ --network ${GCP_VPC_NAME} \ --next-hop-vpn-tunnel-region ${GCP_REGION} \ --project ${GCP_PROJECT}