[IPSec-VPN] クラウド間(GCP⇔AWS)通信


プロローグ

GCP(Google Cloud Platform)とAWS(Amazon Web Service)の間のSite-to-Site VPN通信(クラウド間VPN通信)は、超簡単にできる

  • GCPの「VPN接続」機能とAWSの「VGW(Virtual Private GW)」は、直結可能!
  • Azureの「仮想ネットワークゲートウェイ」とAWSのVGWは、(数年前は)繋げなかった...
    • 確か「どちらが先にグローバルIPアドレスを払い出す?」問題。
    • ARM版では未検証。
  • AWSのようにWindows-VPNを試してみたが、不発...
    • 詳細は(エピローグ中の)「gcpとAWSのNW観点の差異」をご参照。

手順

  1. [gcp] 外部IPアドレス(以下、この値をGIPと呼ぶ)を取得する。
    • AWSのVGWはグローバルIPアドレスが自動的に割り振られる(=Uncontrollable)なので、gcp側でControlする。
  2. [AWS] GIPに相当するCGW(Customer Gateway)を作成する。
  3. [AWS] VGWを作成し、VPCに紐づける。
    • このとき、VPCに紐づいているRouteTableにおいて、VGWの「Route Propagation」を「Yes」にしておくと、「AWS→gcp」のルートがAWS側に自動設定される。
  4. [AWS] SecurityGroupを調整する。
    • gcp側のプライベートNWからの通信を受け付けるべく開ける(テスト用ICMPとか)。
  5. [AWS] 上記のCGWとVGWをツナぐVPN Connection(VPNC)を作成する。
    • 「Routing Options」:まずは敷居の低い「static」で...
    • 「Static IP Prefixes」:gcp側のNWアドレス(CIDR)を指定。
  6. [AWS] VPNCのConfigurationをDownloadする。
    • AWS側グローバルIPアドレス/Pre-Shared-Key(2つずつ)は、AWSが自動割り当てする(=Uncontrollable)。
  7. [gcp] VPN接続を作成する。

    • gcp側のIPアドレスとして「GIP」を設定。
    • AWS側がVPNトンネルを2つ用意しているので、トンネル設定は2本分設定。
    • 「IKEバージョン」:「IKEv1」を指定(「IKEv2」だと疎通しない。AWSが未対応?)。
    • 「事前共有シークレット」:AWSが自動割り当てしたPre-Shared-Key値を設定。
    • 「ルーティングオプション」:まずは敷居の低い「静的」で...
    • 「リモートネットワークIPの範囲」:AWS VPCのCIDRを指定。
    • トンネル1本目用の設定
    • トンネル2本目用の設定
  8. 「作成」ボタンを押し、下記の画面になればOK!!

  9. ICMPで疎通確認のためには、下記を確認:

    • AWS側のRouteTable(Propageted指定なら追加作業なし)
    • AWS側のSecurityGroup
    • gcp側のルート(VPN接続作成時に自動作成されているはずなので、追加作業なし)
    • gcp側のファイアウォールルール(サブNW作っているとハマりがちなので注意)

エピローグ

gcpとAWSのNW観点の差異

  • gcpでは、ひとつのインスタンスは複数のNICを持つことはできない?(ひとつのNW/サブNWにしか収容できない?)
    ⇒複数NIC持つことできます。訂正。
    ⇒複数NICを持たせたうえで、Windows-VPNに再挑戦★

  • gcpインスタンス上でipconfig/ifconfigを実行すると下記の結果が出てプチ衝撃:

ipconfig
C:\>ipconfig
Windows IP Configuration

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : c.xxx.internal
   IPv4 Address. . . . . . . . . . . : 10.xxx.0.100
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . : 10.xxx.0.1

C:\>
ifconfig
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP qlen 1000
    link/ether 42:01:0a:8c:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.xxx.0.2/32 brd 10.140.0.2 scope global dynamic eth0
       valid_lft 80364sec preferred_lft 80364sec
    inet6 fe80::xxxx:xxxx:xxxx:2/64 scope link 
       valid_lft forever preferred_lft forever

⇒サブネットマスクが「/32(IPv4)」「/64(IPv6)」?
⇒全てのインスタンスは、GWインスタンスに直接ぶら下がっている(ハブ&スポーク構成)?

AzureとAWSの間のSite-to-Site VPN通信(クラウド間VPN通信)

  • ぱっと見たところ、Azure側仮想ネットワークゲートウェイにおいて、
    • パブリックIPアドレスは指定できる(「どちらが先にグローバルIPアドレスを払い出す?」問題は解消)。
    • Pre-Shared-Keyが指定可能か不可か、依然調査中...

AWSリージョン間接続を、VGW同士で...

できないですよね。グローバルIPアドレス/Pre-Shared-Keyを自動で割り当てられてしまう(=Uncontrollable)ので★

最後にひとこと

「gcpとAWSの間のSite-to-Site VPN通信」の方が「AWSのリージョン間のSite-to-Site VPN通信」よりもシンプル・早・易だと思いました♪