こんにちは、技術4課の城です。
私事ですが、梅雨明けし一気に暑くなってきたところで、早くも夏風邪をひきました。
気合で乗り切りたいと思いますが、子供が小さいとありがちな家族内の風邪ループが発生しており、いち早く収束してくれることを願っています。
話は変わり、「何を言っているんだお前は?」と言われそうな長いタイトルですが、ちょっと複雑な要件のVPCと外部ネットワークの接続について検証し実現できましたので、共有します。
実現したい要件について
さっそくですが、こんな要件です。
- オンプレ側のネットワークに手を入れることは不可、GWでのNATは出来ない
- 既存EC2のIPアドレスはクラスCのIP(192.168.0.10)で設定されている
- オンプレ側から既存EC2へはクラスBのIP(172.16.0.10)としてアクセスさせたい
- 双方向の通信が必要
VPC エンドポイントサービス (AWS PrivateLink)とは
そもそもVPC エンドポイントサービス (AWS PrivateLink)とはどのようなサービスなのかと言いますと、公式ドキュメントに下記記載があります。
VPC で独自のアプリケーションを作成し、これを AWS PrivateLink を使用するサービス (エンドポイントサービス) として設定できます。
作成したNLBにアクセスするインターフェースを別のVPC(アカウント問わず)作成できるサービスというと、理解がしやすいかもしれません。
VPC エンドポイントサービス (AWS PrivateLink)
構成図と概要
構成図は下図となります。
オンプレ側からは既存EC2を172.16.0.10としてアクセスします。
このIPはNATサーバーに付与されており、NATサーバーからAWS PrivateLinkを介して既存EC2に転送されます。
既存EC2からはまずVPC Endpointのインターフェースにアクセスし、これがNATサーバーで送信元をNATサーバー、送信先をオンプレサーバーとしてNATし、オンプレサーバーに転送される仕組みです。
今回はhttpアクセスを利用して、双方向通信が実現できているか確認したいと思います。
VPC Peeringじゃダメなんでしょうか?
VPC Peeringでは既存EC2からオンプレサーバーのルートをNATサーバーを指定すれば・・・とも考えましたが、ルートテーブルを定義することが出来ず、断念しました。
NATサーバーは既存VPC外の為、宛先10.200.0.10に対し、NATサーバーをターゲットとして指定することが出来ません。
各リソースについて
VPC
図中右側のvpc-test01(10.200.0.0/16)が仮想オンプレ環境です。
図中左側のvpc-test02(192.168.0.0/16)が既存AWS(以降、既存VPC)環境です。
図中中央のvpc-test03(172.16.0.0/16)が中継に利用するVPC(以降、中継VPC)になります。
仮想オンプレ環境にVPNサーバーを用意し、中継VPCとVPN GatewayにてVPN接続しています。
接続サーバー
ec2-test01(192.168.0.10)(以降、既存EC2)、ec2-test02(10.200.0.10)(以降、オンプレサーバー)を用意しました。
それぞれhttpdを起動させています。
VPCエンドポイントとNLB
通信方向につき1セット(今回は双方向なので2セット)必要となります。
NATサーバー
条件に応じてNAT処理を行うサーバーとなります。
今回はSophos UTM9を利用しています。
各リソースの設定
NLB
下記の内容で作成しました。
オンプレサーバー⇒既存EC2用NLB
項目 | パラメータ |
Name | nlb-test02 |
スキーム | internal |
subnet | subnet-test02(192.168.0.0/24) |
Listener | TCP:80 |
Listenerの転送先 | tg-test02 |
オンプレサーバー⇒既存EC2用NLBの転送先ターゲットグループ
項目 | パラメータ |
Name | tg-test02 |
プロトコル | TCP |
ポート | 80 |
ターゲット | ec2-test02(既存EC2) |
ターゲットのポート | 80 |
既存EC2用NLB⇒オンプレサーバー
項目 | パラメータ |
Name | nlb-test03 |
スキーム | internal |
subnet | subnet-test03(172.16.0.0/24) |
Listener | TCP:80 |
Listenerの転送先 | tg-test03 |
既存EC2⇒オンプレサーバー用NLBの転送先ターゲットグループ
項目 | パラメータ |
Name | tg-test03 |
プロトコル | TCP |
ポート | 80 |
ターゲット | NATサーバー |
ターゲットのポート | 80 |
VPCエンドポイントサービス
VPCダッシュボードのサイドバーの[エンドポイントのサービス]から作成します。
各NLBに対し、1つのエンドポイントサービスを作成します。
VPCエンドポイント(Private Link)作成時に下記サービス名が必要になります。
com.amazonaws.vpce.ap-northeast-1.vpce-svc-*****************
エンドポイント
VPCダッシュボードのサイドバーの[エンドポイント]から作成します。
オンプレサーバー⇒既存EC2用エンドポイント
項目 | パラメータ |
サービスカテゴリ | サービスを名前で検索 |
サービス名 | 前項で作成したサービス名 |
VPC | vpc-test03(中継VPC) |
サブネット | subnet-test03 |
セキュリティグループ | NATサーバーからのTCP80を許可ルールを記載したSG |
既存EC2⇒オンプレサーバー用エンドポイント
項目 | パラメータ |
サービスカテゴリ | サービスを名前で検索 |
サービス名 | 前項で作成したサービス名 |
VPC | vpc-test02(既存VPC) |
サブネット | subnet-test02 |
セキュリティグループ | 既存EC2からのTCP80を許可ルールを記載したSG |
それぞれのエンドポイントのIPアドレスを確認しておきます。
各エンドポイントの[サブネットタブ]で確認可能です。
NATサーバー
ここではNAT設定に関する部分を記載します。
ネットワーク定義
SophosUTMではホスト、ネットワーク、ネットワークグループを一元的に定義することができ、今回は下記のとおり、定義します。
名前 | タイプ | IPv4アドレス |
ec2-test01 | ホスト | 10.200.0.10 |
ec2-test02 | ホスト | 192.168.0.10 |
NAT-Server | ホスト | 172.16.0.10 |
subnet-test03 | ネットワーク | 172.16.0.0/24 |
vpc-endpoint03 | ホスト | 172.16.0.243 |
vpc-endpoint03は[オンプレサーバー⇒既存EC2用エンドポイント]を設定します。
IPv4アドレスは確認したエンドポイントのIPアドレスになります。
NAT
サイドバーの[ネットワークプロテクション] > [NAT] を選択し、タブの[NAT]をクリックして設定します。
下図のようにマッチング条件、アクションを設定します。
確認
オンプレサーバー、及び、既存EC2からcurlコマンドにて確認してみます。
オンプレサーバー
[ec2-user@ip-10-200-0-10 ~]$ curl 172.16.0.10 hello from test02
既存EC2
[ec2-user@ip-192-168-0-10 ~]$ curl 192.168.0.203 hello from test01
疎通できました!
できなかったこと
既存EC2からオンプレサーバーのIPアドレスでアクセスしようと、ルートテーブルに 10.200.0.10/32⇒VPCエンドポイントのENI
を登録してみましたが、レスポンスが返ってこず、出来ませんでした。
VPCエンドポイントのIPアドレス、または、DNS名でアクセスする必要がありそうです。
最後に
VPCのCIDR追加には同一クラスしか追加出来ないという制限があり、上記検証をしました。
リソースの増加と設定項目が多いことにより、管理コストは高くなりそうですが、どうしてもそのサーバー自体と接続する必要がある場合の回避策として、使えるかと思います。
どなたかの参考になれば幸いです。
城 航太 (記事一覧)
営業部カスタマーサクセス課・課長
AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020