Amazon Web Services ブログ

新機能 – VPC Ingress Routing – サードパーティアプライアンスの統合を簡素化

Architecting on AWS クラスを担当していたとき、お客様から、Amazon Virtual Private Cloud を設定して、オンプレミスと同じネットワークセキュリティポリシーをクラウドで実施する方法をよく尋ねられました。たとえば、侵入検知システム (IDS) アプライアンスを使用してすべての入力トラフィックをスキャンしたり、クラウドでオンプレミスと同じファイアウォールを使用したりするために。今日まで、私が提供できる唯一の答えは、すべてのトラフィックを VPC からオンプレミスのアプライアンスまたはファイアウォールにルーティングして、クラウドにルーティングする前に通常のネットワーク機器でトラフィックを検査することでした。これは明らかに理想的な設定ではなく、レイテンシーと複雑さが増します。

今日、新しい VPC ネットワーキングルーティングプリミティブを発表します。これにより、インターネットゲートウェイ (IGW) または仮想プライベートゲートウェイ (VGW) との間の送受信、または Amazon Elastic Compute Cloud (EC2) インスタンスの Elastic Network Interface へ送信されるすべてのトラフィックをルーティングできます。つまり、トラフィックがビジネスワークロードに到達する前にすべてのトラフィックを EC2 インスタンスに送信するように仮想プライベートクラウドを設定できるようになりました。通常、インスタンスはネットワークセキュリティツール (IDS/IPS または Firewall など) を実行して、疑わしいネットワークトラフィックを検査またはブロックするか、他の EC2 インスタンスにトラフィックを中継する前に他のネットワークトラフィック検査を実行します。

仕組み
その仕組みを学ぶために、この CDK スクリプトを作成して、アプライアンス用のサブネットとビジネスアプリケーション用のサブネットの 2 つのパブリックサブネットを持つ VPC を作成しました。このスクリプトは、パブリック IP アドレスを持つ 2 つの EC2 インスタンス (各サブネットに 1 つずつ) を起動します。スクリプトは以下のアーキテクチャを作成します。

これは通常の VPC であり、サブネットにはインターネットゲートウェイへのルーティングテーブルがあり、トラフィックは期待どおりに出入りします。アプリケーションインスタンスは静的なウェブサイトをホストし、どのブラウザーからもアクセスできます。EC2 コンソールからアプリケーションのパブリック DNS 名を取得できます (便宜上、CDK スクリプトのコメントに CLI バージョンも含めました)。

AWS_REGION=us-west-2
APPLICATION_IP=$(aws ec2 describe-instances                           \
                     --region $AWS_REGION                             \
                     --query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='application']].NetworkInterfaces[].Association.PublicDnsName"  \
                     --output text)
				   
curl -I $APPLICATION_IP

ルーティングの設定
ルーティングを設定するには、VPC ID、アプライアンスインスタンスにアタッチされている ENI の ENI ID、およびインターネットゲートウェイ ID を知る必要があります。提示した CDK スクリプトを使用してインフラストラクチャを作成したと仮定すると、これら 3 つの ID を見つけるために使用するコマンドは次のとおりです (お使いの AWS リージョンに合わせて調整してください)。

AWS_REGION=us-west-2
VPC_ID=$(aws cloudformation describe-stacks                              \
             --region $AWS_REGION                                        \
             --stack-name VpcIngressRoutingStack                         \
             --query "Stacks[].Outputs[?OutputKey=='VPCID'].OutputValue" \
             --output text)

ENI_ID=$(aws ec2 describe-instances                                       \
             --region $AWS_REGION                                         \
             --query "Reservations[].Instances[] | [?Tags[?Key=='Name' &&  Value=='appliance']].NetworkInterfaces[].NetworkInterfaceId" \
             --output text)

IGW_ID=$(aws ec2 describe-internet-gateways                               \
             --region $AWS_REGION                                         \
             --query "InternetGateways[] | [?Attachments[?VpcId=='${VPC_ID}']].InternetGatewayId" \
             --output text)

アプライアンスを介してすべての着信トラフィックをルーティングするには、次のように、インターネットゲートウェイのルーティングテーブルを作成し、すべてのトラフィックを EC2 インスタンス Elastic Network Interface (ENI) に転送するルールをアタッチします。

# create a new routing table for the Internet Gateway
ROUTE_TABLE_ID=$(aws ec2 create-route-table                      \
                     --region $AWS_REGION                        \
                     --vpc-id $VPC_ID                            \
                     --query "RouteTable.RouteTableId"           \
                     --output text)

# create a route for 10.0.1.0/24 pointing to the appliance ENI
aws ec2 create-route                             \
    --region $AWS_REGION                         \
    --route-table-id $ROUTE_TABLE_ID             \
    --destination-cidr-block 10.0.1.0/24         \
    --network-interface-id $ENI_ID

# associate the routing table to the Internet Gateway
aws ec2 associate-route-table                      \
    --region $AWS_REGION                           \
    --route-table-id $ROUTE_TABLE_ID               \
    --gateway-id $IGW_ID

または、新しい Edge Associations タブで VPC コンソールを使用できます。

すべてのアプリケーション送信トラフィックをアプライアンスにルーティングするために、次のように、アプリケーションサブネットのデフォルトルートをアプライアンスの ENI を指すように置き換えます。

SUBNET_ID=$(aws ec2 describe-instances                                  \
                --region $AWS_REGION                                    \
                --query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='application']].NetworkInterfaces[].SubnetId"    \
                --output text)
ROUTING_TABLE=$(aws ec2 describe-route-tables                           \
                    --region $AWS_REGION                                \
                    --query "RouteTables[?VpcId=='${VPC_ID}'] | [?Associations[?SubnetId=='${SUBNET_ID}']].RouteTableId" \
                    --output text)

# delete the existing default route (the one pointing to the internet gateway)
aws ec2 delete-route                       \
    --region $AWS_REGION                   \
    --route-table-id $ROUTING_TABLE        \
    --destination-cidr-block 0.0.0.0/0
	
# create a default route pointing to the appliance's ENI
aws ec2 create-route                          \
    --region $AWS_REGION                      \
    --route-table-id $ROUTING_TABLE           \
    --destination-cidr-block 0.0.0.0/0        \
    --network-interface-id $ENI_ID
	
aws ec2 associate-route-table       \
    --region $AWS_REGION            \
    --route-table-id $ROUTING_TABLE \
    --subnet-id $SUBNET_ID

あるいは、VPC コンソールを使用できます。正しいルーティングテーブル内で、[ルート] タブを選択し、[ルートの編集] をクリックして、アプライアンスの ENI を指すようにデフォルトルート (0.0.0.0/0 を指しているルート) を置き換えます。

これで、ルーティング設定が準備できました。新しいルーティングは次のようになります。

アプライアンスインスタンスの設定
最後に、受信したすべてのトラフィックを転送するようにアプライアンスインスタンスを設定します。通常、ソフトウェアアプライアンスがこれを行います。AWS Marketplace アプライアンスを使用する場合、追加の手順は必要ありません。プレーン Linux インスタンスを使用する場合、次の 2 つの追加手順が必要です。

1.EC2 アプライアンスインスタンスに接続し、カーネルで IP トラフィック転送を設定します。

APPLIANCE_ID=$(aws ec2 describe-instances  \
                   --region $AWS_REGION    \
                   --query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='appliance']].InstanceId" \
                   --output text)
aws ssm start-session --region $AWS_REGION --target $APPLIANCE_ID	

##
## once connected (you see the 'sh-4.2$' prompt), type:
##

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
exit

2.次のように、EC2 インスタンスを、それ自体とは異なる送信先へのトラフィックを受け入れるように設定します (送信先/送信元チェックとして知られています)。

aws ec2 modify-instance-attribute --region $AWS_REGION \
                         --no-source-dest-check        \
                         --instance-id $APPLIANCE_ID

これで、アプライアンスはトラフィックを他の EC2 インスタンスに転送する準備ができました。これをテストするには、ブラウザでアプリケーションインスタンスを指定します (または「cURL」を使用します)。

APPLICATION_IP=$(aws ec2 describe-instances --region $AWS_REGION                          \
                     --query "Reservations[].Instances[] | [?Tags[?Key=='Name' && Value=='application']].NetworkInterfaces[].Association.PublicDnsName"  \
                     --output text)
				   
curl -I $APPLICATION_IP

トラフィックがアプライアンスに実際に流れていることを確認するには、インスタンスで送信元/送信先チェックを再度有効にします (上記の modify-instance-attribute CLI コマンドで -source-dest-check パラメータを使用します)。送信元/送信先チェックが有効な場合、トラフィックはブロックされます。

クリーンアップ
この記事で提示した CDK スクリプトを使用する場合は、終了したら必ず cdk destroy を実行してください。これにより、このデモで使用する 2 つの EC2 インスタンスの料金が請求されなくなります。AWS CloudFormation の背後にあるルーティングテーブルを変更したため、ルーティングテーブル、サブネット、VPC を手動で削除する必要があります。最も簡単な方法は、VPC コンソールに移動し、VPC を選択してから [アクション]、次に [VPC の削除] をクリックすることです。コンソールは、すべてのコンポーネントを正しい順序で削除します。コンソールが VPC を削除できるようになるまで、cdk destroy の終了後 5〜10 分待つ必要がある可能性があります。

パートナーから
これらの新しいルーティング機能のベータテスト中に、AWS パートナーに早期アクセスを付与しました。パートナーはたくさんの有益なフィードバックを提供してくれました。パートナーが書いたブログ記事の一部を以下に示し、経験を共有します (公開されているリンクを使用してこの記事を更新しています)。

  • 128 Technology
  • Aviatrix
  • Checkpoint
  • Cisco
  • Citrix
  • FireEye
  • Fortinet
  • HashiCorp
  • IBM Security
  • Lastline
  • Netscout
  • Palo Alto Networks
  • ShieldX Networks
  • Sophos
  • Trend Micro
  • Valtix
  • Vectra AI
  • Versa Networks

可用性
仮想プライベートクラウドイングレスルーティングを使用するための追加費用はありません。すべてのリージョン (AWS GovCloud (米国西部) を含む) で利用でき、今日からお使いいただけます。

更新された VPC ドキュメントで、ゲートウェイルーティングテーブルの詳細を確認できます。

この新しい VPC ルーティング機能をどのアプライアンスに使うことをお考えですか?

— seb