インスタンス間のパブリックIPでの通信は本当に外部に出ないのか試してみた

2021.12.24

この記事はアノテーション株式会社 AWS Technical Support Advent Calendar 2021のカレンダー | Advent Calendar 2021 - Qiita 24日目の記事です。

はじめに

Amazon VPC ドキュメントのよくある質問1にこんな内容があります。

Q:2 つのインスタンスがパブリック IP アドレスを使用して通信する場合、またはインスタンスが AWS のサービスのパブリックエンドポイントと通信する場合、トラフィックはインターネットを経由しますか?

いいえ。パブリックアドレススペースを使用する場合、AWS でホストされているインスタンスとサービス間のすべての通信は AWS のプライベートネットワークを使用します。AWS ネットワークから発信され、AWS ネットワーク上の送信先を持つパケットは、AWS 中国リージョンとの間のトラフィックを除いて、AWS グローバルネットワークにとどまります。

どうやらインスタンス間の通信でプライベートIPでは無くパブリックIPを指定した場合でも、インターネットには出て行かないようです。

確かめるために、tracerouteで経路を辿ってみることにしました。

同一VPC間での通信

環境用意

まずは同一VPC間での通信を試してみましょう

Instance A から Instance B に対して以下の3つの宛先を指定してtracerouteで辿ってみたいと思います。

  • プライベート IPv4 アドレス
  • パブリック IPv4 アドレス
  • パブリック IPv4 DNS

プライベート IPv4 アドレスでの通信

$ traceroute 172.31.10.178
traceroute to 172.31.10.178 (172.31.10.178), 30 hops max, 60 byte packets
 1  ip-172-31-10-178.ap-northeast-1.compute.internal (172.31.10.178)  1.620 ms  1.593 ms  1.579 ms

当然ではありますが、同 VPC 内のプライベートIPでの通信なので、何も経由せずに直接通信が出来ました。

パブリック IPv4 アドレスでの通信

$ traceroute ***.***.***.***
traceroute to ***.***.***.*** (***.***.***.***), 30 hops max, 60 byte packets
 1  ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  1.778 ms ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  16.910 ms ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  1.068 ms
 2  ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  1.613 ms  1.615 ms  1.603 ms
 ↑宛先のEC2

お、AWS内部の経路だけで到達していますね。

1で経由している ec2-***-***-***-*** はtracerouteを実行するたびに変更されていました。

パブリック IPv4 DNSでの通信

$ traceroute ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com
traceroute to ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (172.31.10.178), 30 hops max, 60 byte packets
 1  ip-172-31-10-178.ap-northeast-1.compute.internal (172.31.10.178)  1.627 ms  1.589 ms  1.600 ms

パブリック IPv4 DNS の指定なのでパブリック IPv4 アドレスで通信するものかと思っていましたが、同 VPC 内の通信であればプライベート IPv4 アドレスとして名前解決され、 VPC 内での閉じた通信になるようです。

異なるVPC間での通信

環境用意

次に異なるVPC間での通信を試してみます

Instance A から Instance B に対して以下の2つの宛先を指定してtracerouteで辿ってみたいと思います。

  • パブリック IPv4 アドレス
  • パブリック IPv4 DNS

パブリック IPv4 アドレスでの通信

$ traceroute ***.***.***.***
traceroute to ***.***.***.*** (***.***.***.***), 30 hops max, 60 byte packets
 1  ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  3.301 ms ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  4.684 ms ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  60.808 ms
 2  ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  1.659 ms  1.648 ms  1.639 ms

同 VPC 間での通信と同じ結果になりました。AWS内部の経路だけで到達していますね。

パブリック IPv4 DNSでの通信

$ traceroute ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com
traceroute to ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***), 30 hops max, 60 byte packets
 1  ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  7.693 ms ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com ***.***.***.***)  3.812 ms ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  7.659 ms
 2  ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com (***.***.***.***)  1.678 ms  1.667 ms  1.671 ms

VPCが異なるためパブリック IPv4 アドレスでの通信となりました。AWS内部の経路だけで到達しています。

最後に

ということで、ドキュメントに記載されている通りインスタンス間の通信はパブリック IP アドレスを指定してもインターネットは経由しないということを確認出来ました。

今回は EC2 インスタンス間の通信を検証しましたが、S3 等の各サービスのパブリックエンドポイントへの通信もインターネットは経由しないということになります。

では、VPC エンドポイントを使用する必要はあるのか。

という疑問が出てくるかもしれませんが、VPC エンドポイントを使用しない場合、インターネットゲートウェイを経由してから各パブリックエンドポイントに通信するため、インターネットは経由しませんが、インターネットから到達可能な IP アドレス同士の通信となります。

そのため完全なプライベート接続が必要な要件があれば、 VPC エンドポイントの利用を検討する必要がありそうです。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

参考資料