GCPとAzureをSite-to-SiteでVPN接続してみた(CLI作業)

GCPからAzureにサイト間VPNを接続した手順です。

以下にあるように、2019/10/18時点では、GCPとAzureのBGP接続はサポートされていないようなので、ルートベースのVPNを設定手順です。

f:id:yomon8:20191018004642p:plain

VPN interoperability guides  |  Cloud VPN  |  Google Cloud

全体像

このフローの通り作業していきます。

f:id:yomon8:20191018004012p:plain

変数

全てCLIで作業するので、変数を最初に設定します。変数は適当に設定調整してください。

少なくとも GCP_PROJECTAZURE_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}