ネットワークセキュリティにおいて、ファイアウォールは外部からの不正アクセスを防ぐ最も基本的かつ重要な防御手段です。現代のサーバー運用やクラウド環境では、ファイアウォールの正しい理解と設定が不可欠となっています。
本記事では、ファイアウォールの仕組みと設定について以下の内容を解説します。
- ファイアウォールの役割と種類(パケットフィルタリング、ステートフルインスペクション)
- Linuxのiptables/nftablesによるファイアウォール設定
- Windowsファイアウォールの基本操作
- ファイアウォール設定のベストプラクティス
- よくある設定ミスとトラブルシューティング
この記事を読むことで、ファイアウォールの動作原理を理解し、基本的なルール設定ができるようになります。
前提条件
本記事を理解するために、以下の知識があることを前提としています。
- TCPとUDPの違いを把握している(TCPとUDPの違いを理解するを参照)
- ポート番号の役割について基礎的な知識がある(ポート番号とソケット通信を理解するを参照)
- IPアドレスとサブネットの基本概念を理解している
実行環境
本記事で使用するコマンドは以下の環境で動作確認を行っています。
| 項目 | 環境 |
|---|---|
| Linux | Ubuntu 22.04/24.04、Rocky Linux 9 |
| Windows | Windows 10/11 |
| 必要なツール | iptables、nft、PowerShell |
| 権限 | root権限(Linux)、管理者権限(Windows) |
期待される学習成果
本記事を読み終えると、以下のことができるようになります。
- ファイアウォールの役割と動作原理を説明できる
- パケットフィルタリングとステートフルインスペクションの違いを理解できる
- iptables/nftablesで基本的なルールを設定できる
- Windowsファイアウォールの受信/送信ルールを設定できる
- ファイアウォール関連のトラブルを診断できる
ファイアウォールとは
ファイアウォールは、ネットワーク上を流れるパケット(通信データ)を監視し、事前に定義されたルールに基づいて通信を許可または拒否するセキュリティシステムです。
以下の図は、ファイアウォールの基本的な役割を示しています。
flowchart LR
subgraph "インターネット"
A[外部ホスト]
B[攻撃者]
end
subgraph "ファイアウォール"
FW{{"ルールに基づく<br/>パケット検査"}}
end
subgraph "内部ネットワーク"
S1[Webサーバー<br/>:80, :443]
S2[DBサーバー<br/>:3306]
S3[社内PC]
end
A -->|HTTP/HTTPS| FW
B -->|不正アクセス| FW
FW -->|許可| S1
FW -.->|拒否| S2
FW -.->|拒否| Bファイアウォールは「門番」のような役割を果たし、正当なトラフィックのみを通過させ、不正なトラフィックをブロックします。
ファイアウォールの配置場所
ファイアウォールは、その配置場所によって以下のように分類されます。
| 種類 | 配置場所 | 役割 |
|---|---|---|
| ネットワークファイアウォール | ネットワーク境界 | 組織全体のトラフィックを制御 |
| ホストベースファイアウォール | 個々のサーバー/PC | そのホストへのアクセスを制御 |
| クラウドファイアウォール | クラウドプロバイダー | セキュリティグループ、ネットワークACL |
本記事では、主にホストベースファイアウォール(iptables/nftables、Windowsファイアウォール)について解説します。
パケットフィルタリングの仕組み
パケットフィルタリングは、ファイアウォールの最も基本的な機能です。ネットワークを流れる個々のパケットのヘッダ情報を検査し、ルールに基づいて処理を決定します。
検査対象となるヘッダ情報
パケットフィルタリングでは、以下の情報に基づいてフィルタリングを行います。
flowchart TB
subgraph "パケット構造"
subgraph "IPヘッダ"
IP1["送信元IPアドレス"]
IP2["宛先IPアドレス"]
IP3["プロトコル番号<br/>(TCP=6, UDP=17, ICMP=1)"]
end
subgraph "TCP/UDPヘッダ"
T1["送信元ポート番号"]
T2["宛先ポート番号"]
T3["TCPフラグ<br/>(SYN, ACK, FIN, RST)"]
end
subgraph "ペイロード"
D1["アプリケーションデータ"]
end
endパケットフィルタリングでは、これらの情報を組み合わせてルールを定義します。たとえば「送信元IPアドレスが192.168.1.0/24で、宛先ポートが22(SSH)の場合は許可する」といったルールを設定できます。
パケットの処理アクション
ファイアウォールは、ルールにマッチしたパケットに対して以下のアクションを実行します。
| アクション | 説明 | iptables | nftables |
|---|---|---|---|
| 許可 | パケットを通過させる | ACCEPT | accept |
| 拒否(通知あり) | パケットを破棄し、ICMPエラーを返す | REJECT | reject |
| 拒否(通知なし) | パケットを無言で破棄する | DROP | drop |
| ログ記録 | パケット情報をログに記録 | LOG | log |
一般的に、外部からの不正アクセスにはDROP(無応答)を使用し、内部ユーザーへのアクセス拒否にはREJECT(エラー応答)を使用することが推奨されます。
ステートフルインスペクションとは
従来のパケットフィルタリング(ステートレス)は、個々のパケットを独立して検査します。しかし、TCP通信は複数のパケットで構成されるため、通信の状態(ステート)を追跡することでより高度なセキュリティを実現できます。これがステートフルインスペクションです。
ステートレスとステートフルの違い
以下の図は、両者の違いを示しています。
sequenceDiagram
participant C as クライアント
participant FW as ファイアウォール
participant S as サーバー
Note over FW: ステートレスの場合
C->>FW: SYN (ポート80へ)
Note over FW: ルールで許可されているか確認
FW->>S: SYN 転送
S->>FW: SYN+ACK (応答)
Note over FW: 戻りのルールが必要
FW->>C: SYN+ACK 転送
Note over FW: ステートフルの場合
C->>FW: SYN (ポート80へ)
Note over FW: 新規接続として記録<br/>ルールで許可されているか確認
FW->>S: SYN 転送
S->>FW: SYN+ACK (応答)
Note over FW: 確立済み接続の応答として<br/>自動的に許可
FW->>C: SYN+ACK 転送ステートフルインスペクションの主な利点は以下のとおりです。
- 戻りパケットの自動許可: 内部から開始した接続の応答パケットを自動的に許可
- TCPフラグの検証: 不正なTCPフラグの組み合わせを検出
- セッション追跡: 接続の開始から終了まで追跡し、タイムアウト後は自動的に破棄
接続追跡の状態
ステートフルファイアウォールは、以下の接続状態を追跡します。
| 状態 | 説明 |
|---|---|
| NEW | 新規接続のパケット(最初のSYNなど) |
| ESTABLISHED | 確立済み接続のパケット(双方向通信が成立) |
| RELATED | 既存接続に関連する新規接続(FTPデータ接続など) |
| INVALID | 既知の接続に属さない不正なパケット |
Linuxのファイアウォール:iptablesとnftables
Linuxでは、カーネルレベルでNetfilterフレームワークがパケットフィルタリングを実行します。ユーザー空間からNetfilterを操作するツールとして、iptables(従来)とnftables(新世代)があります。
iptablesとnftablesの関係
flowchart TB
subgraph "ユーザー空間"
IPT[iptables<br/>レガシーツール]
NFT[nft<br/>新世代ツール]
IPTL[iptables-nft<br/>互換レイヤー]
end
subgraph "カーネル空間"
NF[Netfilter<br/>パケットフィルタリングフレームワーク]
end
IPT --> NF
NFT --> NF
IPTL --> NFT
IPTL -.-> NF現在のLinuxディストリビューション(Debian 11以降、RHEL/Rocky Linux 9以降、Ubuntu 22.04以降)では、nftablesがデフォルトのファイアウォールとなっています。ただし、多くの環境でiptablesコマンドはiptables-nft(nftablesバックエンドを使用する互換ツール)として引き続き使用できます。
iptablesの基本操作
iptablesは、テーブル、チェーン、ルールの3層構造でファイアウォールルールを管理します。
iptablesの構造
flowchart TB
subgraph "filterテーブル"
INPUT["INPUTチェーン<br/>ホスト宛のパケット"]
OUTPUT["OUTPUTチェーン<br/>ホスト発のパケット"]
FORWARD["FORWARDチェーン<br/>転送パケット"]
end
subgraph "ルール例"
R1["ルール1: SSH許可"]
R2["ルール2: HTTP許可"]
R3["ルール3: その他拒否"]
end
INPUT --> R1
R1 --> R2
R2 --> R3| テーブル | 用途 |
|---|---|
| filter | パケットのフィルタリング(デフォルト) |
| nat | アドレス変換(NAT) |
| mangle | パケットの書き換え |
| raw | 接続追跡を回避するルール |
iptablesのコマンド構文
iptablesの基本構文は以下のとおりです。
|
|
| オプション | 説明 |
|---|---|
-t |
テーブル指定(省略時はfilter) |
-A |
ルールを末尾に追加 |
-I |
ルールを先頭に挿入 |
-D |
ルールを削除 |
-L |
ルールを一覧表示 |
-F |
すべてのルールを削除 |
-P |
デフォルトポリシーを設定 |
-j |
ターゲット(ACCEPT, DROP, REJECTなど) |
iptablesの設定例
以下は、一般的なWebサーバー向けのiptables設定例です。
|
|
現在のルールを確認
設定したルールを確認するには、以下のコマンドを実行します。
|
|
出力例:
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 100 8500 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3 10 600 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
4 50 3000 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 30 1800 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
iptablesルールの永続化
iptablesのルールは再起動時に消えてしまうため、永続化が必要です。
|
|
nftablesの基本操作
nftablesは、iptablesの後継として設計されたモダンなファイアウォールツールです。より簡潔な構文と高いパフォーマンスを提供します。
nftablesの構造
nftablesもテーブル、チェーン、ルールの階層構造を持ちますが、iptablesよりも柔軟な設計になっています。
flowchart TB
subgraph "テーブル: inet filter"
subgraph "チェーン: input"
R1["ルール: ct state established,related accept"]
R2["ルール: tcp dport 22 accept"]
R3["ルール: tcp dport {80, 443} accept"]
end
subgraph "チェーン: output"
R4["ルール: accept"]
end
endnftablesのコマンド構文
nftablesはnftコマンドを使用します。
|
|
nftablesの設定例
以下は、nftablesでWebサーバー向けファイアウォールを構成する例です。
|
|
このスクリプトを/etc/nftables.confに保存し、以下のコマンドで適用します。
|
|
nftablesとiptablesの構文比較
同じルールをiptablesとnftablesで比較すると、nftablesの方がより読みやすい構文になっています。
| 操作 | iptables | nftables |
|---|---|---|
| SSH許可 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
nft add rule inet filter input tcp dport 22 accept |
| 複数ポート許可 | iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT |
nft add rule inet filter input tcp dport { 80, 443 } accept |
| 接続追跡 | iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
nft add rule inet filter input ct state established,related accept |
nftablesルールの永続化
nftablesの設定は/etc/nftables.confに保存し、systemdで管理します。
|
|
Windowsファイアウォールの基本操作
WindowsにはWindows Defenderファイアウォール(旧称:Windowsファイアウォール)が標準搭載されています。GUIとコマンドライン(PowerShell/netsh)の両方で操作できます。
Windowsファイアウォールのプロファイル
Windowsファイアウォールは、ネットワークの種類に応じて3つのプロファイルを持ちます。
| プロファイル | 適用条件 | 推奨設定 |
|---|---|---|
| ドメイン | Active Directoryドメインに参加時 | 組織のポリシーに従う |
| プライベート | ホームネットワーク、信頼されたネットワーク | 一部のサービスを許可 |
| パブリック | 公衆Wi-Fiなど信頼されないネットワーク | 最も厳格な制限 |
PowerShellでのファイアウォール操作
PowerShellでWindowsファイアウォールを操作する例を示します。
|
|
netshでのファイアウォール操作
従来のnetshコマンドも引き続き使用できます。
|
|
ファイアウォール設定のベストプラクティス
ファイアウォールを適切に設定するためのベストプラクティスを紹介します。
最小権限の原則
必要最小限のポートのみを開放し、それ以外はすべてブロックします。
flowchart TB
subgraph "良い例"
D1["デフォルトポリシー: DROP"]
D2["必要なポートのみ許可<br/>22, 80, 443"]
end
subgraph "悪い例"
D3["デフォルトポリシー: ACCEPT"]
D4["危険なポートをブロック<br/>23, 135, 445..."]
end
D1 --> D2
D3 --> D4送信元IPアドレスによる制限
管理用ポート(SSHなど)は、特定のIPアドレスからのみアクセスを許可します。
|
|
nftablesの場合:
|
|
レート制限の適用
ブルートフォース攻撃を防ぐため、接続試行回数を制限します。
|
|
nftablesの場合:
|
|
ログの活用
拒否されたパケットをログに記録し、不正アクセスの試行を監視します。
|
|
よくある設定ミスとトラブルシューティング
SSHアクセスを失う
リモートサーバーでファイアウォールを設定する際、SSHポートを許可する前にデフォルトポリシーをDROPに変更すると、アクセスを失う危険があります。
正しい手順:
- まずSSHを許可するルールを追加
- その後でデフォルトポリシーをDROPに変更
|
|
ルールの順序が誤っている
ファイアウォールのルールは上から順に評価され、最初にマッチしたルールが適用されます。
|
|
接続追跡の設定漏れ
ステートフルルールを設定し忘れると、確立済み接続の応答パケットがブロックされます。
|
|
トラブルシューティングの手順
ファイアウォールが原因で通信できない場合の診断手順:
-
ファイアウォールを一時的に無効化してテスト
1 2 3 4 5 6# Linux sudo iptables -P INPUT ACCEPT sudo iptables -F # Windows Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False -
ポートの状態を確認
1 2 3 4 5# Linux sudo ss -tuln | grep LISTEN # Windows netstat -an | findstr LISTENING -
ログを確認
1 2 3 4 5# Linux sudo journalctl -k | grep -i "iptables\|nftables" # または sudo dmesg | grep -i "iptables\|nftables" -
外部からの疎通確認
1 2 3 4 5# ポートスキャン nc -zv target-server 80 # または nmap -p 80 target-server
クラウド環境でのファイアウォール
クラウド環境では、OSレベルのファイアウォールに加えて、クラウドプロバイダーが提供するファイアウォール機能も使用します。
| プロバイダー | ファイアウォール機能 | 対象 |
|---|---|---|
| AWS | セキュリティグループ | インスタンス単位 |
| AWS | ネットワークACL | サブネット単位 |
| GCP | ファイアウォールルール | VPC/インスタンス |
| Azure | ネットワークセキュリティグループ(NSG) | サブネット/NIC |
クラウド環境では、OSレベルのファイアウォール(iptables/nftables)とクラウドのファイアウォール(セキュリティグループなど)の両方を適切に設定する必要があります。「多層防御」の考え方で、複数のレイヤーでセキュリティを確保することが重要です。
まとめ
本記事では、ファイアウォールの仕組みと設定の基礎について解説しました。
要点の振り返り
- ファイアウォールは、ルールに基づいてパケットを許可または拒否するセキュリティシステム
- パケットフィルタリングは、IPアドレス、ポート番号、プロトコルなどのヘッダ情報で判断
- ステートフルインスペクションは、接続状態を追跡してより高度なフィルタリングを実現
- Linuxではiptables(レガシー)またはnftables(推奨)を使用
- Windowsでは「Windows Defenderファイアウォール」をGUIまたはPowerShellで操作
- 最小権限の原則に従い、必要最小限のポートのみを開放する
次のステップ
ファイアウォールの基礎を理解したら、次はNATとプライベートネットワークの仕組みを理解するで、NAT(Network Address Translation)について学びましょう。NATはファイアウォールと密接に関連する技術で、プライベートネットワークとインターネットの接続に不可欠です。