Linuxシステムのファイアウォール設定で迷ったら、iptablesとfirewalldのどちらを選択すべきかを明確に理解してください。既存システムの保護と将来的な保守性を考慮するなら、firewalldへの移行が最適な選択です。本記事では、両者の根本的な違いから具体的な移行手順、そしてそれぞれのメリット・デメリットを網羅的に解説します。Linuxサーバーのセキュリティ強化に直結する重要な知識を、実務で即活用できる形で提供します。

目次

iptablesとfirewalldの基本概念

Linuxシステムにおけるファイアウォール機能は、ネットワークトラフィックの制御とセキュリティ強化に不可欠な要素です。iptablesとfirewalldは、いずれもLinuxカーネルのNetfilter機能を活用したファイアウォールソリューションですが、その設計思想と運用方法には大きな違いがあります

iptablesは、Netfilterフレームワークのコマンドラインツールとして1998年から存在しており、長年にわたりLinuxファイアウォールの事実上の標準として利用されてきました。一方、firewalldはRed Hat系ディストリビューション(RHEL、CentOS、Fedora)で2011年頃に登場した比較的新しいソリューションで、動的なネットワーク管理とゾーンベースの設定を特徴としています。

両者の主な違いは以下の通りです:

機能iptablesfirewalld
開発元Netfilterプロジェクト(コミュニティベース)Red Hat(現在は独立したプロジェクト)
初登場1998年2011年
設定方法コマンドライン(iptables/ip6tables)コマンドライン(firewall-cmd)+ GUI
動的管理再起動でルールが消失ネットワーク変更に自動対応
ゾーン管理サポートなし複数ネットワークインターフェースに対応
設定保存手動で保存が必要自動保存(設定により変更可)
パフォーマンス低レイヤーで動作(高速)D-Bus経由で動作(若干のオーバーヘッド)

これらの違いを理解した上で、自分のシステムに最適なファイアウォールソリューションを選択することが重要です。

iptablesとfirewalldの違いを徹底比較

アーキテクチャの違い

iptablesとfirewalldのアーキテクチャにおける最大の違いは、Netfilterとのインターフェースの違いです。iptablesは直接Netfilterのルールテーブルを操作しますが、firewalldはD-Bus経由でNetfilterを制御します。

具体的には:

  • iptablesアーキテクチャ
    • ユーザー空間のiptablesコマンドが直接Netfilterのルールテーブルを操作
    • ルールはカーネルメモリに直接書き込まれる
    • ルールの変更は即時に反映されるが、再起動で消失
    • 複数のテーブル(filter、nat、mangle、raw、security)を個別に管理
  • firewalldアーキテクチャ
    • firewalldデーモンがD-Bus経由でNetfilterを制御
    • 設定はXMLファイルとして保存され、動的に反映される
    • ネットワークインターフェースの状態変化に自動対応
    • ゾーン概念を導入し、ネットワークインターフェースごとに異なるルールを適用可能

このアーキテクチャの違いにより、firewalldはネットワーク環境の変化に柔軟に対応できる一方で、iptablesはより直接的で低レイヤーな制御が可能という特徴があります。

設定方法の違い

設定方法における違いは、主に設定の永続性と管理の容易さに表れます。

iptablesの設定方法

  • コマンドラインで直接ルールを追加・削除
  • ルールは即時に反映されるが、再起動で消失
  • 設定を保存するには「iptables-save」コマンドでファイルに出力し、「iptables-restore」で読み込む必要あり
  • 構文が複雑で、ミスが発生しやすい

firewalldの設定方法

  • 「firewall-cmd」コマンドで設定を管理
  • 設定は自動的に永続化される(設定により変更可)
  • ゾーン概念により、ネットワークインターフェースごとに異なる設定が可能
  • GUIツール「firewall-config」も利用可能
  • サービスやポート番号で設定できるため、直感的な操作が可能

例えば、Webサーバー(HTTP/HTTPS)へのアクセスを許可する場合:

  • iptablesの場合
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    設定を保存するには:
    iptables-save > /etc/iptables/rules.v4
  • firewalldの場合
    firewall-cmd --add-service=http --permanent
    firewall-cmd --add-service=https --permanent
    firewall-cmd --reload

firewalldの方が直感的で管理が容易であることが分かります。

サービス管理の違い

firewalldの最大の特徴の一つがサービス管理機能です。firewalldでは、サービス名(例:http、https、ssh、ftp)で簡単にルールを設定できます。

iptablesでは、サービス名ではなくポート番号やプロトコルでルールを設定する必要があります。例えば、SSH(ポート22)へのアクセスを許可する場合:

  • iptablesの場合
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • firewalldの場合
    firewall-cmd --add-service=ssh --permanent
    firewall-cmd --reload

firewalldでは、サービス名を指定するだけで自動的に関連するポートとプロトコルが設定されます。これにより、設定ミスを防ぎ、管理が容易になります。

また、firewalldでは、カスタムサービスを定義することも可能です。例えば、独自のポートを使用するアプリケーションの場合:

firewall-cmd --new-service=myapp --permanent
firewall-cmd --service=myapp --set-short="My Application"
firewall-cmd --service=myapp --set-description="Description of my application"
firewall-cmd --service=myapp --add-port=12345/tcp
firewall-cmd --reload

このように、firewalldはサービスベースの管理により、設定の柔軟性と管理の容易さを両立しています。

ゾーン管理の違い

firewalldのもう一つの特徴がゾーン管理機能です。ゾーンは、ネットワークインターフェースごとに異なるセキュリティレベルを設定するための概念です。

主なゾーンとその特徴:

ゾーン名信頼レベルデフォルト設定用途
trusted完全信頼すべての接続を許可信頼できるネットワーク
home中程度の信頼SSH、MDNS、Samba、ipp-clientを許可家庭用ネットワーク
internal中程度の信頼homeと同様内部ネットワーク
work中程度の信頼SSH、ipp-clientを許可職場用ネットワーク
public低信頼SSHのみ許可公共のネットワーク
external
低信頼外部ネットワーク向けのNAT設定外部ネットワーク
dmz低信頼限定的な接続のみ許可DMZネットワーク
block拒否すべての接続を拒否特定のネットワーク
drop拒否すべての接続をドロップ特定のネットワーク

例えば、eth0を「public」ゾーンに、eth1を「internal」ゾーンに設定する場合:

firewall-cmd --zone=public --change-interface=eth0 --permanent
firewall-cmd --zone=internal --change-interface=eth1 --permanent
firewall-cmd --reload

このように、firewalldではネットワークインターフェースごとに異なるセキュリティポリシーを適用できます。これは、特に複数のネットワークインターフェースを持つサーバーにおいて非常に有用です。

iptablesからfirewalldへの移行手順

既存のiptablesルールをfirewalldに移行することは、多くのシステム管理者にとって重要な課題です。ここでは、安全かつ確実にiptablesからfirewalldへ移行する手順を段階的に解説します。

移行前の準備

移行を開始する前に、以下の準備を行うことが重要です:

  1. システムのバックアップ

    移行前にシステムの完全バックアップを取得します。特に重要な設定ファイルやデータベースは必ずバックアップしてください。

    sudo tar -czvf /backup/system_backup_$(date +%Y%m%d).tar.gz /etc /var/lib
  2. iptablesルールの確認

    現在のiptablesルールを確認し、ドキュメント化します。

    sudo iptables -L -n -v --line-numbers
    sudo iptables-save > /tmp/iptables_rules_backup.txt
  3. firewalldのインストール

    firewalldがインストールされていない場合は、以下のコマンドでインストールします。

    sudo dnf install firewalld -y  # RHEL/CentOS/Fedora
    sudo apt install firewalld -y  # Debian/Ubuntu
  4. iptablesサービスの停止

    iptablesサービスを停止します。ただし、移行が完了するまではiptablesを完全に無効化しないでください。

    sudo systemctl stop iptables
    sudo systemctl stop ip6tables
  5. firewalldサービスの起動

    firewalldを起動し、システム起動時に自動起動するように設定します。

    sudo systemctl enable firewalld --now

既存ルールのエクスポート

iptablesルールをfirewalld形式に変換するために、既存のルールをエクスポートします。いくつかのツールを使用して、iptablesルールをfirewalld形式に変換できます。

方法1:iptables-restore-to-firewalld

このツールは、iptablesルールをfirewalld形式に変換するためのスクリプトです。

  1. ツールをダウンロードします:
  2. git clone https://github.com/firewalld/iptables-restore-to-firewalld.git
    cd iptables-restore-to-firewalld
  3. iptablesルールを変換します:
  4. sudo ./iptables-restore-to-firewalld.py < /tmp/iptables_rules_backup.txt > /tmp/firewalld_rules.xml

方法2:手動変換

ルールがシンプルな場合は、手動でfirewalld形式に変換することも可能です。例えば、以下のiptablesルールをfirewalld形式に変換します:

  • iptablesルール
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    iptables -A INPUT -j DROP
  • firewalldルール
    firewall-cmd --add-service=ssh --permanent
    firewall-cmd --add-service=http --permanent
    firewall-cmd --add-service=https --permanent
    firewall-cmd --set-default-zone=drop

このように、iptablesルールをfirewalld形式に変換する際には、サービスベースの設定を活用することで、より管理しやすい設定に変換できます。

firewalldへのルール移行

iptablesルールをfirewalld形式に変換したら、firewalldにルールを移行します。以下の手順で移行を行います:

  1. 基本的なサービスの有効化

    必要なサービスを有効化します。例えば、SSH、HTTP、HTTPSを有効化する場合:

    sudo firewall-cmd --add-service=ssh --permanent
    sudo firewall-cmd --add-service=http --permanent
    sudo firewall-cmd --add-service=https --permanent
    sudo firewall-cmd --reload
  2. カスタムポートの設定

    特定のポートを許可する場合は、以下のように設定します:

    sudo firewall-cmd --add-port=12345/tcp --permanent
    sudo firewall-cmd --reload
  3. ゾーンの設定

    ネットワークインターフェースごとに異なるゾーンを設定します。例えば、eth0を「public」ゾーンに、eth1を「internal」ゾーンに設定する場合:

    sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
    sudo firewall-cmd --zone=internal --change-interface=eth1 --permanent
    sudo firewall-cmd --reload
  4. NAT設定の移行

    NAT設定を行う場合は、以下のように設定します。例えば、ポートフォワーディングを行う場合:

    sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100 --permanent
    sudo firewall-cmd --reload
  5. rich rulesの設定

    高度なルールを設定する場合は、rich rulesを使用します。例えば、特定のIPアドレスからのアクセスを制限する場合:

    sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept' --permanent
    sudo firewall-cmd --reload

移行後の検証

firewalldへのルール移行が完了したら、以下の手順で検証を行います:

  1. ファイアウォールの状態確認

    firewalldの状態を確認します。

    sudo firewall-cmd --state
    sudo firewall-cmd --list-all
  2. 接続テスト

    サーバーへの接続が正常に行えることを確認します。例えば、SSH、HTTP、HTTPSへの接続をテストします。

    ssh user@your_server_ip
    curl http://your_server_ip
    curl https://your_server_ip
  3. ログの確認

    ファイアウォールのログを確認し、ブロックされた接続がないか確認します。

    sudo journalctl -u firewalld -f
  4. iptablesとの比較

    iptablesとfirewalldのルールが同じように動作することを確認します。例えば、特定のポートへのアクセスをテストします。

    sudo netstat -tuln | grep PORT_NUMBER
  5. システムの再起動

    システムを再起動し、firewalldが正常に起動し、ルールが適用されることを確認します。

    sudo reboot

これらの手順を実施することで、iptablesからfirewalldへの移行が安全かつ確実に行えます。

firewalldの基本設定と活用方法

firewalldの基本的な設定方法と活用方法について解説します。firewalldを効果的に活用することで、Linuxシステムのセキュリティを強化し、管理を容易にすることができます。

firewalldのインストール

firewalldは、主要なLinuxディストリビューションで標準的に利用可能です。以下に、主なディストリビューションにおけるインストール方法を示します。

ディストリビューションインストールコマンド備考
RHEL / CentOS 7+
sudo dnf install firewalld -y
RHEL 7以降、CentOS 7以降
Fedora
sudo dnf install firewalld -y
デフォルトでインストール済み
Debian / Ubuntu
sudo apt update
sudo apt install firewalld -y
デフォルトではインストールされていない
openSUSE
sudo zypper install firewalld
デフォルトではインストールされていない

インストール後、firewalldサービスを起動し、システム起動時に自動起動するように設定します:

sudo systemctl enable firewalld --now

firewalldが正常に起動していることを確認します:

sudo systemctl status firewalld

主要コマンド一覧

firewalldを操作するための主要なコマンドを以下に示します。これらのコマンドを活用することで、firewalldの設定を柔軟に管理できます。

カテゴリコマンド説明
基本操作
sudo firewall-cmd --state
firewalldの状態を確認(running/failed)
sudo firewall-cmd --reload
設定を再読み込み(永続設定を反映)
sudo firewall-cmd --complete-reload
完全な再読み込み(一時設定もクリア)
sudo firewall-cmd --list-all
現在のゾーンのすべての設定を表示
sudo firewall-cmd --list-all-zones
すべてのゾーンの設定を表示
sudo firewall-cmd --get-zones
利用可能なゾーンを表示
sudo firewall-cmd --get-default-zone
デフォルトゾーンを表示
sudo firewall-cmd --set-default-zone=ZONE
デフォルトゾーンを設定
サービス管理
sudo firewall-cmd --list-services
有効なサービスを表示
sudo firewall-cmd --add-service=SERVICE --permanent
サービスを有効化(永続設定)
sudo firewall-cmd --remove-service=SERVICE --permanent
サービスを無効化(永続設定)
sudo firewall-cmd --list-services --zone=ZONE
特定のゾーンで有効なサービスを表示
sudo firewall-cmd --add-service=SERVICE --zone=ZONE --permanent
特定のゾーンでサービスを有効化
sudo firewall-cmd --new-service=NAME --permanent
新しいカスタムサービスを作成
ポート管理
sudo firewall-cmd --list-ports
有効なポートを表示
sudo firewall-cmd --add-port=PORT/PROTOCOL --permanent
ポートを開放(永続設定)
sudo firewall-cmd --remove-port=PORT/PROTOCOL --permanent
ポートを閉鎖(永続設定)
sudo firewall-cmd --list-ports --zone=ZONE
特定のゾーンで有効なポートを表示
sudo firewall-cmd --add-port=PORT/PROTOCOL --zone=ZONE --permanent
特定のゾーンでポートを開放
sudo firewall-cmd --add-port=PORT-PORT/PROTOCOL --permanent
ポート範囲を開放
インターフェース管理
sudo firewall-cmd --list-interfaces
インターフェース一覧を表示
sudo firewall-cmd --change-interface=INTERFACE --zone=ZONE --permanent
インターフェースをゾーンに割り当て
sudo firewall-cmd --get-zone-of-interface=INTERFACE
インターフェースが属するゾーンを表示
sudo firewall-cmd --remove-interface=INTERFACE --permanent
インターフェースのゾーン割り当てを解除
rich rules
sudo firewall-cmd --list-rich-rules
rich rulesを表示
sudo firewall-cmd --add-rich-rule='RULE' --permanent
rich ruleを追加(永続設定)
sudo firewall-cmd --remove-rich-rule='RULE' --permanent
rich ruleを削除(永続設定)
sudo firewall-cmd --query-rich-rule='RULE'
rich ruleが存在するか確認
マスカレード
sudo firewall-cmd --query-masquerade
マスカレードが有効か確認
sudo firewall-cmd --add-masquerade --permanent
マスカレードを有効化(永続設定)
sudo firewall-cmd --remove-masquerade --permanent
マスカレードを無効化(永続設定)
sudo firewall-cmd --list-forward-ports
ポートフォワーディングを表示

これらのコマンドを活用することで、firewalldの設定を柔軟に管理できます。

実用的な設定例

firewalldを実務で活用するための具体的な設定例を以下に示します。

例1:Webサーバーの設定

Webサーバー(Apache/Nginx)を運用する場合の基本的な設定です。

# HTTP/HTTPSサービスを有効化
sudo
【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営