AWS NACLの「ステートレス」という孤独な戦い:パケットが刻む運命の境界線
クラウドアーキテクチャの設計図を広げるとき、多くのエンジニアが「セキュリティグループ(SG)があればNACLは不要ではないか?」という問いにぶつかります。確かに、ステートフルなSGは接続状態を追跡し、戻りのパケットを自動的に許可してくれる。しかし、ネットワークの最前線でパケットを捌くSREとして言わせてもらえば、「NACLのステートレス性」を理解しない設計は、深い谷底に橋を架けずに渡ろうとするようなものです。
今日は、AWS VPCにおけるNACL(ネットワークアクセスコントロールリスト)の冷徹な挙動と、それがトラフィックのパフォーマンスやセキュリティに与える影響を、パケットレベルの視点から紐解いていきましょう。
1. ステートレスという名の「記憶喪失」
NACLは、サブネットの入り口に立つ厳格な門番です。SGと決定的に異なるのは、彼らが「パケットの文脈」を一切保持しないという点です。
例えば、クライアントからWebサーバーへのリクエスト(SYNパケット)がサブネットに入ってきたとします。NACLはインバウンドルールを上から順に評価し、許可すれば通過させます。ここまでは良い。問題はその次です。サーバーが応答を返そうとする際、NACLは「これは先ほど入ってきたパケットの返信だ」などとは微塵も考えません。アウトバウンドルールを改めてゼロから評価するのです。
この「文脈の欠如」が、一時ポート(Ephemeral Ports)の開放という悪夢を生みます。
エフェメラルポートのジレンマ
多くの現場で、NACLの設定ミスにより通信が遮断される最大の原因は、戻りトラフィックのためのポート開放忘れです。TCPの標準的なエフェメラルポート範囲(通常は 1024-65535)をアウトバウンドで許可しておかなければ、どれだけインバウンドで丁寧に 80 や 443 を開けても、パケットはサブネットの出口で奈落の底へ消え去ります。
2. パフォーマンスへの静かなる侵食:RTTとTCPバッファ
NACLの評価は、ルールの数が増えれば増えるほど、微細なレイテンシの積み重ねとなります。各サブネット境界で発生するパケットの照合処理は、高頻度なマイクロサービス間通信において、無視できないRTT(往復遅延時間)の増大を招く可能性があります。
TCPバッファとMTUの最適化
NACLでフィルタリングを行う際、パケットサイズがMTU(最大転送単位)を超え、断片化(Fragment)が発生すると、NACLの評価はさらに複雑化します。特に UDP を用いたロードバランシングや、QUIC(HTTP/3)のようなプロトコルでは、パケットの断片化がパフォーマンスを直撃します。
以下は、Linuxカーネルレベルでネットワーク性能を最適化し、NACL配下でもスループットを維持するためのsysctl設定例です。
# TCPウィンドウサイズの最適化(高帯域幅/高遅延ネットワーク向け)
# 大容量通信時のスループットを最大化する
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
# TCP接続のタイムアウトを短縮し、NACLの影響を最小限に抑える
# 接続の再試行回数を減らす
sysctl -w net.ipv4.tcp_syn_retries=3
3. 実践:セキュアかつ効率的なNACL設計
NACLを「守りの要」として機能させるためには、ルール番号(Rule Number)の設計に魂を込める必要があります。ルールは番号の若い順から評価されるため、頻繁にアクセスされるルールは極力小さな番号に配置し、評価の計算コストを削減します。
推奨されるNACLルール構成例
| ルール番号 | タイプ | プロトコル | ポート範囲 | 送信元/宛先 | アクション | 備考 |
| :— | :— | :— | :— | :— | :— | :— |
| 100 | カスタムTCP | 6 | 443 | 0.0.0.0/0 | ALLOW | HTTPS通信を許可 |
| 110 | エフェメラル | 6 | 1024-65535 | 0.0.0.0/0 | ALLOW | 戻りトラフィック用 |
| 32767 | ALL | ALL | ALL | 0.0.0.0/0 | DENY | 明示的な拒否 |
4. 脆弱性回避とアーキテクチャの深淵
NACLは、SGをバイパスしようとする攻撃や、誤って公開されたサブネット内での横移動(Lateral Movement)を阻止する「最後の防衛線」です。例えば、特定の攻撃者が特定のIP範囲から執拗にスキャンを仕掛けてくる場合、SGで個別にブロックするよりも、NACLでそのIP範囲をサブネット境界で完全にドロップさせる方が、インフラ全体のCPU負荷を抑えられます。
TLSハンドシェイクの最適化とネットワーク
TLS 1.3が普及した現在、ハンドシェイクのRTTは最小化されていますが、NACLの評価処理が遅延を生むと、ハンドシェイクの「往復」回数がそのまま体感速度に跳ね返ります。
もしあなたが大規模なアーキテクチャを担当しているなら、以下の点を確認してください。
- ログの可視化: VPCフローログを有効にし、
REJECTされたパケットのsrcaddrとdstaddrを分析する。 - ルールの断捨離: 使用されていない古いルールは、評価コストだけでなく、設定ミスによる脆弱性の温床となります。
結びに:パケットを愛するということ
ネットワークエンジニアにとって、NACLは単なる設定ファイルではありません。それはパケットという名の旅人が、目的地にたどり着くために通過すべき「門」であり、その門をどう設計するかで、アプリケーションの呼吸が変わります。
ステートレスな評価という「面倒な仕組み」を味方につけ、パケットが最短距離で駆け抜けるルートを設計すること。それこそが、メガクラウドを極めるSREの矜持なのです。
さあ、次はあなたのVPCのNACLを見直す番です。不要なルールを削ぎ落とし、パケットの旅を最適化させてみませんか?
コメント