【VPC エンドポイントサービス (AWS PrivateLink)】オンプレから既存インスタンスのIPを別クラスのIPとして通信する検証をしてみました。

記事タイトルとURLをコピーする

こんにちは、技術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

項目パラメータ
Namenlb-test02
スキームinternal
subnetsubnet-test02(192.168.0.0/24)
ListenerTCP:80
Listenerの転送先tg-test02

オンプレサーバー⇒既存EC2用NLBの転送先ターゲットグループ

項目パラメータ
Nametg-test02
プロトコルTCP
ポート80
ターゲットec2-test02(既存EC2)
ターゲットのポート80

既存EC2用NLB⇒オンプレサーバー

項目パラメータ
Namenlb-test03
スキームinternal
subnetsubnet-test03(172.16.0.0/24)
ListenerTCP:80
Listenerの転送先tg-test03

既存EC2⇒オンプレサーバー用NLBの転送先ターゲットグループ

項目パラメータ
Nametg-test03
プロトコルTCP
ポート80
ターゲットNATサーバー
ターゲットのポート80

VPCエンドポイントサービス

VPCダッシュボードのサイドバーの[エンドポイントのサービス]から作成します。
各NLBに対し、1つのエンドポイントサービスを作成します。
VPCエンドポイント(Private Link)作成時に下記サービス名が必要になります。
com.amazonaws.vpce.ap-northeast-1.vpce-svc-*****************

エンドポイント

VPCダッシュボードのサイドバーの[エンドポイント]から作成します。

オンプレサーバー⇒既存EC2用エンドポイント

項目パラメータ
サービスカテゴリサービスを名前で検索
サービス名前項で作成したサービス名
VPCvpc-test03(中継VPC)
サブネットsubnet-test03
セキュリティグループNATサーバーからのTCP80を許可ルールを記載したSG

既存EC2⇒オンプレサーバー用エンドポイント

項目パラメータ
サービスカテゴリサービスを名前で検索
サービス名前項で作成したサービス名
VPCvpc-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