ネットワークの「門番」を正しく理解しよう!AWSのNACLが「ステートレス」である理由
皆さん、こんにちは。クラウドの現場で日々パケットと格闘しているSREです。
AWSのインフラを触り始めると、必ずと言っていいほど「セキュリティグループ」と「ネットワークACL(NACL)」という二つの壁にぶつかりますよね。「どっちもファイアウォールなら、一つでいいんじゃないの?」なんて思ったことはありませんか?
実は、この二つは役割も性格も全く違います。特にNACLの「ステートレス」という性質は、初心者がもっとも躓きやすいポイントの一つ。今回は、この「ステートレス」という概念を、現実世界の例えを交えながら、泥臭い現場の視点でじっくり紐解いていきましょう。
—
1. セキュリティグループとNACL:役割の違いを「郵便」で例えると?
まず、両者の違いをイメージしてみましょう。
- セキュリティグループ(SG): サーバー(インスタンス)の玄関にある「ドアマン」です。特定の誰かを通す・通さないを判断します。
- ネットワークACL(NACL): サブネットの入り口に設置された「検問所」です。そのエリア全体への通行証を持っているかチェックします。
SGがサーバー単位で守るのに対し、NACLはサブネット(エリア)の境界を守る、より広域的な門番なのです。
—
2. なぜ「ステートレス」なのか?:記憶喪失の門番
ここからが本題です。NACLは「ステートレス」なファイアウォールと呼ばれます。これ、どういう意味でしょうか?
IT用語辞典を引くと難しく書かれていますが、シンプルに言い換えると「前のことを一切覚えていない(記録を持たない)」ということです。
郵便配達の例え話
あなたがインターネット経由でWebサイトにアクセスするとします。
1. あなたのPCから、Webサーバーに向けて「見せて!」という手紙(リクエスト)を送ります。
2. Webサーバーが「はい、どうぞ」と返事(レスポンス)を送り返します。
もし、NACLが「ステートフル(状態を保持する)」なら、門番は「さっきあなたからの手紙を通したから、帰りの返事も通してあげよう」と判断してくれます。
しかし、NACLは「ステートレス」なので、行きと帰りは完全に別物として扱います。
門番は「行き」の手紙を通した後、そのことをすぐ忘れてしまいます。そのため、「帰りの返事」が来たときにも、わざわざ「この返事は通していいものか?」を、最初から改めてチェックし直さなければならないのです。
これが「ステートレス」の正体です。「往路と復路は無関係」、これがNACLの鉄則です。
—
3. 実践!NACLの設定でハマるポイント
NACLを管理画面で設定する際、必ず「インバウンド(入ってくる通信)」と「アウトバウンド(出ていく通信)」の両方を設定する必要があります。
もし、Webサーバーを構築して「あれ?通信が通らないぞ?」となったら、大抵この設定漏れが原因です。
設定の考え方
例えば、HTTP(80番ポート)の通信を許可したい場合、以下のように設定します。
| 方向 | ルール番号 | タイプ | プロトコル | ポート | 許可/拒否 |
| :— | :— | :— | :— | :— | :— |
| インバウンド | 100 | HTTP | TCP | 80 | 許可 |
| アウトバウンド | 100 | カスタムTCP | TCP | 1024-65535 | 許可 |
なぜアウトバウンドに「1024-65535」が必要なのか?
ここが一番の落とし穴です!
Webサーバーが返事を送るとき、送信元ポートは「80」ですが、宛先ポート(あなたのPC側で開いているポート)は、OSがランダムに割り当てた「エフェメラルポート(1024〜65535番)」だからです。
NACLは「行き」の許可を覚えていないので、「帰り」の通信を通すためには、この広い範囲のポートを明示的に許可してあげる必要があるんですね。
—
4. CLIで見るNACLの制御
AWS CLIを使ってNACLのルールを定義する場合も、この「両方の方向を意識する」ことが重要です。
# インバウンド:Webアクセス(80)を許可
aws ec2 create-network-acl-entry \
--network-acl-id acl-xxxxxxxx \
--ingress \
--rule-number 100 \
--protocol tcp \
--port-range From=80,To=80 \
--rule-action allow \
--cidr-block 0.0.0.0/0 # 全世界からのアクセスを許可
# アウトバウンド:エフェメラルポート(1024-65535)を許可して返信できるようにする
aws ec2 create-network-acl-entry \
--network-acl-id acl-xxxxxxxx \
--egress \
--rule-number 100 \
--protocol tcp \
--port-range From=1024,To=65535 \
--rule-action allow \
--cidr-block 0.0.0.0/0
—
最後に:怖がらず、まずは「基本」を手に馴染ませよう
NACLの「ステートレス」という性質は、最初は少し面倒に感じるかもしれません。「いちいち両方書くなんて!」と思うのは、あなたが正常なエンジニアの証拠です(笑)。
しかし、この「往復を個別に制御できる」という仕組みは、セキュリティの最後の砦として、特定のIPアドレスからの通信をサブネットレベルで完全に遮断したいときなどに非常に強力な武器になります。
まずは、「NACLは記憶喪失の門番。行きと帰りは別々に手配が必要!」とだけ覚えておいてください。それだけで、ネットワークトラブルに遭遇したとき、解決までのスピードが劇的に変わるはずです。
それでは、また次の記事でお会いしましょう!インフラ構築を楽しんでくださいね。
コメント