GCP-AWS間のIPSecVPNの活用と設定ポイント

この記事は、CyberAgent Group SRE Advent Calendar 2023の19日目の記事です。
# はじめに
メディア組織でSREを担当している @niwattittiです。


# この記事について
ハイブリッドクラウドは、企業がデータとリソースを効率的に管理し、ビジネス価値を最大化するための重要な戦略となっています。
この記事では、2つの大手クラウドプロバイダ間でのデータとリソースのやり取りを安全に行うためのIPsec VPNの設定のポイントについて解説します。

# IPsec VPNについて / 基本的な役割と仕組み
IPsec VPNとは、インターネットプロトコルセキュリティ（IPsec）を使用して、仮想プライベートネットワーク（VPN）接続を確立する技術です。
IPsecは、データの機密性、データの完全性、およびデータのオリジン認証を提供するためのプロトコルスイートです。これにより、ネットワーク間の通信が安全に行われます。

IPsec VPNの主な役割は次のとおりです：
1. データの機密性：IPsec VPNは、データを暗号化して、第三者によるデータの傍受を防ぎます。これは、データがインターネット上で安全に転送されることを保証します。
2. データの完全性：IPsec VPNは、データが送信元から送信先までの間に改ざんされないことを確認します。これは、送信元と送信先の間でデータが一貫していることを保証します。
3. 認証：IPsec VPNは、送信元と送信先の間でデータの送受信を行うエンティティの認証を提供します。これにより、データを送受信するエンティティの信頼性が確認されます。

また、IPsec VPNの仕組みは次のとおりです：
1. トンネルモード：IPsec VPNは、オリジナルのIPパケットを新しいIPパケットでカプセル化します。これにより、オリジナルのIPパケットは、新しいIPパケットのペイロードとなります。この新しいIPパケットは、VPNゲートウェイ間で転送されます。
2. トランスポートモード：このモードでは、IPsecはオリジナルのIPパケットのペイロード部分（つまり、トランスポート層のデータ）のみを暗号化します。このモードは、エンドツーエンドの通信に最適です。

今回は、トンネルモードの設定のポイントについて後述していきます。

# AWS/GCPでのIPsec VPNの設定のポイント

[アーキテクチャ図は、Google Cloudの公式ドキュメントを御覧ください](https://cloud.google.com/static/network-connectivity/docs/vpn/images/build-ha-vpn-connections-google-cloud-aws.svg?hl=ja)

AWSとGCPでのIPsec VPNの設定は、いくつかのステップがあります。
1. AWSとGCPの両方で仮想プライベートクラウド（VPC）を作成します。
2. GCP側でCLOUD VPN GATEWAYを作成します。
3. AWS側でVPN接続を作成
4. GCP側でPEER VPN GATEWAYSとCLOUD VPN TUNNELの設定とRouterの設定を実施します。

## 設定のポイント
※動的にルーティングされた VPN 接続を構築する場合です。
Cloud Interconnectの利用の場合異なります。

- MTUについてAWSとGCPで合わせることが望ましいです。
    - AWS
        - ドキュメントに「AWS VPN 接続は、パス MTU 検出 (RFC 1191) をサポートしていません。」とあるように、AWS VPNはPeerのMTUを自動認識しないため、フラグメンテーションによるオーバヘッドを避けるためにはGCPのHA-VPN側でMTUを設定する必要があります。
        - Fargateについては、MTU調整できないのでECS on EC2構成を検討する必要があります。
          - タスクの通信はそれぞれのタスクにアタッチされるENIによって実現されており、通信諸元はVPCのDHCPによって設定されます。プラットフォームバージョンによってジャンボフレームがサポートされている場合は、9000以上のMTUがセットされるようです。
        - 参考:
            - [カスタマーゲートウェイデバイスの要件](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/your-cgw.html)
            - [Fargate でホストされるタスクのタスクネットワーキング](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/fargate-task-networking.html) 
            - [EC2 インスタンスのネットワークの最大送信単位 (MTU)](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/network_mtu.html)
    - GCP
        - Cloud VPN ゲートウェイの MTU は 1,460 バイトです。
        - トンネル MTUの場合、パス MTU 検出（PMTUD）とMSS クランプが有効になっています。
        - 参考:
            - [最大伝送単位](https://cloud.google.com/vpc/docs/mtu)
            - [MTU に関する考慮事項](https://cloud.google.com/network-connectivity/docs/vpn/concepts/mtu-considerations?hl=ja#gateway-mtu-versus-system-mtu)
- IKE 暗号設定
    VPN接続では、パケットに追加のヘッダ情報が付加されるため、IKEの設定値を限定することが望ましいです。
    - バージョン
        - IKEv2
    - アルゴリズム
        - 暗号化アルゴリズム : AES256-GCM-16
        - 整合性アルゴリズム : SHA2-256
    - ディフィー・ヘルマン(DH) Group 14,15,16 などから選ぶと良いでしょう。
        - AWS側のフェーズ2には、Group5がないので注意が必要です。
    - IKEv2のライフタイムの値
        - より短いAWS側のライフタイムが切れる少し前になると、AWS側からキーの更新要求が送信され、キーが更新されます。
一部のルーターは、相手側からキーの更新を受け取らない機種があるそうで、そういった機種との接続では接続が切断される可能性がありました。Cloud VPNは更新要求を受け取り、キーを更新するのでAWSとGCPのライフタイムが異なる場合でも問題ありません。[参考：GCPサポート からの回答]
    - 参考:
        - [サポートされているIKE暗号](https://cloud.google.com/network-connectivity/docs/vpn/concepts/supported-ike-ciphers)
- 自律システム番号 (ASN) 
    - 64512 ～ 65534 の範囲のプライベート ASN を使用できます。
    - たとえば、下記ように同じアカウント内/プロジェクト内で設定が被らないように設定してください。
        - GCP : 64512
        - AWS : 65000

参考:
- [Create HA VPN connections between Google Cloud and AWS](https://cloud.google.com/network-connectivity/docs/vpn/tutorials/create-ha-vpn-connections-google-cloud-aws)
- [AWS Site-to-Site VPN の概要](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/VPC_VPN.html)
- [AWS Site-to-Site VPN の仕組み](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/how_it_works.html)

## Infrastructure as Code（IaC）化について
HA-VPNの構築するため、それぞれのGATEWAYに
GCPではIPが2つ、AWSではIPが4つ割り振られます。

前述したように、
AWSとGCPでのIPsec VPNの設定は下記のようになっています。
1. AWSとGCPの両方で仮想プライベートクラウド（VPC）を作成します。
2. GCP側でCLOUD VPN GATEWAYを作成します。
3. AWS側でVPN接続を作成
4. GCP側でPEER VPN GATEWAYSとCLOUD VPN TUNNELの設定とRouterの設定を実施します。

- GCP
    - terraformで実装できます。
    - [moduleが利用できます。](https://registry.terraform.io/modules/terraform-google-modules/vpn/google/latest/submodules/vpn_ha)
    - gewawayをのみ作成しGCP側のIPを確認します。
    - その後に、AWS側のGATEWAYのインターフェースのIPを4つ確認した上でトンネル情報を追記し再度実行します。
    - 合計2回流す必要があります。(良い方法があればご教授ください。)
    - 事前共有キーは
        - Secret Managerやsopsを利用して管理するのが良いかと思います。
- AWS
    - CloudFormationで構築する場合は下記をご覧ください
    - ただし、トランザクションオプションの設定はCloudFormationで設定できないので、後ほど修正する必要があります。
        - 参考
            - [CustomerGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customergateway.html)
            - [TransitGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html)
            - [TransitGatewayAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html)
            - [VPNConnection](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html)
    - GCP側のCLOUD VPN GATEWAYの2つのIPを確認し、設定を行います。
    - トランザクションオプションの設定は、IKE 暗号設定を確認し、GCPと一致するように設定してください。

## VPN接続のテストとトラブルシューティング
- ルーティングについて
    - VPN間の通信を行うためGCPのRouterやAWSのVPCのサブネットのルートテーブルに追加する必要があります。
    - また、AWS側でセキュリティグループ等の設定も忘れずに必要です。

- トラブルシュートに関しては、下記を参考にステータスやログを確認するとよいでしょう。
    - [Amazon VPCへの VPNトンネル接続のトラブルシューティングを行うにはどうすればよいですか?](https://repost.aws/knowledge-center/vpn-tunnel-troubleshooting)
    - [Check VPN status](https://cloud.google.com/network-connectivity/docs/vpn/how-to/checking-vpn-status#gcloud_3)
    - [Troubleshooting](https://cloud.google.com/network-connectivity/docs/vpn/support/troubleshooting)

# まとめ
IPsec VPNをGCPとAWS間で、動的にルーティングで設定する際のポイントについて紹介しました。
GCPとAWS両方のクラウドのドキュメントの内容を確認し、最適な設定をする必要があります。
読んでいただい方の参考になれば幸いです。

# さいごに
CyberAgent Group SRE Advent Calendar 2023の20日目は、@kikai_fat47さんです！！