はじめに
こんにちは、IaC技術推進部の山路です。 Alibaba Cloudの公式のブログでは毎日のように新しい投稿があり、その中身もインフラからアプリ開発、機械学習にIoTまで多岐にわたります。今回はたくさんのブログ記事の中から、IPSec-VPNとCENを組み合わせたこちらの記事について紹介させていただきます。この記事では、IPSec-VPN接続でIKEv1プロトコルを利用している際に、複数のネットワーク先と通信を行う方法について紹介しております。元の記事を読んでみて、同じようなケースに遭遇したときに何かの参考になるのでは、と感じ、本投稿に至りました。
本投稿では、元となる記事の内容を紹介したのち、記事と同じ手順で実際に環境を構築し、複数のネットワーク間で疎通が取れることを確認するまでを紹介いたします。
※元記事はこちら:
内容紹介
扱うサービス・プロダクト
記事の中身に入る前に、今回紹介する記事で登場するAlibaba Cloudのサービス・プロダクトについて簡単に紹介します。
VPN Gateway
VPN GatewayはAlibaba Cloud上にVPNゲートウェイを作成し、Alibaba CloudのVPC間やオンプレ・クラウド間でのVPN通信を実現します。
Customer Gateway
Customer Gatewayは、IPSec接続を行う対向側のゲートウェイ情報を定義するリソースです。
IPSec Connection
IPSec Connectionは、作成するIPSec接続の通信先やプロトコルを定義します。VPN GatewayとCustomer Gatewayを指定してアクセス元・アクセス先を指定し、接続時に利用するプロトコルを指定します。元記事のメインテーマであるIKEv1プロトコルはここで指定します。
Cloud Enterprise Network
上記3つのサービスは他のクラウドプロバイダーも提供しているものであるのに対し、Cloud Enterprise Network(CEN)はAlibaba Cloud特有のサービスです。CENはAlibaba Cloudの所有するインフラを利用して、VPC間、VPCとオンプレミス間のネットワーク接続を実現するサービスです。

※Alibaba Cloud公式ドキュメントより
CENはAlibaba Cloudの所有するグローバルなリージョンで利用することが可能です。またCENを作成後にVPCなどのネットワークをアタッチするだけで、CENにアタッチされたほかのネットワークと相互に通信をすることができます。
背景
Alibaba Cloudに限らず多くのクラウドプロバイダーではVPN Gatewayをサービスとして提供しており、これを利用してIPSec接続を作成することで、VPC間やオンプレのデータセンターとクラウド間をVPN接続することができます。
IPSec接続を作成する際、オプションとしてIKEv1、IKEv2のどちらかを選択することができますが、IKEv1の場合はプロトコルの制約として、単一のCIDRブロックをローカルネットワーク・リモートネットワークとして指定することしかできません。Alibaba CloudのWebコンソール上でIKEv1を利用したIPSec Connectionを作成する際に複数にCIDRを指定しようとすると、以下のようなエラーが表示されます。

※IKEv1を利用する場合に単一のCIDRブロックしか利用できないのはプロトコルの仕様によるものであり、他のクラウドプロバイダー(例えばGoogle Cloudなど)でも同様の制限があります。
Alibaba Cloudでは複数のCIDRブロックを利用することのできるikev2の利用を推奨していますが、エンタープライズ企業などのクライアントには既にIKEv1を利用している方も多く、現状のIPSec接続を切れない、これ以上ゲートウェイを用意することが難しい、など制約があることもあります。その場合、例えばAlibaba Cloud CENを利用して異なる地域の異なるネットワークへ接続したい場合などに、ikev2への切り替えをすることができない場合があります。
ここではIKEv1プロトコルを利用している場合にCENを利用して複数のCIDRへ接続する方法について紹介しています。
解決方法
具体的な解決方法の前に、今回検証をする環境について触れておきます。
今回紹介する記事では、オンプレのDC間をAlibaba Cloudを経由して接続することを想定しています。図にすると以下のような構成です。

検証では、ローカルのDC(図中のDC01)からリモートのVPC(図中のVPC02)までのネットワークを到達するための方法を紹介しています。
Alibaba Cloud上に構築した検証環境を図に表すと、以下のような形になります。今回はオンプレミスのDCはVPCで置き換え、ローカルDCを香港リージョン、ローカルVPCを日本リージョン、そしてリモートVPCをUSリージョンに見立てて構築しました。

IKEv1を既に利用しているVPN Gatewayを利用して複数のVPNトンネルを実現するため、ここでは同一のVPN Gatewayに複数のIPSec接続を作成する方法を紹介しています。具体的には以下の図のように、一組のVPN Gatewayのセット間で複数のIPSec接続を作成します。IPSec接続の一つは、既存の接続先を指定し、もう一つは新たに追加する接続先を指定します。2つ目のIPSec接続はそれだけではもちろんローカルの拠点との間で通信を行うことはできませんが、CENを用いてVPC間を接続し、IPSec接続によるルーティング情報をCENに広報することで、リモート拠点からローカル拠点へのルーティング情報が渡され、2つの拠点間での通信が実現します。

構築方法の紹介
構築環境情報
ここからは実際の環境を構築する手順について紹介します。まず作成をするリソースは以下の通りになります。
| リージョン | リソース種別 | リソース名 | その他情報 |
|---|---|---|---|
| China (Hong Kong) | VPC | ikev1test-hongkong | CIDR: 192.168.0.0/16 |
| - | Vswitch | default | CIDR: 192.168.0.0/24, Zone: Hongkong Zone B |
| - | VPN Gateway | ikev1test-hongkong | IP: 8.210.95.193(自動的に決定) |
| - | Customer Gateway | ikev1test-hongkong | IP: 47.74.25.32 |
| - | IPSec | ikev1test-hongkong-to-japan | shared-key: test1234 |
| - | IPSec | ikev1test-hongkong-to-us | shared-key: test1234 |
| - | Route Entry | ikev1test-hongkong-to-japan | 172.16.0.0/12 |
| - | Route Entry | ikev1test-hongkong-to-us | 10.0.0.0/8 |
| - | Security Group | ikev1test-hongkong | - |
| - | Security Group Rule | - | ローカル端末のパブリックIPを指定 |
| - | Security Group Rule | - | 172.16.0.0/12 |
| - | Security Group Rule | - | 10.0.0.0/8 |
| - | ECS | ikev1test-hongkong | IP: 192.168.0.219(自動的に決定) |
| Japan (Tokyo) | VPC | ikev1test-japan | CIDR: 172.16.0.0/12 |
| - | Vswitch | default | CIDR: 172.16.0.0/24, Zone: Tokyo Zone A |
| - | VPN Gateway | ikev1test-japan | IP: 47.74.25.32(自動的に決定) |
| - | Customer Gateway | ikev1test-japan | IP: 8.210.95.193 |
| - | IPSec | ikev1test-japan-to-hongkong | shared-key: test1234 |
| - | IPSec | ikev1test-us-to-hongkong | shared-key: test1234 |
| - | CEN | ikev1test | - |
| - | Route Entry | ikev1test-japan-to-hongkong | 192.168.0.0/16、CENに広報する |
| - | Security Group | ikev1test-japan | - |
| - | Security Group Rule | - | ローカル端末のパブリックIPを指定 |
| - | Security Group Rule | - | 192.168.0.0/16 |
| - | Security Group Rule | - | 10.0.0.0/8 |
| - | ECS | ikev1test-japan | IP: 172.16.0.65(自動的に決定) |
| US (silicon Valley) | VPC | ikev1test-us | CIDR: 10.0.0.0/8 |
| - | Vswitch | default | CIDR: 10.0.0.0/24, Zone: Silicon Valley Zone A |
| - | CEN | ikev1test | - |
| - | Security Group | ikev1test-us | - |
| - | Security Group Rule | - | ローカル端末のパブリックIPを指定 |
| - | Security Group Rule | - | 192.168.0.0/16 |
| - | Security Group Rule | - | 172.16.0.0/12 |
| - | ECS | ikev1test-us | IP: 10.0.0.231(自動的に決定) |
構築概要
ここから実際の環境構築を行います。構築作業の流れは以下の通りです。
- VPCの作成
- VPN gatewayの作成
- Customer Gatewayの作成
- IPSec Connectionの作成
- CENの作成とVPCのアタッチ
- Route Entryの設定
- Security Group / Security Group Ruleの作成
- ECSの作成
- 接続テスト
1. VPCの作成
まずは3つのVPCを作成します。作成手順は特に記載しませんが、以下のようなパラメータとなるよう作成します。
| リソース種別 | リソース名 | オプション | 値 |
|---|---|---|---|
| VPC | ikev1test-hongkong | CIDR | 192.168.0.0/16 |
| Region | China (Hong Kong) | ||
| Vswitch | default | CIDR | 192.168.0.0/24 |
| Zone | Hongkong Zone B | ||
| VPC | ikev1test-japan | CIDR | 172.16.0.0/12 |
| Region | Japan (Tokyo) | ||
| Vswitch | default | CIDR | 172.16.0.0/24 |
| Zone | Tokyo Zone A | ||
| VPC | ikev1test-us | CIDR | 10.0.0.0/8 |
| Region | US (Silicon Valley) | ||
| Vswitch | default | CIDR | 10.0.0.0/24 |
| Zone | Silicon Valley Zone A |
2. VPN gatewayの作成
次にVPN Gatewayを作成します。VPN Gatewayは香港リージョンと日本リージョンで作成します。Alibaba CloudのWebコンソールから「VPC」を選択し、左横のメニューバーから「VPN Gateway」を選択します。VPN Gatewayの画面に遷移したのち、「Create VPN Gateway」を選択し、作成画面に遷移します。

VPN Gatewayの作成画面では、リソースの名称や作成するリージョンを選択します。ここでは以下のようなパラメータを指定してリソースを作成します。
| リソース種別 | リソース名 | パラメータ | 値 |
|---|---|---|---|
| VPN Gateway | ikev1test-hongkong | Region | China (Hong Kong) |
| VPC | ikev1test-hongkong | ||
| Assign Vswitch | No | ||
| Peak Bandwidth | 10Mbps | ||
| Billing Method | Pay ByTraffic | ||
| IPSec-VPN | Enable | ||
| SSL-VPN | Disable | ||
| Billing Cycle | By Hour | ||
| VPN Gateway | ikev1test-japan | Region | Japan (Tokyo) |
| VPC | ikev1test-japan | ||
| Assign Vswitch | No | ||
| Peak Bandwidth | 10Mbps | ||
| Billing Method | Pay ByTraffic | ||
| IPSec-VPN | Enable | ||
| SSL-VPN | Disable | ||
| Billing Cycle | By Hour |
香港リージョン

日本リージョン

作成後は以下のようにVPN Gatewayが確認できます。この時、次項のCustomer Gatewayの作成時にパブリックIPアドレスを指定するため、各VPN Gatewayの持つパブリックIPアドレスを確認しておきます。
香港リージョン

日本リージョン

3. Customer Gatewayの作成
続いてCustomer Gatewayを作成します。先ほどのVPN Gatewayの画面で左横にあるメニューから「Customer Gateway」を選択し、作成画面に移動します。作成画面では、以下のようにパラメータを指定します。
| リソース種別 | リソース名 | パラメータ | 値 |
|---|---|---|---|
| Customer Gateway | ikev1test-hongkong | IPアドレス | JapanリージョンのVPN Gatewayが持つパブリックIPアドレスを指定 |
| Region | China (Hong Kong) | ||
| Customer Gateway | ikev1test-japan | IPアドレス | HongkongリージョンのVPN Gatewayが持つパブリックIPアドレスを指定 |
| Region | Japan (Tokyo) |
作成後は以下のようにCustomer Gatewayを確認することができます。
香港リージョン

日本リージョン

4. IPSec Connectionの作成
次にIPSec Connectionを作成します。ここでは、先ほど作成したVPN Gateway、Customer Gatewayを利用してIPSecの接続を構成します。
先ほどのCustomer Gatewayの画面にある左横のメニューから「IPSec Connection」を選択し、作成画面に遷移します。ここでは指定できるパラメータが多いため、デフォルトから変更しているパラメータのみを掲載しておきます。
| リソース種別 | リソース名 | パラメータ | 値 |
|---|---|---|---|
| IPSec Connection | ikev1test-hongkong-to-japan | Region | China (Hong Kong) |
| VPN Gateway | ikev1test-hongkong | ||
| Customer Gateway | ikev1test-hongkong | ||
| Local Network | 192.168.0.0/16 | ||
| Remote Network | 172.16.0.0/12 | ||
| Pre-Shared Key | test1234 | ||
| version | ikev1 | ||
| IPSec Connection | ikev1test-hongkong-to-us | Region | China (Hong Kong) |
| VPN Gateway | ikev1test-hongkong | ||
| Customer Gateway | ikev1test-hongkong | ||
| Local Network | 192.168.0.0/16 | ||
| Remote Network | 10.0.0.0/8 | ||
| Pre-Shared Key | test1234 | ||
| version | ikev1 | ||
| IPSec Connection | ikev1test-japan-to-hongkong | Region | Japan (Tokyo) |
| VPN Gateway | ikev1test-hongkong | ||
| Customer Gateway | ikev1test-hongkong | ||
| Local Network | 172.16.0.0/12 | ||
| Remote Network | 192.168.0.0/16 | ||
| Pre-Shared Key | test1234 | ||
| version | ikev1 | ||
| IPSec Connection | ikev1test-us-to-hongkong | Region | Japan (Tokyo) |
| VPN Gateway | ikev1test-hongkong | ||
| Customer Gateway | ikev1test-hongkong | ||
| Local Network | 10.0.0.0/8 | ||
| Remote Network | 192.168.0.0/16 | ||
| Pre-Shared Key | test1234 | ||
| version | ikev1 |
まずはローカルDC(香港リージョンのVPC)とローカルVPC(日本リージョンのVPC)を接続するikev1test-hongkong-to-japan ikev1test-japan-to-hongkongの2つのリソースを作成します。以下の画像の通り、必要なパラメータを設定して、それぞれ作成します。
ikev1test-hongkong-to-japan

ikev1test-japan-to-hongkong



なお、IPSec Connectionを作成した時点でRoute Entryの作成を促す画面が表示されます。今回は後ほどまとめてRoute Entryを設定しましたが、IPSec Connectionの作成に合わせて設定をしても問題ありません。

作成後は以下のようにリソースが確認できます。なお画像では香港リージョンの側がネゴシエーションに失敗していますが、日本リージョンのIPSec接続を作成したのちにネゴシエーションに成功していることは確認しています。
香港リージョン

日本リージョン

続いて、ローカルDC(香港リージョンのVPC)とリモートVPC(USリージョンのVPC)とを接続するためのikev1test-hongkong-to-us ikev1test-us-to-hongkongを作成します。
ikev1test-hongkong-to-us

ikev1test-us-to-hongkong

作成後は以下の通り表示されます。この時点ではIPSecのトンネル自体はGateway間で確立していますが、疎通は取れない状態です。
香港リージョン

日本リージョン

5. CENの作成とVPCのアタッチ
続いてCENの作成を行います。CENでは日本リージョンとUSリージョンのVPCをアタッチします。なお、CENを利用する場合、帯域幅パッケージを購入することで利用する帯域を決定しますが、帯域幅パッケージを購入しない場合でもPing疎通を確認できる程度の最低限の帯域は確保されています。
CENを作成するには、Alibaba CloudのWebコンソールから「Cloud Enterprise Network」を選択し、CENの管理画面に遷移します。

「Create CEN Instance」を選択し、CENの作成画面に遷移します。ここではCENの名称とアタッチする一つ目のVPCを選択します。

CENを作成後は以下のように表示されます。もう一つのVPCをアタッチするため、作成したばかりのCENを選択します。

CEN毎のリソース画面に遷移した後、「Attach Network」を選択します。

USリージョンのVPCを選択し、アタッチします。

USリージョンのVPCをアタッチすると、以下のように2つのVPCがCENにアタッチされたことが確認できます。

6. Route Entryの設定
次に各VPC間で通信を行うため、Route Entryを設定します。
まず香港リージョンのRoute Entryを設定します。先ほどのCEN管理画面に左横にあるメニューから「Route Table」を選択します。VPCを作成した時点でRoute Tableは作成されており、今回利用するVPCと関連したRoute Tableを選択します。

ikev1test-hongkongに関連付けられているRoute Tableの管理画面に遷移したら「Add Route Entry」を選択します。

まずは香港リージョンから日本リージョンへのルーティングを追加します。Next Hopとして作成したVPN Gatewayのikev1test-hongkongを指定します。

次に香港リージョンからUSリージョンへのルーティングを追加します。

Route Entryを追加した後は、以下のように表示されます。

次に日本リージョンのRoute Tableの設定を変更します。日本リージョンのVPCであるikev1test-japanと関連付けられたRoute Tableを選択します。ikev1test-japanが持つCIDRの172.16.0.0/12がCENに向けて広報されているのが確認できます。

ここでは先ほど香港リージョンで追加したRoute Entryの情報が確認できます。このRoute Entry情報をCENに向けて広報するため、「Publish」という項目を選択します。

確認画面が表示されるので許可します。

先ほどの項目が「Published」と表示されていればCENへの広報が有効になっています。なお、Publishの設定が反映されるまでしばらく時間がかかります。

最後はUSリージョンのRoute Tableですが、こちらは特に必要な設定変更はありません。一応USリージョンのVPCであるikev1test-usに紐づいたRoute Tableを確認すると、以下のように表示されます。

ここまでで3つのVPCの間で通信を行う環境が用意できました。
7. Security Group / Security Group Ruleの作成
ここからは、通信テストを行うための準備となります。まずはVPC間での通信を許可するため、Security Group及びSecurity Group Ruleを設定し、VPC間での通信を許可するルールに加え、ローカルの操作端末からECSにアクセスするのに必要なパブリックIPアドレスの許可設定を追加します。
各Security Groupとルールの設定は以下の通りになります。
香港リージョン

日本リージョン

USリージョン

8. ECSの作成
次に疎通確認を行うECSインスタンスを各リージョンに作成します。ここでは特に気を付けるべき点はありませんが、作成したVPC・VswitchとECSとを紐づけることを忘れないようにしましょう。
香港リージョン

日本リージョン

USリージョン

9. 接続テスト
最後にECS間でPing疎通性を確認します。作成したECSにSSH接続し、それぞれのECSから対向に向けてPingコマンドを実行します。
# Hong KongリージョンのECS # Hong KongからJapan [root@ikev1test-hongkong ~]# ping 172.16.0.65 PING 172.16.0.65 (172.16.0.65) 56(84) bytes of data. 64 bytes from 172.16.0.65: icmp_seq=1 ttl=62 time=53.3 ms 64 bytes from 172.16.0.65: icmp_seq=2 ttl=62 time=53.3 ms 64 bytes from 172.16.0.65: icmp_seq=3 ttl=62 time=53.3 ms 64 bytes from 172.16.0.65: icmp_seq=4 ttl=62 time=53.4 ms 64 bytes from 172.16.0.65: icmp_seq=5 ttl=62 time=53.3 ms 64 bytes from 172.16.0.65: icmp_seq=6 ttl=62 time=53.3 ms ^C --- 172.16.0.65 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5006ms rtt min/avg/max/mdev = 53.334/53.385/53.492/0.271 ms # Hong KongからUS [root@ikev1test-hongkong ~]# ping 10.0.0.231 PING 10.0.0.231 (10.0.0.231) 56(84) bytes of data. 64 bytes from 10.0.0.231: icmp_seq=1 ttl=62 time=158 ms 64 bytes from 10.0.0.231: icmp_seq=2 ttl=62 time=158 ms 64 bytes from 10.0.0.231: icmp_seq=3 ttl=62 time=158 ms 64 bytes from 10.0.0.231: icmp_seq=4 ttl=62 time=158 ms 64 bytes from 10.0.0.231: icmp_seq=5 ttl=62 time=158 ms 64 bytes from 10.0.0.231: icmp_seq=6 ttl=62 time=158 ms ^C --- 10.0.0.231 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5005ms rtt min/avg/max/mdev = 158.004/158.099/158.436/0.154 ms # JapanリージョンのECS # JapanからHong Kong [root@ikev1test-japan ~]# ping 192.168.0.219 PING 192.168.0.219 (192.168.0.219) 56(84) bytes of data. 64 bytes from 192.168.0.219: icmp_seq=1 ttl=62 time=53.2 ms 64 bytes from 192.168.0.219: icmp_seq=2 ttl=62 time=53.3 ms 64 bytes from 192.168.0.219: icmp_seq=3 ttl=62 time=56.8 ms 64 bytes from 192.168.0.219: icmp_seq=4 ttl=62 time=53.4 ms 64 bytes from 192.168.0.219: icmp_seq=5 ttl=62 time=53.2 ms 64 bytes from 192.168.0.219: icmp_seq=6 ttl=62 time=53.2 ms ^C --- 192.168.0.219 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5007ms rtt min/avg/max/mdev = 53.220/53.905/56.893/1.364 ms # JapanからUS [root@ikev1test-japan ~]# ping 10.0.0.231 PING 10.0.0.231 (10.0.0.231) 56(84) bytes of data. 64 bytes from 10.0.0.231: icmp_seq=1 ttl=64 time=104 ms 64 bytes from 10.0.0.231: icmp_seq=2 ttl=64 time=104 ms 64 bytes from 10.0.0.231: icmp_seq=3 ttl=64 time=104 ms 64 bytes from 10.0.0.231: icmp_seq=4 ttl=64 time=104 ms 64 bytes from 10.0.0.231: icmp_seq=5 ttl=64 time=104 ms 64 bytes from 10.0.0.231: icmp_seq=6 ttl=64 time=104 ms ^C --- 10.0.0.231 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5007ms rtt min/avg/max/mdev = 104.643/104.660/104.680/0.373 ms # USリージョンのECS # USからHong Kong [root@ikev1test-us ~]# ping 192.168.0.219 PING 192.168.0.219 (192.168.0.219) 56(84) bytes of data. 64 bytes from 192.168.0.219: icmp_seq=1 ttl=62 time=146 ms 64 bytes from 192.168.0.219: icmp_seq=2 ttl=62 time=146 ms 64 bytes from 192.168.0.219: icmp_seq=3 ttl=62 time=146 ms 64 bytes from 192.168.0.219: icmp_seq=4 ttl=62 time=146 ms 64 bytes from 192.168.0.219: icmp_seq=5 ttl=62 time=146 ms 64 bytes from 192.168.0.219: icmp_seq=6 ttl=62 time=146 ms ^C --- 192.168.0.219 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5008ms rtt min/avg/max/mdev = 146.716/146.823/146.987/0.391 ms # USからJapan [root@ikev1test-us ~]# ping 172.16.0.65 PING 172.16.0.65 (172.16.0.65) 56(84) bytes of data. 64 bytes from 172.16.0.65: icmp_seq=1 ttl=64 time=115 ms 64 bytes from 172.16.0.65: icmp_seq=2 ttl=64 time=115 ms 64 bytes from 172.16.0.65: icmp_seq=3 ttl=64 time=115 ms 64 bytes from 172.16.0.65: icmp_seq=4 ttl=64 time=115 ms 64 bytes from 172.16.0.65: icmp_seq=5 ttl=64 time=115 ms 64 bytes from 172.16.0.65: icmp_seq=6 ttl=64 time=115 ms ^C --- 172.16.0.65 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5009ms rtt min/avg/max/mdev = 115.847/115.867/115.884/0.013 ms
上記の通り、ECS間でPing疎通を確認することができました。