iptablesとfirewalldの違いと移行手順

Linuxシステムのファイアウォール設定で迷ったら、iptablesとfirewalldのどちらを選択すべきかを明確に理解してください。既存システムの保護と将来的な保守性を考慮するなら、firewalldへの移行が最適な選択です。本記事では、両者の根本的な違いから具体的な移行手順、そしてそれぞれのメリット・デメリットを網羅的に解説します。Linuxサーバーのセキュリティ強化に直結する重要な知識を、実務で即活用できる形で提供します。
目次
- iptablesとfirewalldの基本概念
- iptablesとfirewalldの違いを徹底比較
- iptablesからfirewalldへの移行手順
- firewalldの基本設定と活用方法
- トラブルシューティングとよくある質問
- まとめ:最適なファイアウォール選択
iptablesとfirewalldの基本概念
Linuxシステムにおけるファイアウォール機能は、ネットワークトラフィックの制御とセキュリティ強化に不可欠な要素です。iptablesとfirewalldは、いずれもLinuxカーネルのNetfilter機能を活用したファイアウォールソリューションですが、その設計思想と運用方法には大きな違いがあります。
iptablesは、Netfilterフレームワークのコマンドラインツールとして1998年から存在しており、長年にわたりLinuxファイアウォールの事実上の標準として利用されてきました。一方、firewalldはRed Hat系ディストリビューション(RHEL、CentOS、Fedora)で2011年頃に登場した比較的新しいソリューションで、動的なネットワーク管理とゾーンベースの設定を特徴としています。
両者の主な違いは以下の通りです:
| 機能 | iptables | firewalld |
|---|---|---|
| 開発元 | 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へ移行する手順を段階的に解説します。
移行前の準備
移行を開始する前に、以下の準備を行うことが重要です:
- システムのバックアップ:
移行前にシステムの完全バックアップを取得します。特に重要な設定ファイルやデータベースは必ずバックアップしてください。
sudo tar -czvf /backup/system_backup_$(date +%Y%m%d).tar.gz /etc /var/lib
- iptablesルールの確認:
現在のiptablesルールを確認し、ドキュメント化します。
sudo iptables -L -n -v --line-numbers
sudo iptables-save > /tmp/iptables_rules_backup.txt
- firewalldのインストール:
firewalldがインストールされていない場合は、以下のコマンドでインストールします。
sudo dnf install firewalld -y # RHEL/CentOS/Fedora sudo apt install firewalld -y # Debian/Ubuntu
- iptablesサービスの停止:
iptablesサービスを停止します。ただし、移行が完了するまではiptablesを完全に無効化しないでください。
sudo systemctl stop iptables sudo systemctl stop ip6tables
- firewalldサービスの起動:
firewalldを起動し、システム起動時に自動起動するように設定します。
sudo systemctl enable firewalld --now
既存ルールのエクスポート
iptablesルールをfirewalld形式に変換するために、既存のルールをエクスポートします。いくつかのツールを使用して、iptablesルールをfirewalld形式に変換できます。
方法1:iptables-restore-to-firewalld
このツールは、iptablesルールをfirewalld形式に変換するためのスクリプトです。
- ツールをダウンロードします:
- iptablesルールを変換します:
git clone https://github.com/firewalld/iptables-restore-to-firewalld.git cd iptables-restore-to-firewalld
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にルールを移行します。以下の手順で移行を行います:
- 基本的なサービスの有効化:
必要なサービスを有効化します。例えば、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
- カスタムポートの設定:
特定のポートを許可する場合は、以下のように設定します:
sudo firewall-cmd --add-port=12345/tcp --permanent sudo firewall-cmd --reload
- ゾーンの設定:
ネットワークインターフェースごとに異なるゾーンを設定します。例えば、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
- 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
- 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へのルール移行が完了したら、以下の手順で検証を行います:
- ファイアウォールの状態確認:
firewalldの状態を確認します。
sudo firewall-cmd --state sudo firewall-cmd --list-all
- 接続テスト:
サーバーへの接続が正常に行えることを確認します。例えば、SSH、HTTP、HTTPSへの接続をテストします。
ssh user@your_server_ip curl http://your_server_ip curl https://your_server_ip
- ログの確認:
ファイアウォールのログを確認し、ブロックされた接続がないか確認します。
sudo journalctl -u firewalld -f
- iptablesとの比較:
iptablesとfirewalldのルールが同じように動作することを確認します。例えば、特定のポートへのアクセスをテストします。
sudo netstat -tuln | grep PORT_NUMBER
- システムの再起動:
システムを再起動し、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




