【テクニカル・上級編】 NACLのルール番号評価順序と最初のマッチングによる確定 – クラウドインフラと仮想化ネットワーク実践ガイド

NACLの「最初の一撃」で全てが決まる:クラウドネットワークの聖域を最適化する

AWS VPCにおける Network ACL (NACL) は、多くのエンジニアにとって「とりあえず設定しておくステートレスなファイアウォール」という認識に留まりがちです。しかし、高トラフィックなマイクロサービスを運用するSREの視点で見れば、NACLは単なるセキュリティ境界ではなく、パケット処理のパイプラインにおいて「最初の審判」を下す重要な関所です。

今日は、NACLの評価順序という「冷徹なアルゴリズム」が、いかにしてパケットの生死を分け、パフォーマンスに影を落とすのかを深掘りします。

—

1. 順序という絶対律:NACLの評価ロジック

NACLの評価において最も重要なのは、「ルール番号が若い順に評価され、最初のマッチで評価は終了する(First-Match Termination)」という原則です。

多くのエンジニアが陥る罠は、ルール番号の設計を場当たり的に行うことです。例えば、100番のルールで Allow していても、その前段に 90番の Deny ルールが潜んでいれば、パケットは容赦なくドロップされます。この「断ち切り」の速さは、CPUリソースの無駄な消費を防ぐ点では優秀ですが、設計ミスが即座にサービス断を引き起こすリスクと背中合わせです。

パフォーマンスへの視座

NACLはステートレス(パケット単位で独立して評価)です。つまり、TCPの SYN パケットであれ、ハンドシェイク完了後のデータパケットであれ、全てのパケットがルールテーブルの頭から順にスキャンされます。ルール数が増えれば増えるほど、カーネルのパケット処理ルーチンにおける評価コストは微増します。理論上、頻繁に通信するIPセグメントを若い番号に配置することで、計算コストを最小化することが可能です。

—

2. インフラ・アーキテクトが知るべき「パケットの旅」とチューニング

パケットが IGW (Internet Gateway) を通過し、サブネットに到達した瞬間、NACLが立ちはだかります。ここで重要なのが、高レイテンシやハンドシェイク失敗を防ぐための Ephemeral Port (一時ポート) の管理です。

NACLはステートレスであるため、戻りのトラフィック(Ephemeral Port)も明示的に許可しなければなりません。これを忘れると、TLS ハンドシェイクの Server Hello が戻ってこないという悲劇が起こります。

推奨されるNACL設計のベストプラクティス

以下は、効率を重視した Inbound ルールの一例です。

# 評価の優先順位を考慮した設計
# 1. 監視・管理用の信頼できるIPを最上位に
# 2. アプリケーションの必須ポートを続く番号に
# 3. エフェメラルポート(1024-65535)を適切に開放
aws ec2 create-network-acl-entry \
    --network-acl-id acl-xxxxxxxx \
    --ingress \
    --rule-number 100 \
    --protocol tcp \
    --port-range From=443,To=443 \
    --rule-action allow \
    --cidr-block 0.0.0.0/0 # 本来は特定のCIDRに絞るべき

# 戻り通信用のエフェメラルポート開放
aws ec2 create-network-acl-entry \
    --network-acl-id acl-xxxxxxxx \
    --ingress \
    --rule-number 200 \
    --protocol tcp \
    --port-range From=1024,To=65535 \
    --rule-action allow \
    --cidr-block 0.0.0.0/0

—

3. RTT削減とTCPバッファの相関

ネットワークのパフォーマンスを語る上で避けて通れないのが RTT (Round Trip Time) です。NACL自体が遅延を生むことはほぼありませんが、適切でないルール設計によってパケットロス(ドロップ)が発生すると、TCP の再送タイマーが駆動し、指数関数的なバックオフが発生します。

特に TLS 1.3 を導入している場合、ハンドシェイクは1ラウンドトリップに短縮されています。この黄金の数ミリ秒を無駄にしないために、OSレベルのTCPチューニングと組み合わせることをお勧めします。

# カーネルパラメータでのTCPバッファ最適化(sysctl.conf)
# ネットワークの帯域と遅延を考慮したバッファサイズの拡大
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1

パケットがNACLを通過する際、そのヘッダー情報は評価されますが、ペイロードには影響しません。しかし、MTUサイズの設定ミス(パケット断片化)がNACLのルールと重なると、一部のパケットだけがフィルタリングされ、通信が「ハングする」という悪夢のようなトラブルを招きます。MSS Clamping の設定は、メガクラウドのネットワーク設計における必須スキルです。

—

4. 現場の教訓:NACLの「死角」を排除する

最後に、セキュリティ専門家として一つだけ警告します。「NACLは最後の砦であれ、メインの盾にするな」ということです。

NACLのルールリストが複雑化すると、管理負荷は指数関数的に増大し、ヒューマンエラーによる全断のリスクが高まります。私は常に以下の原則に従っています。

  • ホワイトリスト運用を徹底する: 0.0.0.0/0 を Allow にするのは、本当に公開が必要なフロントエンドのみ。
  • 拒否ルールは明確に: Deny ルールは 32000 番台以降にまとめ、意図しない通信が来た際のログ(VPC Flow Logs)を確実に残す。
  • VPC Flow Logsとの統合: どのルールにヒットしているかを可視化するパイプラインを構築しておくこと。

NACLは、クラウドネットワークの「暗黙知」が凝縮された場所です。ルール番号の評価順序という単純な仕組みの裏側に、パケットの挙動を支配する巨大な力が働いています。この力学を理解し、計算し尽くされたネットワークを構築することこそが、次世代のSREに求められる「美学」なのです。

コメント

タイトルとURLをコピーしました