ネットワークセキュリティにおいて、ファイアウォールは外部からの不正アクセスを防ぐ最も基本的かつ重要な防御手段です。現代のサーバー運用やクラウド環境では、ファイアウォールの正しい理解と設定が不可欠となっています。

本記事では、ファイアウォールの仕組みと設定について以下の内容を解説します。

  • ファイアウォールの役割と種類(パケットフィルタリング、ステートフルインスペクション)
  • Linuxのiptables/nftablesによるファイアウォール設定
  • Windowsファイアウォールの基本操作
  • ファイアウォール設定のベストプラクティス
  • よくある設定ミスとトラブルシューティング

この記事を読むことで、ファイアウォールの動作原理を理解し、基本的なルール設定ができるようになります。

前提条件

本記事を理解するために、以下の知識があることを前提としています。

実行環境

本記事で使用するコマンドは以下の環境で動作確認を行っています。

項目 環境
Linux Ubuntu 22.04/24.04、Rocky Linux 9
Windows Windows 10/11
必要なツール iptables、nft、PowerShell
権限 root権限(Linux)、管理者権限(Windows)

期待される学習成果

本記事を読み終えると、以下のことができるようになります。

  1. ファイアウォールの役割と動作原理を説明できる
  2. パケットフィルタリングとステートフルインスペクションの違いを理解できる
  3. iptables/nftablesで基本的なルールを設定できる
  4. Windowsファイアウォールの受信/送信ルールを設定できる
  5. ファイアウォール関連のトラブルを診断できる

ファイアウォールとは

ファイアウォールは、ネットワーク上を流れるパケット(通信データ)を監視し、事前に定義されたルールに基づいて通信を許可または拒否するセキュリティシステムです。

以下の図は、ファイアウォールの基本的な役割を示しています。

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 転送

ステートフルインスペクションの主な利点は以下のとおりです。

  1. 戻りパケットの自動許可: 内部から開始した接続の応答パケットを自動的に許可
  2. TCPフラグの検証: 不正なTCPフラグの組み合わせを検出
  3. セッション追跡: 接続の開始から終了まで追跡し、タイムアウト後は自動的に破棄

接続追跡の状態

ステートフルファイアウォールは、以下の接続状態を追跡します。

状態 説明
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の基本構文は以下のとおりです。

1
iptables -t テーブル -操作 チェーン ルール定義 -j ターゲット
オプション 説明
-t テーブル指定(省略時はfilter)
-A ルールを末尾に追加
-I ルールを先頭に挿入
-D ルールを削除
-L ルールを一覧表示
-F すべてのルールを削除
-P デフォルトポリシーを設定
-j ターゲット(ACCEPT, DROP, REJECTなど)

iptablesの設定例

以下は、一般的なWebサーバー向けのiptables設定例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 既存ルールをクリア
sudo iptables -F

# デフォルトポリシーを設定(すべて拒否)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# ループバックインターフェースを許可
sudo iptables -A INPUT -i lo -j ACCEPT

# 確立済み接続と関連接続を許可(ステートフル)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH(ポート22)を許可
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# HTTP(ポート80)とHTTPS(ポート443)を許可
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# ICMPを許可(ping応答)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 不正なパケットを拒否
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# それ以外は拒否(ログ記録後にドロップ)
sudo iptables -A INPUT -j LOG --log-prefix "iptables-dropped: "
sudo iptables -A INPUT -j DROP

現在のルールを確認

設定したルールを確認するには、以下のコマンドを実行します。

1
2
# ルールを番号付きで表示
sudo iptables -L -n -v --line-numbers

出力例:

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のルールは再起動時に消えてしまうため、永続化が必要です。

1
2
3
4
5
6
7
# Debian/Ubuntu
sudo apt install iptables-persistent
sudo netfilter-persistent save

# RHEL/Rocky Linux
sudo iptables-save > /etc/sysconfig/iptables
sudo systemctl enable 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
    end

nftablesのコマンド構文

nftablesはnftコマンドを使用します。

1
2
3
4
5
6
7
8
# テーブルの作成
nft add table inet filter

# チェーンの作成(inputフック、フィルタタイプ)
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }

# ルールの追加
nft add rule inet filter input tcp dport 22 accept

nftablesの設定例

以下は、nftablesでWebサーバー向けファイアウォールを構成する例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/sbin/nft -f

# 既存ルールをクリア
flush ruleset

# IPv4/IPv6共通のテーブルを作成
table inet filter {
    chain input {
        # チェーンの設定:入力フック、優先度0、デフォルトポリシーはdrop
        type filter hook input priority 0; policy drop;

        # ループバックインターフェースを許可
        iifname "lo" accept

        # 確立済み接続と関連接続を許可
        ct state established,related accept

        # 不正なパケットを拒否
        ct state invalid drop

        # ICMPv4とICMPv6を許可
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # SSH(ポート22)を許可
        tcp dport 22 accept

        # HTTP/HTTPS(ポート80, 443)を許可
        tcp dport { 80, 443 } accept

        # その他はログを記録してドロップ
        log prefix "nftables-dropped: " drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

このスクリプトを/etc/nftables.confに保存し、以下のコマンドで適用します。

1
2
3
4
5
# 設定を適用
sudo nft -f /etc/nftables.conf

# 設定を確認
sudo nft list ruleset

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で管理します。

1
2
3
4
5
6
# 現在のルールを設定ファイルに保存
sudo nft list ruleset > /etc/nftables.conf

# nftablesサービスを有効化
sudo systemctl enable nftables
sudo systemctl start nftables

Windowsファイアウォールの基本操作

WindowsにはWindows Defenderファイアウォール(旧称:Windowsファイアウォール)が標準搭載されています。GUIとコマンドライン(PowerShell/netsh)の両方で操作できます。

Windowsファイアウォールのプロファイル

Windowsファイアウォールは、ネットワークの種類に応じて3つのプロファイルを持ちます。

プロファイル 適用条件 推奨設定
ドメイン Active Directoryドメインに参加時 組織のポリシーに従う
プライベート ホームネットワーク、信頼されたネットワーク 一部のサービスを許可
パブリック 公衆Wi-Fiなど信頼されないネットワーク 最も厳格な制限

PowerShellでのファイアウォール操作

PowerShellでWindowsファイアウォールを操作する例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# ファイアウォールの状態を確認
Get-NetFirewallProfile | Format-Table Name, Enabled

# 受信ルールを一覧表示
Get-NetFirewallRule -Direction Inbound | Where-Object Enabled -eq True | Select-Object Name, DisplayName, Action

# 新しい受信ルールを作成(TCPポート8080を許可)
New-NetFirewallRule -DisplayName "Allow TCP 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow

# ルールを削除
Remove-NetFirewallRule -DisplayName "Allow TCP 8080"

# 特定のプロファイルでファイアウォールを有効化
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True

netshでのファイアウォール操作

従来のnetshコマンドも引き続き使用できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
rem ファイアウォールの状態を確認
netsh advfirewall show allprofiles state

rem 受信ルールを追加(TCPポート8080を許可)
netsh advfirewall firewall add rule name="Allow TCP 8080" dir=in action=allow protocol=tcp localport=8080

rem ルールを削除
netsh advfirewall firewall delete rule name="Allow TCP 8080"

rem すべてのプロファイルでファイアウォールを有効化
netsh advfirewall set allprofiles state on

ファイアウォール設定のベストプラクティス

ファイアウォールを適切に設定するためのベストプラクティスを紹介します。

最小権限の原則

必要最小限のポートのみを開放し、それ以外はすべてブロックします。

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アドレスからのみアクセスを許可します。

1
2
3
4
# 特定のIPアドレスからのSSHのみ許可
sudo iptables -A INPUT -p tcp -s 203.0.113.10 --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 203.0.113.20 --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

nftablesの場合:

1
2
tcp dport 22 ip saddr { 203.0.113.10, 203.0.113.20 } accept
tcp dport 22 drop

レート制限の適用

ブルートフォース攻撃を防ぐため、接続試行回数を制限します。

1
2
3
# iptables: 1分間に4回以上の新規SSH接続を制限
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

nftablesの場合:

1
2
3
# 1秒間に2接続を超えるSSH接続を制限
tcp dport 22 ct state new limit rate 2/second accept
tcp dport 22 ct state new drop

ログの活用

拒否されたパケットをログに記録し、不正アクセスの試行を監視します。

1
2
3
4
5
# iptables
sudo iptables -A INPUT -j LOG --log-prefix "DROPPED: " --log-level 4

# nftables
log prefix "DROPPED: " drop

よくある設定ミスとトラブルシューティング

SSHアクセスを失う

リモートサーバーでファイアウォールを設定する際、SSHポートを許可する前にデフォルトポリシーをDROPに変更すると、アクセスを失う危険があります。

正しい手順:

  1. まずSSHを許可するルールを追加
  2. その後でデフォルトポリシーをDROPに変更
1
2
3
4
# 安全な設定順序
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P INPUT DROP  # 最後にポリシーを変更

ルールの順序が誤っている

ファイアウォールのルールは上から順に評価され、最初にマッチしたルールが適用されます。

1
2
3
4
5
6
7
# 誤った例(すべてのSSHが拒否される)
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT  # 適用されない

# 正しい例(特定IPのSSHのみ許可)
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

接続追跡の設定漏れ

ステートフルルールを設定し忘れると、確立済み接続の応答パケットがブロックされます。

1
2
# これがないと、内部から開始した接続の応答が届かない
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

トラブルシューティングの手順

ファイアウォールが原因で通信できない場合の診断手順:

  1. ファイアウォールを一時的に無効化してテスト

    1
    2
    3
    4
    5
    6
    
    # Linux
    sudo iptables -P INPUT ACCEPT
    sudo iptables -F
    
    # Windows
    Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False
    
  2. ポートの状態を確認

    1
    2
    3
    4
    5
    
    # Linux
    sudo ss -tuln | grep LISTEN
    
    # Windows
    netstat -an | findstr LISTENING
    
  3. ログを確認

    1
    2
    3
    4
    5
    
    # Linux
    sudo journalctl -k | grep -i "iptables\|nftables"
    
    # または
    sudo dmesg | grep -i "iptables\|nftables"
    
  4. 外部からの疎通確認

    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はファイアウォールと密接に関連する技術で、プライベートネットワークとインターネットの接続に不可欠です。

参考リンク