「あれ、通信が通らない…?」ネットワークの迷宮を解く、NACLとエフェメラルポートの物語
こんにちは!SREの現場にいると、時折「すべて正しく設定したはずなのに、なぜか通信が繋がらない」という悪夢のようなトラブルに遭遇することがあります。
特に、クラウドのネットワーク設計における「NACL(ネットワークACL)」と「セキュリティグループ」の二段構えで守りを固めている時、多くの新米エンジニアを悩ませるのが「エフェメラルポート」という存在です。
今日は、この「見えない関所」の正体を、郵便配達のストーリーに例えて一緒に解き明かしていきましょう。
—
1. そもそも「NACL」と「セキュリティグループ」は何が違うの?
まず、この二つの役割を整理しましょう。
- セキュリティグループ(SG): 「親切なドアマン」です。通信の「行き」だけを許可すれば、「帰り」は自動的に通してくれるステートフルな仕組みです。
- NACL: 「厳格な門番」です。行きも帰りも、一つひとつチェックリストと照らし合わせないと通してくれません。これがステートレスな仕組みです。
郵便配達に例えると、SGは「あなたが注文した荷物だから、帰りのトラックもそのまま通していいよ」と覚えてくれていますが、NACLは「いちいち通行手形を見せろ。行きはOKでも、帰りの手形は別物だぞ」と要求してくるイメージです。
—
2. 「エフェメラルポート」という名の「帰りの通行手形」
さて、ここからが本題です。あなたがWebサーバーから外部のAPIサーバーへデータを送るとします。
1. 行き: あなたのサーバーから、ポート番号 443(HTTPS)宛に手紙を送ります。
2. 帰り: 相手のサーバーから返事が届きます。
この時、返事はサーバーの「どこ」に届けられると思いますか?実は、サーバーは通信を開始する際、自分自身に「適当な空き番号(1024〜65535番)」を割り当てて、「返事はここへちょうだいね!」と相手に伝えています。
この「適当な空き番号」のことをエフェメラルポート(Ephemeral Port)と呼びます。「エフェメラル」は「一時的・儚い」という意味。通信が終わればすぐに消えてしまう番号だからです。
なぜ通信が断絶するのか?
NACLの設定で「外部への送信(アウトバウンド)」だけを許可し、「外部からの戻り(インバウンド)」の許可を忘れていると、せっかく届いた返事が門番(NACL)によって「お前は誰だ!許可リストにない!」と追い返されてしまうのです。
—
3. 実践!AWS VPCでの正しいNACL設定
では、実際にどのように設定すればいいのでしょうか。AWSのNACL設定画面をイメージして、必要なルールを見てみましょう。
NACLのインバウンドルール(例)
ここが一番の落とし穴です。以下のルールを追加してあげないと、返事が届きません。
| ルール番号 | タイプ | プロトコル | ポート範囲 | 送信元 | 許可/拒否 |
| :— | :— | :— | :— | :— | :— |
| 100 | カスタムTCP | TCP | 1024-65535 | 0.0.0.0/0 | 許可 |
- 解説:
1024-65535という広大な範囲を許可するのは少し怖く感じるかもしれません。しかし、これは「サーバーが返事を受け取るための正規の場所」を空けているだけなので、安心してください。
—
4. Terraformで書くならこうなる!
インフラをコードで管理する(IaC)場合、以下のように記述するのが一般的です。
# アウトバウンド用(Webサーバーから外部への通信)
resource "aws_network_acl_rule" "outbound_https" {
network_acl_id = aws_network_acl.main.id
rule_number = 100
egress = true # アウトバウンド通信
protocol = "tcp"
rule_action = "allow"
cidr_block = "0.0.0.0/0"
from_port = 443
to_port = 443
}
# インバウンド用(戻りトラフィックを許可)
resource "aws_network_acl_rule" "inbound_ephemeral" {
network_acl_id = aws_network_acl.main.id
rule_number = 100
egress = false # インバウンド通信
protocol = "tcp"
rule_action = "allow"
cidr_block = "0.0.0.0/0"
from_port = 1024 # エフェメラルポートの開始
to_port = 65535 # エフェメラルポートの終了
}
—
5. まとめ:トラブルシューティングの極意
もし明日、ネットワークが繋がらないトラブルに直面したら、まずは以下のステップを思い出してください。
1. 「それはNACLの問題か?」を疑う: セキュリティグループは正しいのに通信できない場合、十中八九NACLの戻り通信許可漏れです。
2. フローログを確認する: VPCフローログを有効にして、パケットが REJECT されていないか確認しましょう。
3. ポート範囲を見直す: 戻り先のポートが 1024-65535 の範囲内に収まっているか確認してください。
ネットワークは目に見えない分、最初は難しく感じます。でも、こうして「郵便配達」のように流れを追ってみると、少しだけ親しみやすく感じませんか?
一つずつ、確実に理解していきましょう。あなたのインフラエンジニアとしての歩みを、心から応援しています!
コメント