2026年9月6日
2026年9月6日
AWS ネットワークACL(NACL)のルールを確認する手順|番号順の評価・戻り通信・検証ツールまで
AWS のネットワークACL(NACL)は、サブネットの出入り口で通信を許可・拒否するステートレスなファイアウォールです。「セキュリティグループは開けたのにつながらない」ときは、NACLのルールを番号順に読み、行きと帰りの両方向が許可されているかを確かめるのが近道です。この記事では、対象のNACLを特定する方法、ルールの読み方、戻り通信(エフェメラルポート)の確認、Reachability Analyzer と VPC フローログでの検証、修正するときの注意点を順に説明します。
NACL の評価ルールを押さえる
ルールを読む前に、NACLがどう動くかを確認しておきます。ここを取り違えると、ルールを見ても原因に気づけません。
- サブネット単位で効く:NACLはサブネットに関連付けます。1つのサブネットに関連付けられるNACLは1つだけで、1つのNACLは複数のサブネットに関連付けられます。
- ステートレス:セキュリティグループと違い、行きの通信を許可しても、その応答は自動では許可されません。インバウンドとアウトバウンドのルールをそれぞれ見る必要があります。
- 番号の小さい順に評価し、最初に一致したルールで決まる:拒否のルールが許可のルールより小さい番号にあれば、許可のルールは使われません。どのルールにも一致しなければ、最後の
*のルールで拒否されます。この*のルールは変更も削除もできません。 - 既定のNACLと独自のNACLで初期状態が違う:VPCを作ると付いてくる既定のNACLは、すべての通信を許可する状態から始まります。自分で作成したNACLは、ルールを追加するまですべての通信を拒否します。
- NACLの対象外の通信がある:Amazon が提供するDNS(Route 53 Resolver)、DHCP、インスタンスメタデータなど、一部の通信はNACLで制御されません。これらの不具合をNACLで探しても見つからない点に注意してください。
セキュリティグループはインスタンスのネットワークインターフェース単位で効くステートフルなファイアウォールで、許可のルールしか書けません。通信が通るには、経路上のNACLとセキュリティグループの両方で許可されている必要があります。
手順1:対象のサブネットとNACLを特定する
通信がどのサブネットを通るかを確認し、そのサブネットに関連付いたNACLを探します。送信元と宛先が別のサブネットにある場合は、両方のサブネットのNACLが関係します。
マネジメントコンソールでは、VPC の画面でサブネットを選び、ネットワークACLのタブで関連付けを確認できます。画面の構成は変わることがあります(2026年10月現在)。AWS CLI では次のように調べます。IDは例なので、自分の環境の値に置き換えてください。
# インスタンスが属するサブネットを調べる
aws ec2 describe-instances --instance-ids i-0123456789abcdef0 \
--query 'Reservations[].Instances[].SubnetId' --output text
# そのサブネットに関連付いたNACLを調べる
aws ec2 describe-network-acls \
--filters Name=association.subnet-id,Values=subnet-0123456789abcdef0 \
--query 'NetworkAcls[].{Id:NetworkAclId,Default:IsDefault}' --output table
Default が True なら既定のNACL、False なら独自に作成したNACLです。独自のNACLで、ルールを追加し忘れているケースがよくあります。
手順2:ルールを番号順に読む
NACLのルールを、インバウンドとアウトバウンドに分けて番号順に表示します。
# インバウンド(Egress が false)を番号順に
aws ec2 describe-network-acls --network-acl-ids acl-0123456789abcdef0 \
--query 'NetworkAcls[0].Entries[?Egress==`false`] | sort_by(@, &RuleNumber)' \
--output table
# アウトバウンド(Egress が true)を番号順に
aws ec2 describe-network-acls --network-acl-ids acl-0123456789abcdef0 \
--query 'NetworkAcls[0].Entries[?Egress==`true`] | sort_by(@, &RuleNumber)' \
--output table
出力の読み方は次のとおりです。
- RuleNumber:評価の順番です。CLIの出力では、コンソールで
*と表示される最後の拒否ルールが、大きな番号(32767)として出てきます。 - Protocol:
-1はすべてのプロトコル、6はTCP、17はUDP、1はICMPです。 - PortRange:
FromとToで範囲を表します。すべてのプロトコルを対象にしたルールには表示されません。 - CidrBlock / Ipv6CidrBlock:対象のアドレス範囲です。IPv4とIPv6のルールは別々に書く必要があり、IPv6で通信しているのにIPv4のルールしかない、という見落としが起きやすい点です。
- RuleAction:
allowかdenyです。
問題の通信について、送信元のアドレス・宛先のポート・プロトコルを決め、上から順に「最初に一致するのはどのルールか」をたどります。許可のルールがあっても、それより小さい番号に一致する拒否のルールがあれば拒否されます。
手順3:戻り通信の許可を確かめる
NACLの確認でもっとも見落としやすいのが戻り通信です。たとえば外部から HTTPS(TCP 443)を受けるWebサーバーの場合、次の2つが必要です。
- インバウンド:送信元
0.0.0.0/0、TCP 443 を許可 - アウトバウンド:宛先
0.0.0.0/0、TCP のエフェメラルポート(クライアント側が使う一時的なポート)を許可
クライアントが使うエフェメラルポートの範囲はOSによって異なり、NATゲートウェイやロードバランサーを経由する場合も考える必要があります。AWS のドキュメントでは、幅広いクライアントに対応する範囲として 1024〜65535 を例に挙げています。
逆方向も同じです。インスタンスからパッケージの更新などで外部へ通信する場合は、アウトバウンドで宛先ポート(443など)を、インバウンドでエフェメラルポートを許可します。「外への通信だけ止まる」場合は、インバウンドのエフェメラルポートのルールを確認してください。
手順4:ツールで検証する
Reachability Analyzer
VPC Reachability Analyzer は、送信元と宛先を指定すると、ルートテーブル、NACL、セキュリティグループなどの設定を解析し、到達できるかと、止めている箇所を示してくれます。実際のパケットは送らないので、本番環境でも影響なく使えます。分析ごとに料金がかかるため、詳細は AWS の公式ページで確認してください。
VPC フローログ
実際の通信の記録を見るには VPC フローログを使います。各レコードの action に ACCEPT または REJECT が記録されます。NACLはステートレスなので、インバウンドは ACCEPT なのに、その応答のアウトバウンドが REJECT になっていれば、アウトバウンドのNACLで戻り通信が止められていると判断できます。セキュリティグループは応答を自動で許可するため、この「片方向だけ REJECT」の形はNACLを疑う手がかりになります。
フローログの出力先には CloudWatch Logs や S3 などを選べます。記録は即時ではなく数分程度の遅れがあるため、テストの直後に見当たらなくても少し待ってから確認します。
修正するときの注意
原因が分かったら、ルールを追加または置き換えます。次は、インバウンドの番号120に TCP 443 の許可を追加する例です。
aws ec2 create-network-acl-entry --network-acl-id acl-0123456789abcdef0 \
--ingress --rule-number 120 --protocol tcp \
--port-range From=443,To=443 --cidr-block 0.0.0.0/0 --rule-action allow
既存のルールを書き換える場合は replace-network-acl-entry を使います。作業にあたっては次の点に気をつけてください。
- 関連付いたすべてのサブネットに影響する:1つのNACLを複数のサブネットで共有している場合、変更はそのすべてに効きます。手順1で関連付けを確認してから変更します。
- 変更前のルールを保存する:手順2の出力をファイルに保存しておくと、戻すときに使えます。
- 番号に余白を残す:100、110、120 のように間隔を空けて番号を振ると、後から間にルールを差し込めます。
- 特定のIPを拒否するときは番号を小さくする:拒否のルールは、同じ通信に一致する許可のルールより小さい番号にしないと効きません。
- IaCとの差分:Terraform などで管理している場合、コンソールやCLIで直接変更すると、次の適用時に元に戻ったり差分が出たりします。コードの側を修正するのが基本です。
- ルール数の上限:NACLあたりのルール数にはクォータがあります。細かいルールを積み上げるより、セキュリティグループで制御できるものはそちらに任せ、NACLはサブネット単位の大まかな制御に使うほうが管理しやすくなります。
まとめ
- NACLはサブネット単位のステートレスなファイアウォール。番号の小さい順に評価し、最初に一致したルールで決まる
- 対象のサブネットと関連付いたNACLを特定し、インバウンドとアウトバウンドを番号順に読む
- 行きの通信だけでなく、エフェメラルポートへの戻り通信が許可されているかを確かめる
- Reachability Analyzer で設定上の到達性を、VPC フローログで実際の ACCEPT/REJECT を確認する
- 修正時は、共有しているサブネットへの影響、変更前の保存、番号の余白、IaCとの差分に注意する