基本情報技術者 2013年 秋期 午前(科目A) 問45
問題文
社内ネットワークとインターネットの接続点にパケットフィルタリング型ファイアウォールを設置して、社内ネットワーク上のPCからインターネット上のWebサーバの80番ポートにアクセスできるようにするとき、フィルタリングで許可するルールの適切な組合せはどれか。

選択肢
ア:
イ:
ウ:(正解)
エ:
パケットフィルタリングでWebアクセスを許可するルールの組合せ【午前2 解説】
要点まとめ
- 結論:クライアントは送信元ポートに1024以上のエフェメラルポート、宛先に80を使用するためウが正解です。サーバ応答はその逆になります。
- 根拠:HTTPサーバは待ち受けポート80で受信し、クライアントは一時ポート(1024以上)を送信元にして接続を開始する通信モデルに基づきます。
- 差がつくポイント:送信元/宛先ポートの向き(誰が80を使うか)を取り違えないことと、ステートレスなフィルタでは双方の方向を明示的に許可する必要がある点です。
正解の理由
正解:ウ
クライアント(PC)がWebサーバへ接続を開始する際、クライアントは自分側の送信元ポートに1024以上(エフェメラルポート)を割り当て、宛先ポートにサーバの80番を指定します。サーバからの応答パケットは送信元ポート80、宛先ポートがクライアントのエフェメラルポート(1024以上)になります。選択肢ウはこの送受信の向き(送信元ポート/宛先ポート)が正しく設定されているため、パケットフィルタリングで正しく通過を許可できます。
クライアント(PC)がWebサーバへ接続を開始する際、クライアントは自分側の送信元ポートに1024以上(エフェメラルポート)を割り当て、宛先ポートにサーバの80番を指定します。サーバからの応答パケットは送信元ポート80、宛先ポートがクライアントのエフェメラルポート(1024以上)になります。選択肢ウはこの送受信の向き(送信元ポート/宛先ポート)が正しく設定されているため、パケットフィルタリングで正しく通過を許可できます。
よくある誤解
- クライアントの送信元ポートが80だと誤解するケース:実際はサーバ側が待ち受けで80を使用します。
- サーバ応答の宛先も80だと考えるミス:応答はクライアントのエフェメラルポート宛に返るため、応答側の宛先は1024以上になります。
- ステートフル/ステートレスの違いを無視する:ステートフルなら「返り」を明示的に許可せずとも追跡で通すことが多いが、問題はパケットフィルタ(フィールドベース)を想定しています。
解法ステップ
- 通信の主体(誰が接続を開始するか)を確認する:ここでは社内PCがWebサーバへアクセス。
- クライアントが使うポートを思い出す:クライアントはエフェメラル(1024以上)を送信元に使う。
- サーバの待ち受けポートは80:クライアントの宛先は80、サーバ応答は送信元80でクライアントのエフェメラルへ向かう。
- フィルタルールは上記の4-tuple(送信元IP/宛先IP/送信元ポート/宛先ポート)方向に合わせて設定する。
選択肢別の誤答解説
- ア:クライアント→Webサーバの送信元ポートを80、宛先を1024以上としている点が逆で誤りです。サーバ応答も逆向きで矛盾します。
- イ:クライアント側が送信元80、宛先1024以上になっておりクライアント・サーバの役割が逆転しています。応答側だけは正しくないため不適。
- ウ:クライアント→サーバは送信元1024以上→宛先80、サーバ→クライアントは送信元80→宛先1024以上で通信モデルに一致し正解です。
- エ:サーバ側の応答も宛先を80としており、サーバがクライアントの80に接続を開始する形になってしまうため不要かつ誤りです。
補足コラム
パケットフィルタリング型ファイアウォール(ステートレス)は各パケットのヘッダ情報のみで判定するため、発信側クライアントのエフェメラルポートとサーバの固定ポート(80)の向きを正確に設定する必要があります。一方、ステートフルファイアウォールは接続の状態を追跡し、"ESTABLISHED" な応答パケットは自動で許可するためルールを簡潔にできます。エフェメラルポートの範囲は OS によって異なり、伝統的には1024-65535ですが IANA 推奨は49152-65535 です。
FAQ
Q1: ステートフルなファイアウォールならどのように設定すれば良いですか?
A1: 一般には「アウトバウンドで宛先ポート80への新規接続を許可し、ESTABLISHEDの応答を許可する」設定だけで十分です(応答側を個別に開ける必要はありません)。例:iptables では --state NEW,ESTABLISHED と --state ESTABLISHED の組合せを使います。
A1: 一般には「アウトバウンドで宛先ポート80への新規接続を許可し、ESTABLISHEDの応答を許可する」設定だけで十分です(応答側を個別に開ける必要はありません)。例:iptables では --state NEW,ESTABLISHED と --state ESTABLISHED の組合せを使います。
Q2: UDP の場合も同じルールで良いですか?
A2: 概念は同じ(クライアントはエフェメラル、サーバは固定ポート)が、UDPはコネクションレスなのでステートフルの追跡が弱い場合はタイムアウトや追加ルールに留意します。
A2: 概念は同じ(クライアントはエフェメラル、サーバは固定ポート)が、UDPはコネクションレスなのでステートフルの追跡が弱い場合はタイムアウトや追加ルールに留意します。
Q3: エフェメラルポートは必ず1024以上ですか?
A3: 歴史的には1024以上ですが、近年のOSではIANA推奨の49152-65535を用いるものもあります。問題文に1024以上とある場合はそれに従って考えます。
A3: 歴史的には1024以上ですが、近年のOSではIANA推奨の49152-65535を用いるものもあります。問題文に1024以上とある場合はそれに従って考えます。
Q4: iptables での具体例は?
A4: ステートフルな例(推奨):
A4: ステートフルな例(推奨):
# 新規アウトバウンドHTTPを許可し、応答は追跡で受け入れる iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
ステートレスに明示的に許可する場合(問題の想定に近い):
# PC -> Webサーバ (送元:1024以上, 宛先:80) iptables -A FORWARD -p tcp --sport 1024:65535 --dport 80 -s 内部ネットワーク -d Webサーバ -j ACCEPT # Webサーバ -> PC (送元:80, 宛先:1024以上) iptables -A FORWARD -p tcp --sport 80 --dport 1024:65535 -s Webサーバ -d 内部ネットワーク -j ACCEPT
関連キーワード: ファイアウォール、パケットフィルタリング、TCP、ポート番号、エフェメラルポート、ステートフル、NAT、iptables

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

