AWSには通信を制御する仕組みが2つあります。セキュリティグループ(SG)とネットワークACL(NACL)。混同しやすいので、違いを整理します。
セキュリティグループ(SG)
EC2などのインスタンス単位に付けるファイアウォールです。
- ステートフル: 行きの通信を許可すれば、戻りは自動で許可される
- 許可のみ: 「許可」ルールだけ書く(明示的な拒否はない)
- デフォルトは、インバウンド全拒否・アウトバウンド全許可
例: Webサーバのインバウンドに「443を許可」と書けば、その戻り通信は自動で通ります。戻りのルールを書かなくていいのがステートフルの便利な点です。
ネットワークACL(NACL)
サブネット単位に付けるファイアウォールです。
- ステートレス: 行きと戻りを、両方明示的に許可する必要がある
- 許可も拒否も書ける: ルール番号の順で評価
- デフォルトは全許可
サブネット全体に一律のルールをかけたい時や、特定IPを明示的に拒否したい時に使います。
一番の違い:ステートフルか、ステートレスか
- SG(ステートフル): 行きを許可すれば戻りは自動。書くのが楽。
- NACL(ステートレス): 行きも戻りも書く必要あり。戻り用のポート範囲(エフェメラルポート)の許可を忘れると通信が片方向で詰まる。
「NACLで通信できない」の定番原因が、この戻り通信の許可漏れです。
適用の順番
通信は、サブネットの入口でNACL → インスタンスでSG、の順にチェックされます。両方で許可されて初めて通ります。片方で弾かれると通信できません。
どう使い分けるか
- 基本はSGで制御: インスタンス単位で細かく、ステートフルで楽。
- NACLは補助的に: サブネット全体の粗い制御や、特定IPのブロックに。
多くの設計では、SGを主役にし、NACLはデフォルト(全許可)のまま、というケースも多いです。
まとめ
- SG … インスタンス単位・ステートフル・許可のみ(主役)
- NACL … サブネット単位・ステートレス・許可/拒否(補助)
「通信できない」時は、まずSGのインバウンド、次にNACLの戻り許可を疑う。この2層を理解すると、AWSのネットワークトラブルの多くが切り分けられます。