パブリックサブネットの「正体」と、パケットを最速でインターネットへ放つための最適化論
AWSにおける「パブリックサブネット」とは、単にルートテーブルに igw-xxxxxxxx (インターネットゲートウェイ)への経路があるだけの場所だと思っていませんか?
もしそうなら、その認識は今日でアップデートしましょう。SREの視点から見れば、パブリックサブネットとは、パケットがAWSの境界を越えて広大なインターネットへと旅立つための「発射台」であり、そこでの設定一つが、レイテンシとセキュリティ、そして運用コストを決定づけます。
1. パブリックサブネットの「定義」とパケットの流儀
AWSのドキュメントでは「インターネットゲートウェイへのルートがあるサブネット」と定義されますが、物理的・論理的な挙動はもっと興味深いものです。
パブリックサブネット内のEC2インスタンスが外部と通信する際、そのパケットには「パブリックIPアドレス」または「Elastic IP (EIP)」が必須です。これは、AWSのVPC内部で使用されるプライベートIP(VPC CIDR内)が、インターネット上のルーターではルーティング不可能なためです。
ここで起きているのは 1:1 NAT(静的NAT) です。IGWは、VPCの外側から来たパケットの宛先IPを、インスタンスのプライベートIPへと書き換えます。このとき、IGWは単なるゲートウェイではなく、ステートフルな変換エンジンとして機能しています。
2. RTT削減とTCPバッファチューニングの「最適解」
インターネット越しに通信を行う際、最も重要なのは RTT (Round Trip Time) の削減です。特にTCPの 3-way handshake にかかる時間を最小化しなければ、モバイル環境や不安定な回線からのユーザー体験は致命的なものになります。
Linuxカーネルのネットワークスタックを直接叩くことで、初期の接続速度を劇的に向上させることが可能です。以下は、EC2インスタンス(Linux)での推奨設定例です。
# TCPウィンドウサイズの拡大(高帯域・長遅延回線向け)
# 読み取りバッファの最小値、デフォルト値、最大値を調整
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216'
# 書き込みバッファの最小値、デフォルト値、最大値を調整
sysctl -w net.ipv4.tcp_wmem='4096 65536 16777216'
# TCP Fast Openの有効化
# ハンドシェイクの1往復目を省略し、データ送信を開始する(クライアント・サーバー双方で必要)
sysctl -w net.ipv4.tcp_fastopen=3
# TCP Keepaliveの短縮
# 不要な接続を早期に解放し、コネクションプールを健全に保つ
sysctl -w net.ipv4.tcp_keepalive_time=600
tcp_fastopen は、TLS 1.3と組み合わせることで、まさに「接続した瞬間にデータが飛ぶ」感覚を実現します。
3. TLSハンドシェイクの最適化とHTTPヘッダー圧縮
現代のウェブ通信において、パケットのペイロードを占めるのはデータ本体よりも HTTP Header であることが少なくありません。HTTP/2 または HTTP/3 (QUIC) の採用は必須ですが、その内部仕様を理解したチューニングが差を生みます。
特に HPACK (HTTP/2のヘッダー圧縮アルゴリズム)は、重複するヘッダーを動的テーブルで管理します。これを効率化するために、サーバー側で Vary ヘッダーを適切に管理し、キャッシュヒット率を高めることが不可欠です。
# NginxでのTLS 1.3優先設定例
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# セッションチケットを有効にし、ハンドシェイクを省略(0-RTT)
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
TLS 1.3ではハンドシェイクが1往復に短縮されました。0-RTT を有効にすれば、再接続時にハンドシェイクを待たずにリクエストを送れますが、Replay Attack のリスクを伴うため、冪等なリクエスト(GETなど)に限定して運用するのが鉄則です。
4. セキュリティの防壁:パブリックサブネットを守るために
パブリックサブネットに配置するリソースは、世界中からの「攻撃」に直接晒されます。ここで重要なのは、Security Group によるホワイトリスト運用だけでなく、NACL(ネットワークACL)による層状防御です。
- Security Group: ステートフル。許可されたインバウンドパケットの戻りパケットを自動的に許可する。
- NACL: ステートレス。インバウンドとアウトバウンドを個別に定義する必要がある。エフェメラルポートの範囲(1024-65535)を適切に開けないと、外部通信が一切成立しない。
攻撃を回避するための鉄則
パブリックサブネットに配置するのは、できる限り「プロキシ」や「ロードバランサー」に留め、アプリケーション本体やDBはプライベートサブネットに押し込むのが定石です。
もし公開インスタンスを立てるなら、必ず Fail2Ban 等の動的フィルタリングを導入し、異常なアクセスを iptables で即座に落とす仕組みを構築してください。
# 特定のIPからの異常な接続試行をiptablesでDROPする例
iptables -A INPUT -s <攻撃者のIPアドレス> -j DROP
最後に:アーキテクトとしての矜持
クラウドのネットワークは「魔法」ではありません。すべてはカーネルのパケット処理と、クラウドベンダーが提供するソフトウェア定義ネットワーク(SDN)の挙動に支配されています。
パケットがどこを通り、どのようなヘッダーが付与され、どこでNATされるのか。その解像度を高めることこそが、インフラアーキテクトが持つべき本当の武器です。設定ファイルをただ書き換えるだけでなく、tcpdump を回し、パケットキャプチャを読み込み、ボトルネックを自らの目で確認してください。
それが、真に信頼できるサイトを支えるSREの第一歩です。
コメント