SMARTCAMP Engineer Blog

スマートキャンプ株式会社(SMARTCAMP Co., Ltd.)のエンジニアブログです。業務で取り入れた新しい技術や試行錯誤を知見として共有していきます。

AWS Client VPNがTokyoに来た! | 概要と固定IPの設定方法を解説

エンジニアの笹原です。

スマートキャンプ は6/24より新オフィスに移転するのですが、引越し日と入居日がずれることになり、6/1~21の3週間はリモートワーク期間となりました。弊社ではこの期間をリモートウィークと読んでいます。

代表の記事がこちらです。↓↓↓

note.mu

基本の就業時間を守っていれば、3週間入居しているシェアオフィスのほかに北海道支社や実家などで業務を行うことが可能だったので、タイや北海道からリモートワークをしています。

AWS Client VPNが東京リージョンで利用できるようになり、今回のリモートワークで試してみたので、導入方法やセキュリティグループの設定について書いてみたいと思います!

AWS Client VPNとは

AWS Client VPNとは、昨年12月にリリースされたクライアントベースのマネージドVPNサービスです。Open VPNベースのVPNクライアントを使用するだけで、AWS上のリソースにアクセスすることが出来ます。

昨年リリースされたときは一部リージョンのみサービスが提供され、東京リージョンでは利用することが出来ませんでしたが、先月ついに東京リージョンでもサービス提供が開始されました!!!

リモートワーク時の通信要件

リモートワークで利用する際のVPNの要件として、以下を定めました。

  • 開発環境にインターネットを経由してHTTP/HTTPSアクセスできる
  • 開発・本番環境にインターネットを経由せずにSSHアクセスできる

表にするとこんな感じです。

本番環境 開発環境
http/https - インターネット経由
ssh インターネット経由せず インターネット経由せず

SSHは、インターネット経由せず内部ネットワークを利用するため、AWS Client VPNに割り当てるセキュリティグループを適切に設定することで通信路を開けることが出来ます。

HTTP/HTTPSについては、インターネットを経由させたいので、セキュリティグループで通信路を開けることができず、インターネット利用時のIPが固定されることが必要になります。

通信要件を実現する上での課題: IPアドレスの固定

VPNからインターネットを利用する方法は以下のドキュメントに記載されています。

docs.aws.amazon.com

ただ、このドキュメント通りに設定を行っても、インターネット利用時のIPアドレスの固定は出来ません。

なぜIPアドレスを固定することができないのか

AWS Client VPNの利用を開始して、サブネットを関連付けると、関連付けられたサブネットに、ENIが2個作成されます。

その2個のENIを介して、VPNの利用者は通信を行うことになります。

f:id:yuma124:20190620173713p:plain

ただ、この2個のENIは固定されることはなく、AWS Client VPNが定期的に作成し直します。

f:id:yuma124:20190620173727p:plain

上記のドキュメントではインターネットゲートウェイが紐付けられたサブネットにAWS Client VPNエンドポイントを関連付けることにしています。

そのため、インターネットにアクセスする際には2個のENIに割り当てられたGIPを利用することになるのですが、先程言ったように、AWS Client VPNのENIは定期的に作成され直すので、GIPも変わってしまうのです。

解決策: プライベートサブネットを使う

解決策自体は単純です。

AWS Client VPNの関連付けを、インターネットゲートウェイが紐付けられているパブリックなサブネットではなく、デフォルトルートが NAT ゲートウェイに設定されているプライベートサブネットにすればいいのです。

f:id:yuma124:20190620170611p:plain

NATゲートウェイ自体は作成され直すこともなくEIPも割り当てられるので、IPアドレスが固定されます!!

やってみる

相互認証用の証明書とキーの生成とACMへの登録

OpenVPN Easy-RSAのリポジトリをクローンしてきます。

$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3

新しい PKI 環境、認証機関 (CA) を初期化します。

$ ./easyrsa init-pki
$ ./easyrsa build-ca nopass

サーバー証明書とキーを生成します。

$ ./easyrsa build-server-full server nopass
$ ./easyrsa build-client-full client1.domain.tld nopass

サーバー証明書とキーをACMに登録します。

$ aws acm import-certificate --certificate file://pki/issued/server.crt --private-key file://pki/private/server.key --certificate-chain file://pki/ca.crt --region ap-northeast-1
$ aws acm import-certificate --certificate file://pki/issued/client1.domain.tld.crt --private-key file://pki/private/client1.domain.tld.key --certificate-chain file://pki/ca.crt --region ap-northeast-1

AWS Client VPN エンドポイントの作成

https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#CreateClientVpnEndpoint:

f:id:yuma124:20190620193943p:plain

クライアントIPV4CIDRはVPNを利用するクライアントに割り当てられるIPアドレスです。 接続先のVPCのCIDRと被らないようにします。

サーバー証明書とクライアント証明書は、先程ACMに登録したものを設定します。

DNSサーバについては、指定しなくても利用できます。

サブネットの関連付け

続いてサブネットを関連付けます。

f:id:yuma124:20190620194630p:plain

このとき、デフォルトルートが NAT ゲートウェイに設定されているプライベートサブネットを指定するようにしましょう。

認証ルールの追加

最後に認証ルールを追加します。

f:id:yuma124:20190620194854p:plain

インターネットを利用するので 0.0.0.0/0 にアクセス許可しましょう。

VPN接続をする

いよいよVPN接続してみましょう!

f:id:yuma124:20190620195157p:plain

クライアントVPNの設定ファイルをコンソールからダウンロードします。

ダウンロードした設定ファイルに、クライアント証明書のパスを追記します。

cert path/to/client1.domain.tld.crt
key path/to/client1.domain.tld.key

Open VPNのクライアントとして Tunnelblick が利用できるので、設定ファイルを読み込んで接続します!

IPアドレスを確認すると、NATゲートウェイのものに変わっているはずです!!!

終わりに

今回は、AWS Client VPNで固定IPを利用する方法を解説しました。

ハードウェアも要らず、初期コストをかなり抑えた状態でVPNを利用し始めることができるのは最高ですね。

リモートワークなどする際はぜひ利用してみてください。