フリーキーズ | 独学プログラミング

ファイアウォールの基本!パケットフィルタとステートフルの違いを初心者にもわかりやすく解説

リンドくん

リンドくん

たなべ先生、「ファイアウォール」ってよく聞くんですけど、どんな仕組みなんですか?

たなべ

たなべ

ファイアウォールはネットワークセキュリティの最前線を守る門番みたいなものなんだ。
その門番にも「パケットフィルタ型」と「ステートフル型」という2つのタイプがあって、それぞれ警備の仕方が違うんだよ。

ネットワークセキュリティを学び始めると、必ず出会うのが「ファイアウォール」という言葉です。
Webサーバを構築したり、企業のネットワークを設計したりする際に、ファイアウォールは欠かせない存在となっています。

しかし、「パケットフィルタリング」や「ステートフルインスペクション」といった専門用語が飛び交い、初心者の方にとっては理解しにくい概念かもしれません。

この記事では、ファイアウォールの基本的な仕組みから、パケットフィルタとステートフルの違いまで、初心者の方でもしっかり理解できるよう、できるだけわかりやすく解説していきます。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

ファイアウォールとは何か?その役割を理解しよう

リンドくん

リンドくん

そもそもファイアウォールって、何を守っているんですか?

たなべ

たなべ

ファイアウォールは不正なアクセスからネットワークを守る防護壁なんだ。
家に例えると、玄関のセキュリティシステムみたいなものだね。誰が入っていいか、誰を外に出していいかを判断してくれるんだよ。

ファイアウォールの基本概念

ファイアウォール(Firewall)とは、その名の通り「防火壁」を意味する言葉で、ネットワークセキュリティにおいては内部ネットワークと外部ネットワークの境界に設置され、通信を監視・制御するシステムのことを指します。

ファイアウォールの主な役割は以下の通りです。

  • 不正アクセスの遮断 → 外部からの悪意ある接続をブロック
  • 内部情報の流出防止 → 許可されていない外部への通信を制限
  • 通信の監視と記録 → どんな通信が行われているかをログに記録
  • ネットワークの分離 → 信頼できるネットワークと信頼できないネットワークを分ける

なぜファイアウォールが必要なのか

インターネットに接続されたサーバやネットワークは、常に外部からの攻撃にさらされています。
実際、サーバを公開すると、わずか数分で世界中から無数のアクセス試行が行われるのが現実です。

ファイアウォールがない状態でサーバを公開すると、以下のような危険があります。

  • 不正ログイン → パスワードクラッキングによる侵入
  • DDoS攻撃 → 大量のアクセスでサーバをダウンさせる
  • データの盗聴 → 通信内容を傍受される
  • マルウェア感染 → ウイルスやトロイの木馬の侵入

こうした脅威から守るために、ファイアウォールはネットワークの第一線の防御として機能するのです。

ファイアウォールの設置場所

ファイアウォールは主に以下のような場所に設置されます。

  • ネットワーク境界 → インターネットと社内ネットワークの間
  • サーバの前段 → Webサーバやデータベースサーバを守るため
  • 各コンピュータ → 個々のPC上で動作するソフトウェアファイアウォール

多くの場合、企業ネットワークでは多層防御の考え方で、複数の箇所にファイアウォールを配置することが推奨されています。

パケットフィルタリング型ファイアウォール

リンドくん

リンドくん

パケットフィルタって、パケットを「フィルタ」するんですよね?どうやって判断しているんですか?

たなべ

たなべ

その通り!パケットフィルタは、通信データ(パケット)のヘッダ情報を見て、通すか止めるかを判断するんだ。
荷物検査で送り先や送り主を確認するようなイメージだね。

パケットフィルタリングの仕組み

パケットフィルタリング型ファイアウォールは、最も基本的で古典的なタイプのファイアウォールです。
その名の通り、ネットワークを流れるパケット(データの塊)を一つ一つチェックし、設定されたルールに基づいて通過させるか遮断するかを判断します。

パケットフィルタが判断材料として使う情報は以下のようなものです。

  • 送信元IPアドレス → どこから来た通信か
  • 宛先IPアドレス → どこへ向かう通信か
  • 送信元ポート番号 → 送信元のどのアプリケーションからか
  • 宛先ポート番号 → 宛先のどのサービスへの通信か
  • プロトコル → TCP、UDP、ICMPなど

これらの情報は、パケットのヘッダ部分に含まれており、パケットフィルタはこのヘッダ情報だけを見て判断を行います。

パケットフィルタのルール設定例

実際のパケットフィルタリングのルール設定を見てみましょう。
例えば、Linuxのiptablesというツールでは、以下のようなルールを設定できます。

# Webサーバへのアクセス(ポート80)を許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# SSHアクセス(ポート22)を特定のIPアドレスのみ許可
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT

# その他のアクセスは拒否
iptables -A INPUT -j DROP

このルールは以下のような意味になります。

  1. すべての送信元からポート80番(HTTP)への接続を許可
  2. IPアドレス192.168.1.100からのみポート22番(SSH)への接続を許可
  3. それ以外のすべての接続は拒否

パケットフィルタのメリット

パケットフィルタリング型ファイアウォールには以下のような利点があります。

  • 処理が高速 → ヘッダ情報の確認だけなので負荷が軽い
  • シンプルな構成 → 理解しやすく設定も比較的簡単
  • 幅広い対応 → 多くのネットワーク機器で標準実装されている
  • 低コスト → 専用機器がなくても実装可能

パケットフィルタの限界

一方で、パケットフィルタリングには重要な限界があります。

  • 通信の文脈を理解できない → 各パケットを独立して判断するため、通信全体の流れを把握できない
  • アプリケーション層の攻撃に弱い → データの中身までは検査しない
  • 戻りのパケットの管理が難しい → 正当な応答かどうかを判断できない
  • 複雑な通信プロトコルに対応しにくい → FTPのようなデータ接続が動的に変わるプロトコルは扱いにくい

これらの限界を克服するために登場したのが、次に説明するステートフルインスペクションです。

ステートフルインスペクション

リンドくん

リンドくん

ステートフルって「状態を保持する」っていう意味ですよね?パケットフィルタと何が違うんですか?

たなべ

たなべ

鋭いね!ステートフルは通信の「状態」を記憶して、その文脈を理解できるんだ。
例えば、「このパケットは先ほど送信したリクエストへの正当な応答だ」というように判断できるんだよ。

ステートフルインスペクションの仕組み

ステートフルインスペクション(Stateful Inspection)またはステートフルパケットインスペクションは、パケットフィルタリングを進化させた技術です。

この技術の最大の特徴は、通信のセッション(状態)を追跡することです。
具体的には、以下のような情報を記録・管理します。

  • 確立された接続の記録 → どの送信元とどの宛先の間で通信が行われているか
  • 接続の状態 → NEW(新規)、ESTABLISHED(確立済み)、RELATED(関連)など
  • シーケンス番号の追跡 → TCPの通信シーケンスを監視
  • タイムアウト管理 → 一定時間通信がない接続を自動的に削除

これにより、通信の全体像を把握し、より高度な判断が可能になります。

パケットフィルタとの具体的な違い

パケットフィルタとステートフルの違いを、具体的な例で見てみましょう。

パケットフィルタの場合

  1. クライアントがWebサーバにアクセス(送信元ポート:50000 → 宛先ポート:80)
  2. ルールで許可されているので通過
  3. サーバからの応答(送信元ポート:80 → 宛先ポート:50000)
  4. この応答用のルールも別途設定が必要

パケットフィルタでは、行きと帰りの通信をそれぞれ別のルールで許可する必要があります。

ステートフルの場合

  1. クライアントがWebサーバにアクセス(送信元ポート:50000 → 宛先ポート:80)
  2. ルールで許可され、接続状態がテーブルに記録される
  3. サーバからの応答(送信元ポート:80 → 宛先ポート:50000)
  4. 確立済み接続への応答と認識され、自動的に許可

ステートフルでは、一度確立した通信に対する応答は自動的に許可されるため、ルールがシンプルになります。

ステートフルの設定例

Linuxのiptablesでステートフルな設定を行う例を見てみましょう。

# 確立済みおよび関連する接続は許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 新規のWebサーバへのアクセスを許可
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

# その他の新規接続は拒否
iptables -A INPUT -m state --state NEW -j DROP

このルールの意味は以下の通りです。

  1. すでに確立された接続と、それに関連する通信は自動的に許可
  2. 新規のHTTP接続(ポート80)のみ許可
  3. それ以外の新規接続は拒否

ステートフルのメリット

ステートフルインスペクションには以下のような大きな利点があります。

  • セキュリティの向上 → 通信の文脈を理解できるため、不正な通信を見抜きやすい
  • 設定の簡素化 → 応答パケット用のルールを個別に設定する必要がない
  • 動的なポート対応 → FTPなど動的にポートを使用するプロトコルにも対応しやすい
  • スプーフィング攻撃への耐性 → 接続の状態を追跡するため、偽装されたパケットを検出しやすい

ステートフルの課題

一方で、以下のような課題もあります。

  • 処理負荷が高い → 状態テーブルの管理にリソースを消費
  • メモリ使用量が多い → 多数の接続を追跡するため、メモリが必要
  • 設定の複雑さ → より高度な知識が必要
  • DoS攻撃のリスク → 大量の接続を生成されると状態テーブルがあふれる可能性

それでも、現代のファイアウォールでは、これらの課題を克服する技術が実装されており、ステートフルインスペクションが標準的な機能となっています。

パケットフィルタとステートフルの使い分け

リンドくん

リンドくん

じゃあ、もうパケットフィルタは使わないんですか?

たなべ

たなべ

いや、そういうわけじゃないんだ。それぞれに適した使い道があるんだよ。
状況に応じて使い分けることが大切なんだ。

パケットフィルタが適している場面

シンプルなパケットフィルタリングが適している場面もあります。

  • シンプルなネットワーク構成 → 小規模で複雑な通信がない場合
  • 高速処理が必要 → トラフィック量が非常に多く、処理速度を優先する場合
  • レガシーシステム → 古いシステムでステートフル機能が使えない場合
  • 特定のルールのみ → 特定のIPアドレスやポートだけを制限したい場合

ステートフルが適している場面

一方、ステートフルインスペクションが適しているのは以下のような場面です。

  • 一般的なWebサーバ → HTTP/HTTPS通信を扱うサーバ
  • 複雑なプロトコル → FTP、SIPなど動的にポートを使用する通信
  • 高いセキュリティ要件 → セキュリティを重視する環境
  • 企業ネットワーク → 多様な通信が発生する環境

ハイブリッド構成

実際の現場では、両方の技術を組み合わせて使用することも一般的です。

例えば、以下のような構成が考えられます。

  1. エッジルータ → パケットフィルタで基本的なフィルタリング
  2. ファイアウォール専用機 → ステートフルで詳細な制御
  3. 各サーバ → ソフトウェアファイアウォールで最終防御

この多層防御により、セキュリティと性能のバランスを取ることができます。

ファイアウォール設定のポイント

リンドくん

リンドくん

実際にファイアウォールを設定するときに、気をつけることはありますか?

たなべ

たなべ

うん、いくつか重要なポイントがあるよ。デフォルト拒否の原則最小権限の原則など、セキュリティの基本を押さえることが大切なんだ。

デフォルト拒否の原則

ファイアウォール設定の基本は、「明示的に許可したもの以外はすべて拒否する」という考え方です。

# すべてのINPUTをデフォルトで拒否
iptables -P INPUT DROP

# 必要なものだけ個別に許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

この方針により、設定漏れによる脆弱性を最小限に抑えられます。

最小権限の原則

必要最小限の通信だけを許可することも重要です。

例えば、Webサーバなら以下のようなルールになります。

  • ポート80(HTTP)とポート443(HTTPS)のみ許可
  • SSHは特定のIPアドレスからのみ許可
  • その他のポートはすべて閉じる

ログの記録と監視

ファイアウォールは、通信のログを記録し、定期的に確認することが重要です。

# 拒否したパケットをログに記録
iptables -A INPUT -j LOG --log-prefix "FIREWALL-DROP: "
iptables -A INPUT -j DROP

ログを分析することで、以下のようなことがわかります。

  • どこから攻撃を受けているか
  • どのサービスが狙われているか
  • ルールが適切に機能しているか

テストと検証

ファイアウォールのルールを設定したら、必ず動作確認を行いましょう。

  • 許可した通信が正常に通るか
  • 拒否すべき通信がブロックされているか
  • 予期しない影響が出ていないか

特にリモートサーバの場合は、SSH接続を失わないよう注意しながら設定を進めることが重要です。

まとめ

リンドくん

リンドくん

ファイアウォールの仕組み、だいぶ理解できました!パケットフィルタとステートフルの違いがよくわかりました。

たなべ

たなべ

それは良かった!ファイアウォールはネットワークセキュリティの基本中の基本だからね。
これからサーバ構築やネットワーク設計をするときに、ぜひ今日学んだことを活かしてほしいな。

この記事では、ファイアウォールの基本から、パケットフィルタリングとステートフルインスペクションの違いまで解説してきました。

重要なポイントを改めて確認しましょう。

  • ファイアウォールの役割 → 不正アクセスを防ぎ、ネットワークを守る防護壁
  • パケットフィルタリング → ヘッダ情報を見て個々のパケットを判断するシンプルな方式
  • ステートフルインスペクション → 通信の状態を追跡し、文脈を理解できる高度な方式
  • 使い分けが重要 → 状況に応じて適切な方式を選択する

ファイアウォールは、サーバを公開する際やネットワークを構築する際に必ず設定すべき重要なセキュリティ対策です。
最初は難しく感じるかもしれませんが、基本的な原則を理解すれば、効果的な設定ができるようになります。

ネットワークセキュリティは、常に進化し続ける分野です。
基本をしっかり押さえた上で、新しい攻撃手法や防御技術についても継続的に学んでいくことが大切です。

この記事をシェア

関連するコンテンツ