サーバーをインターネットに公開する以上、ファイアウォールの適切な設定はセキュリティの最も基本的な防御線です。Linuxには複数のファイアウォールツールが用意されていますが、それぞれの特徴や使い方を正しく理解している方は意外と少ないのではないでしょうか。
「ufwとfirewalldの違いがわからない」「iptablesのルールが複雑すぎて手が出ない」「最低限どのポートを開けて、どこを閉じるべきか判断に迷う」——こうした疑問を抱えるIT担当者やエンジニアの方に向けて、本記事ではLinuxのファイアウォール設定を基礎から丁寧に解説します。
Linuxの基本についてはLinuxとは?の記事で、基本コマンドはLinuxコマンド一覧・実践ガイドでまとめていますので、必要に応じてご覧ください。
Linuxファイアウォールの基礎知識
ファイアウォールとは、ネットワーク通信を監視し、あらかじめ定義したルールに基づいて通信の許可・拒否を制御する仕組みです。LinuxカーネルにはNetfilterというパケットフィルタリングフレームワークが組み込まれており、すべてのファイアウォールツールはこのNetfilterを操作しています。
Linuxファイアウォールツールの関係
Linux環境で利用できるファイアウォールツールの関係を整理しましょう。
- Netfilter: Linuxカーネルに組み込まれたパケットフィルタリング機能(基盤)
- iptables: Netfilterを操作する低レベルのコマンドラインツール
- nftables: iptablesの後継として開発された新しいフレームワーク
- ufw(Uncomplicated Firewall): iptablesのフロントエンド(Ubuntu/Debian系)
- firewalld: iptables/nftablesのフロントエンド(RHEL/CentOS/Rocky Linux系)
つまり、ufw と firewalld は内部的に iptables(または nftables)を操作しているのであり、目的は同じです。ディストリビューションによって推奨されるツールが異なります。
どのツールを使うべきか
- Ubuntu / Debian系: ufw を使用(最も簡単)
- RHEL / CentOS / Rocky Linux系: firewalld を使用
- 高度なカスタマイズが必要な場合: iptables を直接操作
Ubuntu環境の構築についてはUbuntuサーバーセットアップガイドを、CentOS/Rocky Linux環境についてはCentOS/Rocky Linuxガイドをそれぞれ参照してください。
ufw(Uncomplicated Firewall)の使い方
ufwは「Uncomplicated(複雑でない)」という名前の通り、シンプルで直感的なコマンド体系を持つファイアウォール管理ツールです。Ubuntu/Debian系のディストリビューションに標準でインストールされています。
ufwの基本操作
# ufwの状態確認
sudo ufw status
# 詳細情報付きで状態確認
sudo ufw status verbose
# ufwを有効化
sudo ufw enable
# ufwを無効化
sudo ufw disable
# ufwをリセット(全ルール削除)
sudo ufw reset
重要: ufwを有効化する前に、必ずSSH接続を許可するルールを追加してください。そうしないと、リモートからのSSH接続が切断され、サーバーにアクセスできなくなります。
基本的なルール設定
# SSH(22番ポート)を許可
sudo ufw allow ssh
# または
sudo ufw allow 22/tcp
# HTTP(80番ポート)を許可
sudo ufw allow http
# または
sudo ufw allow 80/tcp
# HTTPS(443番ポート)を許可
sudo ufw allow https
# または
sudo ufw allow 443/tcp
# 特定のポートを許可(例: 8080番ポート)
sudo ufw allow 8080/tcp
# ポート範囲を許可
sudo ufw allow 3000:3100/tcp
# 特定のIPアドレスからの接続のみ許可
sudo ufw allow from 192.168.1.100
# 特定のIPアドレスから特定のポートへの接続を許可
sudo ufw allow from 192.168.1.100 to any port 22
# サブネット単位での許可
sudo ufw allow from 192.168.1.0/24 to any port 22
ルールの削除と拒否設定
# ルールの削除(許可ルールを指定)
sudo ufw delete allow 8080/tcp
# 番号を指定して削除
sudo ufw status numbered # 番号付きでルール一覧表示
sudo ufw delete 3 # 3番のルールを削除
# 特定のポートへの接続を明示的に拒否
sudo ufw deny 23/tcp
# 特定のIPアドレスからの接続を拒否
sudo ufw deny from 203.0.113.50
デフォルトポリシーの設定
セキュリティのベストプラクティスは、デフォルトで全通信を拒否し、必要な通信のみ許可する方式です。
# 受信をデフォルトで拒否
sudo ufw default deny incoming
# 送信をデフォルトで許可
sudo ufw default allow outgoing
Webサーバー用の基本設定例
以下は、Webサーバーとして運用する場合の典型的なufw設定です。
# デフォルトポリシーの設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSHを許可(管理用)
sudo ufw allow ssh
# HTTP/HTTPSを許可(Webサービス)
sudo ufw allow http
sudo ufw allow https
# ufwを有効化
sudo ufw enable
# 設定の確認
sudo ufw status verbose
Nginxの設定と組み合わせる場合はLinux Nginx構築ガイドもあわせて参照してください。
firewalldの使い方
firewalldは、RHEL/CentOS/Rocky LinuxなどのRed Hat系ディストリビューションで標準採用されているファイアウォール管理ツールです。「ゾーン」という概念を使って、ネットワークインターフェースごとに異なるセキュリティポリシーを適用できる点が特徴です。
firewalldの基本操作
# firewalldの状態確認
sudo firewall-cmd --state
# 現在のゾーンと設定を確認
sudo firewall-cmd --list-all
# すべてのゾーンの設定を確認
sudo firewall-cmd --list-all-zones
# 利用可能なゾーン一覧
sudo firewall-cmd --get-zones
# アクティブなゾーンを確認
sudo firewall-cmd --get-active-zones
# デフォルトゾーンを確認
sudo firewall-cmd --get-default-zone
ゾーンの概念
firewalldでは、ネットワーク接続の信頼度に応じてゾーンを使い分けます。主要なゾーンは以下の通りです。
- drop: すべての受信接続を破棄(応答なし)
- block: すべての受信接続を拒否(ICMP拒否メッセージを返す)
- public: 公開ネットワーク用(デフォルト)
- external: 外部ネットワーク用(NAT設定向け)
- internal: 内部ネットワーク用
- dmz: DMZ用
- work: 職場ネットワーク用
- home: ホームネットワーク用
- trusted: すべての接続を許可
サービスとポートの管理
# サービスを許可(一時的:再起動でリセット)
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --add-service=ssh
# サービスを許可(永続的:再起動後も有効)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# ポート番号で許可(永続的)
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=3000-3100/tcp
# 設定の反映(permanentで追加した場合はreloadが必要)
sudo firewall-cmd --reload
# サービスの削除
sudo firewall-cmd --permanent --remove-service=http
# ポートの削除
sudo firewall-cmd --permanent --remove-port=8080/tcp
# 利用可能なサービス一覧
sudo firewall-cmd --get-services
リッチルールによる高度な設定
特定のIPアドレスからのアクセス制御など、細かい条件を設定する場合はリッチルールを使用します。
# 特定のIPアドレスからSSHを許可
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
# 特定のサブネットからの接続を許可
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="http" accept'
# 特定のIPアドレスからの全接続を拒否
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" drop'
# リッチルールの確認
sudo firewall-cmd --list-rich-rules
# 設定の反映
sudo firewall-cmd --reload
iptablesの基本操作
iptablesは、Linuxカーネルのnetfilterを直接操作する最も低レベルなファイアウォール管理ツールです。ufw やfirewalldが内部で利用しているため、iptablesを理解することでファイアウォールの仕組みを本質的に理解できます。
iptablesの基本概念:チェーンとテーブル
iptablesには以下の3つの主要なチェーンがあります。
- INPUT: サーバーに入ってくるパケットを処理
- OUTPUT: サーバーから出ていくパケットを処理
- FORWARD: サーバーを経由するパケットを処理(ルーター機能)
各チェーンにはルールが順番に並んでおり、パケットは上から順にルールと照合され、最初にマッチしたルールが適用されます。
現在のルール確認
# 現在のルールを表示
sudo iptables -L
# 番号付きで詳細表示
sudo iptables -L -n -v --line-numbers
# NATテーブルのルールを表示
sudo iptables -t nat -L -n -v
基本的なルール追加
# ループバック(localhost)通信を許可
sudo iptables -A INPUT -i lo -j ACCEPT
# 確立済みの接続を許可
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH(22番ポート)を許可
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP(80番ポート)を許可
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS(443番ポート)を許可
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ICMP(ping)を許可
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# その他のINPUTをすべて拒否(最後に追加)
sudo iptables -A INPUT -j DROP
IPアドレスによるフィルタリング
# 特定のIPアドレスからの接続を許可
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 特定のIPアドレスからの接続をブロック
sudo iptables -A INPUT -s 203.0.113.50 -j DROP
# サブネット単位でのブロック
sudo iptables -A INPUT -s 10.0.0.0/8 -j DROP
# 特定のIPから特定のポートへの接続を許可
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
ルールの削除と管理
# 番号を指定してルールを削除
sudo iptables -D INPUT 3
# ルールの内容を指定して削除
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
# チェーンのすべてのルールを削除
sudo iptables -F
# デフォルトポリシーの設定
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
iptablesルールの永続化
iptablesのルールは再起動すると消えてしまうため、永続化の設定が必要です。
# Debian/Ubuntu系: iptables-persistentを使用
sudo apt install iptables-persistent
# 現在のルールを保存
sudo netfilter-persistent save
# RHEL/CentOS系: iptables-servicesを使用
sudo yum install iptables-services
sudo service iptables save
# 手動でルールをファイルに保存・復元
sudo iptables-save > /etc/iptables.rules
sudo iptables-restore < /etc/iptables.rules
ファイアウォール設定のベストプラクティス
ファイアウォールを適切に設定するために、以下のベストプラクティスを押さえておきましょう。
最小権限の原則
ファイアウォール設定の基本原則は「デフォルトですべて拒否し、必要な通信のみ許可する」です。この方式により、意図しないサービスが外部に公開されるリスクを最小化できます。
# ufwの場合
sudo ufw default deny incoming
sudo ufw default allow outgoing
# firewalldの場合(dropゾーンをデフォルトに)
sudo firewall-cmd --set-default-zone=drop
# iptablesの場合
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
SSH接続を最初に確保する
リモートサーバーでファイアウォールを設定する際は、SSH接続の許可を最優先で設定してください。SSH接続を許可しないままファイアウォールを有効化すると、サーバーにアクセスできなくなります。SSH接続の管理方法はLinux SSH・リモート接続ガイドをご覧ください。
SSHのポート変更を検討する
SSHのデフォルトポート(22番)は攻撃者にとって最初の標的です。ポートを変更することで、自動化されたブルートフォース攻撃を大幅に減らせます。
# SSHのポートを変更(例: 2222番)
# /etc/ssh/sshd_configを編集
Port 2222
# ファイアウォールに新しいポートを追加
sudo ufw allow 2222/tcp
# SSHを再起動
sudo systemctl restart sshd
不要なサービスを停止する
ファイアウォールでポートを閉じることに加え、不要なサービス自体を停止することも重要です。サービスの管理についてはLinux systemd・サービス管理ガイドで詳しく解説しています。
# 稼働中のサービスを確認
sudo systemctl list-units --type=service --state=running
# 不要なサービスを停止・無効化
sudo systemctl stop サービス名
sudo systemctl disable サービス名
実践:Webサーバーのファイアウォール設定例
ここでは、実際のWebサーバーを想定した具体的なファイアウォール設定を紹介します。
ufwでのWebサーバー設定
# 1. デフォルトポリシーの設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. SSH(管理者のIPアドレスのみ許可)
sudo ufw allow from 203.0.113.10 to any port 22
# 3. HTTP/HTTPSを全体に公開
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 4. 内部ネットワークからの管理用ポート(例: 管理画面)
sudo ufw allow from 10.0.0.0/8 to any port 8080
# 5. ufwを有効化
sudo ufw enable
# 6. 設定確認
sudo ufw status numbered
firewalldでのWebサーバー設定
# 1. デフォルトゾーンをpublicに設定
sudo firewall-cmd --set-default-zone=public
# 2. HTTP/HTTPSを許可
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 3. SSHを特定のIPのみに制限
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" service name="ssh" accept'
# 4. 設定を反映
sudo firewall-cmd --reload
# 5. 設定確認
sudo firewall-cmd --list-all
ファイアウォールのトラブルシューティング
ファイアウォールの設定後に通信の問題が発生した場合の対処方法を紹介します。
接続できない場合の確認手順
# 1. ファイアウォールの状態とルールを確認
sudo ufw status verbose # ufwの場合
sudo firewall-cmd --list-all # firewalldの場合
sudo iptables -L -n -v # iptablesの場合
# 2. 対象のサービスが稼働しているか確認
sudo systemctl status nginx
# 3. サービスがリッスンしているポートを確認
sudo ss -tlnp | grep :80
# 4. ローカルからの接続テスト
curl -I http://localhost:80
# 5. ログで拒否されたパケットを確認
sudo journalctl -k | grep "UFW BLOCK" # ufwの場合
sudo journalctl | grep "FINAL_REJECT" # firewalldの場合
ネットワーク系のコマンドの詳細はLinuxネットワークコマンドの記事を参照してください。ログの調査方法についてはLinuxログ管理入門でも解説しています。
ufwのログ有効化
# ufwのログを有効化
sudo ufw logging on
# ログレベルの変更(low/medium/high/full)
sudo ufw logging medium
# ログの確認
sudo tail -f /var/log/ufw.log
ロックアウト時の対処
ファイアウォール設定のミスでSSH接続できなくなった場合の対処法です。
- コンソールアクセス: サーバーの物理コンソールまたはクラウドのWebコンソールからログインし、ファイアウォールを無効化する
- レスキューモード: シングルユーザーモードで起動し、ファイアウォール設定を修正する
- cronによる自動リセット: 設定変更前に、一定時間後にファイアウォールをリセットするcronジョブを仕込んでおく
# 15分後にufwを無効化するcronジョブ(安全策)
echo "sudo ufw disable" | at now + 15 minutes
# 設定が正しいことを確認できたらcronジョブをキャンセル
atrm ジョブ番号
cronの使い方についてはLinux cron・スケジュール実行ガイドで解説しています。
まとめ
Linuxのファイアウォール設定は、サーバーセキュリティの基本です。本記事で解説した内容を振り返りましょう。
- ufwはUbuntu/Debian系で使いやすいシンプルなファイアウォール管理ツール
- firewalldはRHEL/CentOS/Rocky Linux系でゾーンベースの柔軟な設定が可能
- iptablesは低レベルだが最も柔軟性が高く、仕組みの理解に不可欠
- すべてのツールでの基本原則は「デフォルト拒否、必要な通信のみ許可」
- SSH接続の確保を最優先にし、ロックアウト対策を講じた上で設定を行う
- ファイアウォールはセキュリティ対策の一つであり、総合的なセキュリティ強化と組み合わせることが重要
ファイアウォールの設定は、サーバー構築の初期段階で行うべき作業です。ユーザー・グループ管理やファイルパーミッション設定と合わせて、セキュリティの基盤を固めましょう。Linuxの基本を体系的に学びたい方はLinuxコマンド一覧・実践ガイドもぜひご活用ください。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践