この記事の要点
• ファイアウォールはネットワークトラフィックを監視し、不正なアクセスを遮断するセキュリティ機構
• パケットフィルタ → ステートフル → アプリケーション層と、より高度な検査が可能に
• 入口ルール(Ingress)と出口ルール(Egress)の両方が重要
ファイアウォールとは
ファイアウォール(Firewall)は、ネットワークトラフィックを監視し、事前に定義されたルールに基づいて通信を許可または拒否するセキュリティシステムです。「防火壁」という名の通り、内部ネットワークと外部ネットワークの間に壁を作り、不正な通信を遮断します。
なぜ必要か: インターネットに接続すると、攻撃者からのアクセス試行が常に発生します。ファイアウォールは最初の防御線として、不要な通信を遮断します。
ファイアウォールの基本動作
ファイアウォールは以下の情報を元にトラフィックを判断します:
[送信元 IP] → [送信先 IP] : [ポート番号] / [プロトコル]
↓
ルールと照合
↓
[許可] or [拒否]
ルールの例
# ルール1: SSH(22番ポート)は特定IPからのみ許可
allow tcp from 203.0.113.0/24 to any port 22
# ルール2: HTTP/HTTPS は全員に許可
allow tcp from any to any port 80,443
# ルール3: それ以外は全て拒否
deny all from any to any
ポイント: ファイアウォールのルールは上から順番に評価され、最初にマッチしたルールが適用されます。「デフォルトで拒否、必要なものだけ許可」が基本原則です。
ファイアウォールの種類
ファイアウォールは、どの層(OSI モデル)まで検査するかで分類されます。
| 種類 | 検査する層 | 検査内容 | 状態管理 | 処理速度 | 用途 |
|---|---|---|---|---|---|
| パケットフィルタ | L3/L4 | IP・ポート・プロトコル | ✕ | 高速 | 基本的なアクセス制御 |
| ステートフルファイアウォール | L3/L4 | IP・ポート + セッション状態 | ◎ | 中速 | 一般的な企業・サーバー用途 |
| アプリケーションファイアウォール(プロキシ型) | L7 | HTTP・DNS など中身まで検査 | ◎ | 低速 | Web アプリ保護、WAF |
1. パケットフィルタ型ファイアウォール
最も基本的なタイプ。パケット単位で、送信元 IP・送信先 IP・ポート・プロトコルを見て許可/拒否を判断します。
パケット: 203.0.113.45:54321 → 192.0.2.10:80 (TCP)
↓
ルール: allow tcp from any to 192.0.2.10 port 80
↓
許可
特徴
- 利点: 高速、シンプル、CPU 負荷が低い
- 欠点: セッションの状態を追跡しない、戻りのパケットも個別に許可が必要
設定例(iptables)
# 外部から SSH を許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 外部から HTTP/HTTPS を許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# それ以外は拒否
iptables -A INPUT -j DROP
注意: パケットフィルタ型では、往路と復路の両方にルールが必要です。往路だけ許可して復路を忘れると、接続が成立しません。
2. ステートフルファイアウォール
セッションの状態を追跡し、既存の通信に関連するパケットは自動的に許可します。現代のファイアウォールの主流です。
1. クライアント → サーバー: SYN (新規接続)
→ ルールで許可、状態テーブルに記録
2. サーバー → クライアント: SYN-ACK (応答)
→ 既存セッションの一部として自動許可
3. クライアント → サーバー: ACK
→ 既存セッションの一部として自動許可
状態テーブル
ステートフルファイアウォールは、通信の状態を以下のように記録します:
| 状態 | 意味 |
|---|---|
| NEW | 新規接続の最初のパケット |
| ESTABLISHED | 既に確立された接続 |
| RELATED | 既存接続に関連する新しい接続(FTP データ接続など) |
| INVALID | 状態テーブルに該当しない不正なパケット |
設定例(iptables ステートフル)
# 既存接続と関連接続は許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 新規 SSH 接続を許可
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# 新規 HTTP/HTTPS 接続を許可
iptables -A INPUT -p tcp --dport 80,443 -m state --state NEW -j ACCEPT
# それ以外の新規接続は拒否
iptables -A INPUT -m state --state NEW -j DROP
ポイント: ステートフル検査では、復路のパケットは自動的に許可されます。往路だけルールを書けば良いため、設定がシンプルになり、セキュリティも向上します。
3. アプリケーション層ファイアウォール(プロキシ型)
L7(アプリケーション層)まで検査し、通信の中身(HTTP リクエスト、DNS クエリなど)を解析します。
HTTP リクエスト:
GET /admin/delete?id=123 HTTP/1.1
↓
アプリケーション層で検査
↓
/admin/* へのアクセスは拒否
↓
ブロック
特徴
- 利点: 詳細なアクセス制御、SQL インジェクションや XSS などアプリケーション層攻撃も防げる
- 欠点: 処理が重い、プロトコルごとに対応が必要
典型例: WAF(Web Application Firewall)
WAF は HTTP/HTTPS トラフィックを専門に検査するアプリケーション層ファイアウォールです(詳細は別記事参照)。
実践メモ: 一般的なサーバーではステートフルファイアウォール、Web アプリケーションの保護には WAF を追加で導入するのが現代の標準構成です。
入口ルールと出口ルール
ファイアウォールには、入口(Ingress) と出口(Egress) の両方向のルールがあります。
| 方向 | 英語名 | 制御対象 | 主な目的 |
|---|---|---|---|
| 入口 | Ingress | 外部 → 内部 | 不正アクセスの防止 |
| 出口 | Egress | 内部 → 外部 | 情報漏洩・マルウェア通信の防止 |
入口ルール(Ingress)の例
# SSH は管理者 IP からのみ許可
iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -j ACCEPT
# HTTP/HTTPS は全員に許可
iptables -A INPUT -p tcp --dport 80,443 -j ACCEPT
# それ以外は拒否
iptables -A INPUT -j DROP
出口ルール(Egress)の例
# 外部への HTTP/HTTPS は許可
iptables -A OUTPUT -p tcp --dport 80,443 -j ACCEPT
# 外部への DNS は許可
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# それ以外の外部接続は拒否
iptables -A OUTPUT -j DROP
ポイント: 出口ルールは見落とされがちですが、マルウェア感染時の C&C サーバーへの通信や、内部データの不正送信を防ぐために重要です。
出口ルールの重要性
出口ルールを設定することで、以下を防げます:
- マルウェアが外部の C&C(Command and Control)サーバーと通信
- 内部データが外部に不正送信される
- 侵害されたサーバーが他のサーバーへ攻撃を仕掛ける
# 悪い例: 出口ルールなし
内部サーバーがマルウェア感染
↓
マルウェアが外部サーバーと自由に通信
↓
情報漏洩 / 他サーバーへの攻撃
# 良い例: 出口ルール設定
内部サーバーがマルウェア感染
↓
マルウェアが外部サーバーと通信しようとする
↓
出口ルールでブロック
注意: 出口ルールを厳しくしすぎると、正当な外部 API 呼び出しや OS アップデートもブロックされます。必要な通信を洗い出してから設定してください。
主要なファイアウォールツール
| ツール / サービス | 種類 | 特徴 |
|---|---|---|
| iptables | ステートフル | Linux 標準、柔軟だが設定が複雑 |
| nftables | ステートフル | iptables の後継、より高速で文法が改善 |
| ufw | ステートフル | iptables のフロントエンド、設定が簡単 |
| firewalld | ステートフル | Red Hat 系の標準、ゾーンベース管理 |
| AWS Security Group | ステートフル | AWS のネットワークファイアウォール |
| Azure NSG | ステートフル | Azure のネットワークセキュリティグループ |
| GCP Firewall Rules | ステートフル | Google Cloud のファイアウォール |
ufw(Uncomplicated Firewall)の例
# ufw を有効化
sudo ufw enable
# SSH を許可(デフォルトポート 22)
sudo ufw allow ssh
# HTTP/HTTPS を許可
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 特定 IP からのみ SSH を許可
sudo ufw allow from 203.0.113.0/24 to any port 22
# 状態確認
sudo ufw status verbose
実践メモ: 初心者は ufw から始めるのがおすすめです。iptables の機能を使いつつ、設定が非常にシンプルです。
デフォルトポリシー
ファイアウォールにはデフォルトポリシー(どのルールにもマッチしなかった場合の動作)を設定します。
| ポリシー | 意味 | 推奨用途 |
|---|---|---|
| ACCEPT | デフォルトで許可 | テスト環境、内部ネットワーク |
| DROP | デフォルトで拒否(応答なし) | 本番環境(推奨) |
| REJECT | デフォルトで拒否(拒否応答を返す) | デバッグ時 |
# iptables のデフォルトポリシー設定
iptables -P INPUT DROP # 入口はデフォルト拒否
iptables -P FORWARD DROP # 転送もデフォルト拒否
iptables -P OUTPUT ACCEPT # 出口はデフォルト許可(内部発信は基本OK)
ポイント: DROP と REJECT の違い: DROP は何も応答せず(ポートスキャンで検出されにくい)、REJECT は「拒否されました」と応答を返します。セキュリティ上は DROP が推奨です。
AWS Security Group の例
クラウド環境では、ファイアウォールがサービスとして提供されます。
# AWS Security Group ルール例
Inbound Rules:
- Type: SSH, Protocol: TCP, Port: 22, Source: 203.0.113.0/24
- Type: HTTP, Protocol: TCP, Port: 80, Source: 0.0.0.0/0
- Type: HTTPS, Protocol: TCP, Port: 443, Source: 0.0.0.0/0
Outbound Rules:
- Type: All traffic, Protocol: All, Port: All, Destination: 0.0.0.0/0
AWS Security Group の特徴:
- ステートフル: 戻りのトラフィックは自動許可
- デフォルトで全拒否: 明示的に許可したものだけ通す
- インスタンス単位: EC2 インスタンスごとに異なるルールを適用可能
まとめ
ファイアウォールには大きく3種類あり、それぞれ特徴が異なります:
| 種類 | 検査層 | 状態管理 | 処理速度 | 用途 |
|---|---|---|---|---|
| パケットフィルタ | L3/L4 | ✕ | 高速 | 基本的なアクセス制御 |
| ステートフル | L3/L4 | ◎ | 中速 | 一般的な用途(推奨) |
| アプリケーション層 | L7 | ◎ | 低速 | Web アプリ保護(WAF) |
現代ではステートフルファイアウォールが主流で、入口(Ingress)と出口(Egress)の両方のルールを設定することで、より強固なセキュリティを実現できます。
参考リソース
- NIST SP 800-41 Rev. 1 - Guidelines on Firewalls and Firewall Policy
- iptables Tutorial
- Ubuntu - UFW Documentation
- AWS - Security Groups for Your VPC
- Cloudflare - What is a firewall?