マルチクラウド(AWS/Azure)間 VPNをMeraki でお手軽に構成してみる

はじめに
------

近年、パブリッククラウドも様々なサービスで差別化を図っており IaaS のみならず、様々な新しい PaaS/SaaS が日々リリースされています。ユーザーとしては、Publicクラウドの使い分けをしたいといった要件も出てくるでしょう。例えば...
とある SaaS クラウドサービスの仕様でAWSのS3にログをストアしてるんだけど、会社はAzureとExpress routeでつながってるから Azureで分析アプリケーションを立ち上げたい！...とか、
機械学習にはGCPのTensorflowを使いたいのだけども、それ以外は、AWS を使いたい！...とかとか。

要件に応じて、複数のパブリッククラウドにまたがる必要性もますます増えてくると思います。
こういった場合、クラウド同士で互いに繋がれば (VPN 張れれば) いいのに！とか思いませんか？

もちろんマルチクラウドに対応している Cisco CSR1000v を使えば、クラウド間 VPN を張るのなんて、ヨユーで出来ちゃいます！...でも、年に一度のアドベントカレンダー！普通にやってもつまんないので、今日は、Meraki vMX を使って、**お手軽に** Azure - AWS 間で Auto VPN を構成してみたいと思います。


やりたいこと
----------
Meraki vMX を使ってマルチクラウド(AWS/Azure)間 VPNを張ってみます
(今回 AWSはTokyoリージョン、Azureは東日本リージョンで vMXを立てました)


<img width="1003" alt="Screen Shot 2018-12-19 at 0.56.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/134942/17403375-a639-0af9-e5b8-e363c641dac2.png">



Meraki vMX100 とは
--------

[Meraki](http://meraki.com) は、ご存知の通り(?)クラウドマネージド型ネットワークソリューションの草分け的な存在です。 Meraki では、下記をライナップに持っています。

* MXシリーズ(UTM)
* MRシリーズ(Wi-Fiアクセスポイント)
* MSシリーズ(ネットワークスイッチ)
* MVシリーズ(ビデオカメラ)
* SMシリーズ(MDM)

中でも MXシリーズは UTM機器として、小規模用から 大規模用まで、数多くラインナップを揃えています。[vMX100](https://meraki.cisco.com/products/appliances/vmx100) は、パブリッククラウドの上で動作する仮想アプライアンスとして提供されてるモデルになります。vMX100は、現在、AWS と Azure で提供されています。


Auto VPN とは
--------

セットアップに行く前に、Meraki MX シリーズの特徴の一つである、[Auto VPN](https://meraki.cisco.com/technologies/auto-vpn)について紹介させてください。Merakiでは、Site-to-Site VPNの設定が非常に簡単です。この簡単にVPN設定できる機能のことを Auto VPN と呼んでいます。特徴としては下記があります。

Meraki はクラウドマネージド型であるため、管理用のGUIはMerakiクラウドで用意されています。管理情報がクラウド上にあるため、NATの裏にあるUTM同士で、[UDPホールパンチング](https://ja.wikipedia.org/wiki/UDP%E3%83%9B%E3%83%BC%E3%83%AB%E3%83%91%E3%83%B3%E3%83%81%E3%83%B3%E3%82%B0) を使って、NATルーターのファイアーウォールでポート転送等を設定せずにIPSec VPNを張ることができます。すなわち、言い換えると **ファイアーウォールに何も手を加えずにPrivateアドレスを持つデバイス同士でVPNが実現できます。**

また、Merakiの設計思想として Simplicity があり、すべての設定を簡単にすることにフォーカスしています。そのため、拠点間VPNの設定についても、非常に簡単に設定できるようになっています。基本的には、**UTMがHubとして動作するか、Spokeとして動作するかを指定するだけで、設定が完結します。**

Meraki MX を使えば、Auto VPNの仕組みを使って、IPSecのパラメータとか ムズカシイことは理解できていなくとも **超お手軽** に他拠点にまたがるVPNが張れちゃうってことです！


セットアップ
----------
それでは、今回の環境を構築してみましょう。基本的には、下記の3つの手順で完了です。

1. Meraki vMX100 のライセンスを入手 Merakiダッシュボードに登録
2. AWS / Azure の各クラウドでインスタンスを立ち上げる
3. Auto VPNの設定をする

基本的には、下記のドキュメントどおりに実施すれば、問題なくインスタンスが立ち上がりますが、いくつか注意事項をメモしておきます。

 - Meraki vMX100 Azure Setup Guide
https://documentation.meraki.com/MX/Installation_Guides/vMX100_Setup_Guide_for_Microsoft_Azure

 - Meraki vMX100 AWS Setup Guide
https://documentation.meraki.com/MX/Installation_Guides/vMX100_Setup_Guide_for_Amazon_AWS

### Meraki vMX100 のライセンスを入手 Meraki ダッシュボードに登録

vMX100 のライセンス登録後、vMX100を構成するためには、AWS用のネットワーク、Azure用のネットワークを作成する必要があります。その際には、Network Type を Security Appliance にしましょう。そうすると、vMX を作成できます。
(Combined Networkにすると、先にネットワークデバイスを登録しろとエラーが出ます(通常はハードウェアデバイスが存在するためこれでいいのです))

![createnetwork.png](https://qiita-image-store.s3.amazonaws.com/0/134942/51ee527c-36d9-6a00-d8a1-ef0062b9eafa.png)


### AWS / Azure の各クラウドでインスタンスを立ち上げる

上記で作成した、vMX の画面から、Meraki登録用のキーを生成して、ドキュメントどおりインスタンスを立ち上げれば良いです。
一点、ハマりどころ(というか私がハマった)としては、Azure の場合は、Meraki のインスタンスを立ち上げる前に、先に独立したリソースグループに、VNET を作っておく必要があります。AzureではvMX100のリソースグループとVNETのリソースグループを別にする必要があります。

### Auto VPN の設定

Meraki 上 での AutoVPNの設定は非常に簡単です。vMX100をHub として設定して、対向に伝えたいネットワークを記載します。
![s2svpn.png](https://qiita-image-store.s3.amazonaws.com/0/134942/f8ccfa2e-c63c-87d9-f372-7444d95fa157.png)
設計の上での注意点として、Meraki vMX100では、フルトンネルをサポートしていません、スプリットトンネルで動作する形になります。IPSec を通す宛先は(クラウドでのルートテーブルや、Meraki上のルートテーブルに)明示して設定する必要があります。

ということで、しばらくすると、VPN Status の画面で下記のとおり確認できます！ **楽ちん** でしょ？
![vpnstatus.png](https://qiita-image-store.s3.amazonaws.com/0/134942/551d2f74-a3bb-6bb8-9d0f-c4f2bab59e16.png)

Merakiには、Ping 等のツールセットも管理 GUI から実行できます。さらに、なんと！クラウドの管理画面からパケットキャプチャも取得できます！
![pcap.png](https://qiita-image-store.s3.amazonaws.com/0/134942/a5815a24-7121-b2bc-67b1-64d8fb44bd6a.png)


### デモ
対抗のプライベートネットワークに Ping が届くのがわかります。下の画像をクリックするとビデオが開きます(Vimeo)
[![Vimeoに飛びます](https://i.vimeocdn.com/video/747085281.webp?mw=1920&amp;mh=1080&amp;q=70)](https://vimeo.com/307185972)




スループット測定
---------

せっかくなので iperf3 を使って パブリッククラウド間の VPN スループット測定でもしてみます。

> (注意) この結果は、個人的な環境で実施しています。あくまで参考値です。

トポロジは下記の通りです

- リージョンは両クラウドともに日本国内のリージョンを利用しています
- iperf用にLinuxのインスタンスを両クラウドに立てています。各インスタンスは高速ネットワークに対応したインスタンスを利用しています。AWSは、c5.large の AWS linux, Azure は Standard D2 v2 の Ubuntu で立てました。

<img width="1089" alt="Screen Shot 2018-12-19 at 0.11.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/134942/6ebf46a2-b4ee-129c-cde7-6aa740790805.png">


AWS側 - AWS Linux

```html:AWS側-AWSLinux
[ec2-user@ip-172-31-15-188 ~]$ uname -a
Linux ip-172-31-15-188.ap-northeast-1.compute.internal 4.14.77-81.59.amzn2.x86_64 #1 SMP Mon Nov 12 21:32:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```

Azure側 - Ubuntu18.04

```html:Azure側-Ubuntu18.04
shogokatsurada@Ubuntu:~$ uname -a
Linux Ubuntu 4.15.0-1035-azure #36-Ubuntu SMP Fri Nov 30 12:47:16 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
それでは測定してみます！

```html:AWSサーバー側
[ec2-user@ip-172-31-15-188 ~]$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 10.0.0.5, port 44806
[  5] local 172.31.15.188 port 5201 connected to 10.0.0.5 port 44808
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  46.8 MBytes   393 Mbits/sec                  
[  5]   1.00-2.00   sec  49.6 MBytes   416 Mbits/sec                  
[  5]   2.00-3.00   sec  49.9 MBytes   418 Mbits/sec                  
[  5]   3.00-4.00   sec  49.7 MBytes   417 Mbits/sec                  
[  5]   4.00-5.00   sec  49.9 MBytes   419 Mbits/sec                  
[  5]   5.00-6.00   sec  49.5 MBytes   416 Mbits/sec                  
[  5]   6.00-7.00   sec  49.7 MBytes   417 Mbits/sec                  
[  5]   7.00-8.00   sec  49.9 MBytes   419 Mbits/sec                  
[  5]   8.00-9.00   sec  49.3 MBytes   413 Mbits/sec                  
[  5]   9.00-10.00  sec  38.6 MBytes   324 Mbits/sec                  
[  5]  10.00-10.04  sec  1.75 MBytes   362 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.04  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.04  sec   485 MBytes   405 Mbits/sec                  receiver
```

```html:Azureクライアント側
shogokatsurada@Ubuntu:~$ iperf3 -c 172.31.15.188
Connecting to host 172.31.15.188, port 5201
[  4] local 10.0.0.5 port 44808 connected to 172.31.15.188 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  50.2 MBytes   421 Mbits/sec   31    431 KBytes       
[  4]   1.00-2.00   sec  49.6 MBytes   416 Mbits/sec    3    370 KBytes       
[  4]   2.00-3.00   sec  49.8 MBytes   418 Mbits/sec    0    455 KBytes       
[  4]   3.00-4.00   sec  49.8 MBytes   417 Mbits/sec    7    397 KBytes       
[  4]   4.00-5.00   sec  49.8 MBytes   418 Mbits/sec    0    477 KBytes       
[  4]   5.00-6.00   sec  49.5 MBytes   416 Mbits/sec    3    425 KBytes       
[  4]   6.00-7.00   sec  49.7 MBytes   417 Mbits/sec    7    363 KBytes       
[  4]   7.00-8.00   sec  49.9 MBytes   419 Mbits/sec    0    451 KBytes       
[  4]   8.00-9.00   sec  49.0 MBytes   411 Mbits/sec    1    392 KBytes       
[  4]   9.00-10.00  sec  38.7 MBytes   324 Mbits/sec   30    286 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   486 MBytes   408 Mbits/sec   82             sender
[  4]   0.00-10.00  sec   485 MBytes   407 Mbits/sec                  receiver

iperf Done.
```
Meraki vMX100は カタログ値で目安のIPSecスループットとして 500Mbps としていますが、実測値でも 400Mbpsくらい出ていました。
クラウド間接続でこれだけ出れば十分じゃないでしょうか？

> (注意) この結果は、個人的な環境で実施しています。あくまで参考値です。


まとめ
-----

パブリッククラウド間のVPN接続に関しても、Meraki vMX を使えば、VPNの設定自体はネットワークの深い知識は必要なく設定できます。どちらかというと、パブリッククラウド毎のお作法、ルートテーブルやセキュリティグループ、VPC/VNETの通信について確認するのに、少し時間がかかったくらいで、**とっても簡単でした!**

クラウド間VPN接続ですが、日本国内のリージョン同士だと思ったより速度がでますね。

今回は、vMX100同士のIPSec VPN でしたが、もちろん他の物理UTMのMXシリーズ(MX67...etc)とvMX100 を組み合わせてVPNで接続することもできますから、拠点間VPNをパブリッククラウドへ集約することも簡単にできますよ！
クラウドエッジの選択肢の一つとして、面白い製品だと思います。