はい、承知いたしました。CentOSのファイアウォール(firewalld)に関する、初心者向けの詳細な解説記事を、約5000語で記述します。
【初心者向け】CentOSファイアウォールの基本設定ガイド:安全なサーバー運用の第一歩
サーバーをインターネットに公開する上で、セキュリティは最も重要な要素の一つです。玄関の鍵や警備員なしに家を開け放つことができないように、サーバーも不必要な通信から保護する必要があります。その「鍵」や「警備員」の役割を果たすのが「ファイアウォール」です。
CentOSでは、バージョン7以降、標準のファイアウォール管理ツールとしてfirewalld
が採用されています。このガイドでは、CentOSの初心者の方でもfirewalldの基本的な考え方と操作を理解し、安全なサーバー運用を開始できるよう、詳細に解説していきます。
はじめに:なぜファイアウォールが必要なのか?
サーバーは、ウェブサイトの公開、メールの送受信、データベースの運用など、様々な目的で使用されます。これらのサービスは、インターネット経由で通信を行う必要があります。しかし、同時に、悪意のある第三者からの不正アクセスや攻撃からサーバーを保護しなければなりません。
ファイアウォールの役割は、サーバーへのネットワーク通信を監視し、設定されたルールに基づいて許可するか拒否するかを判断することです。これにより、必要な通信(例えば、ウェブサイトへのアクセス)だけを許可し、不要な通信や危険な通信(例えば、未知のポートへの接続試行)をブロックすることができます。
CentOSのfirewalld
は、動的なファイアウォール管理ツールです。これは、設定を変更した際にファイアウォールサービス全体を再起動する必要がなく、サービスを中断することなく設定の追加や削除が行えることを意味します。また、「ゾーン」という概念を用いて、ネットワークの場所や信頼度に応じた柔軟なルール管理が可能です。
このガイドでは、firewalld
の基本的な概念、コマンドラインツールであるfirewall-cmd
を使った設定方法、よくあるケース(SSH接続、Webサーバー、FTPサーバーなど)での設定例、そして安全な運用のためのおさらいを順を追って説明します。
第1部:firewalldの基本概念を理解する
firewalld
を使いこなすには、いくつかの重要な概念を理解しておく必要があります。これらはiptables
などの従来のファイアウォールツールとは異なるアプローチを取っています。
1. デーモンとサービス
firewalld
はシステムサービス(デーモン)として動作します。CentOSでは、systemctl
コマンドを使ってサービスの起動、停止、有効化、無効化を行います。
- firewalld.service: firewalldのメインサービスです。このサービスが起動している間、ファイアウォールが有効になります。
2. ゾーン (Zones)
firewalld
の最も重要な概念の一つが「ゾーン」です。ゾーンは、ネットワークインターフェース(eth0, wlan0など)や通信元IPアドレスに基づいて、異なる信頼レベルを持つネットワークを分類するための仕組みです。ネットワークの場所や接続の種類に応じて、異なるセキュリティポリシーを適用することができます。
例:
- 信頼できる内部ネットワーク: 社内LANなど、比較的安全と考えられるネットワーク。
- 自宅ネットワーク: 自宅LANなど。
- 公共ネットワーク: インターネットに直接接続されるネットワーク。最も信頼度が低い。
firewalld
には、あらかじめ定義された複数のゾーンがあります。代表的なゾーンとそのデフォルトのポリシーは以下の通りです。
ゾーン名 | 説明 | デフォルトのポリシー | 用途例 |
---|---|---|---|
drop |
全ての着信ネットワークパケットをサイレントに破棄する。応答は返さない。 | 全て拒否 | 最も厳格な制限が必要な場合 |
reject |
着信ネットワークパケットを拒否するが、拒否通知(ICMP host-prohibited)を返す。 | 全て拒否(拒否通知あり) | dropよりやや緩やかだが、基本的に通信を許可しない場合 |
block |
ipv4 ICMP host-prohibited および ipv6 ICMP admin-prohibited で拒否する。 | 全て拒否(特定のICMP応答あり) | rejectに近い |
public |
外部に公開されるネットワーク。信頼されていない他のコンピューターからの接続を許可する。 | デフォルトでは SSH, dhcpv6-client のみが許可されることが多い | ほとんどのサーバーでインターネット接続に適用されるゾーン |
external |
外部ネットワーク(IPマスカレードが有効)。 | デフォルトでは何も許可されない | NATルーターなどの外部インターフェースに適用 |
dmz |
非武装地帯(DeMilitarized Zone)。DMZにあるコンピューターのみを信頼。 | デフォルトでは何も許可されない | 公開Webサーバーなどが置かれるゾーン |
work |
作業用マシンなど、内部ネットワーク。信頼されているコンピューターのみを信頼。 | デフォルトでは SSH, client-dhcpv6, ipp-client が許可される | 比較的安全なオフィスネットワーク |
home |
自宅ネットワーク。ローカルネットワーク上の他のコンピューターを信頼。 | デフォルトでは SSH, client-dhcpv6, ipp-client, samba-client, mdns, dhcpv6 が許可される | 自宅ネットワーク内のサーバー |
internal |
内部ネットワーク。ローカルネットワーク上の全てのコンピューターを信頼。 | デフォルトでは SSH, client-dhcpv6, ipp-client, samba-client, mdns, dhcpv6 が許可される | より信頼性の高い内部ネットワーク |
trusted |
ネットワーク上の全てのコンピューターを完全に信頼する。 | 全ての通信を許可 | 非常に信頼性の高い、限定されたネットワーク |
POINT: CentOSのデフォルト設定では、インターネットに接続されているインターフェースは通常public
ゾーンに割り当てられます。特別な理由がない限り、まずはpublic
ゾーンの設定をカスタマイズして利用するのが一般的です。
どのゾーンがどのインターフェースに割り当てられているかは、後述のコマンドで確認できます。
3. サービス (Services)
firewalld
では、特定のポート番号とプロトコル(TCP/UDPなど)の組み合わせを「サービス」として定義しています。例えば、ウェブサーバーが使用するTCP 80番ポートはhttp
というサービス名、SSHが使用するTCP 22番ポートはssh
というサービス名に対応しています。
サービス名を使用する利点は以下の通りです。
- ポート番号を覚えなくて済む。
- 関連する複数のポートや設定がまとめて管理されている場合がある(例:FTPなど)。
- 設定内容が分かりやすくなる。
firewalld
には、一般的なサービスがあらかじめ定義されています。ssh
, http
, https
, ftp
, mysql
, postgresql
, smtp
, pop3
, imap
, samba
などが含まれます。
4. ポート (Ports)
サービスとして定義されていない、または特定のアプリケーションが使用するカスタムポートを開放したい場合は、ポート番号とプロトコル(tcpまたはudp)を指定して直接許可することができます。
例:カスタムアプリケーションがTCP 8080番ポートを使用する場合。
5. リッチルール (Rich Rules)
ゾーン、サービス、ポートの設定だけでは対応できない、より詳細で複雑なルールを設定したい場合に「リッチルール」を使用します。リッチルールは、通信元/通信先IPアドレス、ポート、プロトコル、アクション(許可/拒否/破棄など)などを組み合わせて、細かい条件に基づいたフィルタリングを行うことができます。
例:
- 特定のIPアドレスからのSSH接続のみを許可し、それ以外は拒否する。
- 特定のIPアドレス範囲からのHTTPアクセスを許可し、それ以外は拒否する。
- 特定のIPアドレスからのすべての通信をブロックする。
リッチルールは強力ですが、構文がやや複雑になります。基本的な設定では、サービスやポートの許可で十分な場合が多いです。
6. ランタイム設定と永続設定 (Runtime and Permanent Configuration)
firewalld
の設定には、「ランタイム設定」と「永続設定」の二種類があります。
- ランタイム設定 (Runtime Configuration): 現在有効になっている設定です。
firewall-cmd
コマンドで--runtime
オプションを付けずに設定した場合、または--add-service
などのオプションを付けただけの場合は、デフォルトでランタイム設定に反映されます。この設定は、firewalld
サービスを再起動したり、システムを再起動したりすると失われます。一時的なテストなどに便利です。 - 永続設定 (Permanent Configuration): 設定ファイル(主に
/etc/firewalld/
ディレクトリ以下)に保存される設定です。firewall-cmd
コマンドで--permanent
オプションを付けて設定した場合に反映されます。この設定は、firewalld
サービスを再起動したり、システムを再起動したりしても保持されます。サーバーを運用する上での最終的な設定はこちらで行う必要があります。永続設定を反映するには、firewalld
の「リロード」が必要です。
重要: firewall-cmd --add-service=http --permanent
のように--permanent
オプションを付けて設定を行っても、その変更は即座には有効になりません。永続設定を現在のランタイム設定に反映させるには、firewall-cmd --reload
コマンドを実行する必要があります。
また、firewall-cmd --runtime-to-permanent
コマンドを使うと、現在のランタイム設定をそのまま永続設定として保存することもできます。
第2部:firewalldの基本的な操作コマンド (firewall-cmd
)
firewalld
の設定は、主にコマンドラインツールであるfirewall-cmd
を使って行います。ここでは、サーバーの起動直後や基本的な操作でよく使うコマンドを紹介します。
1. firewalldサービスの起動・停止・状態確認
ファイアウォールが有効になっているか、または起動しているかを確認します。
“`bash
firewalldサービスの起動
sudo systemctl start firewalld
firewalldサービスの停止
sudo systemctl stop firewalld
firewalldサービスの再起動
sudo systemctl restart firewalld
firewalldサービスの有効化 (システム起動時に自動で起動するように設定)
sudo systemctl enable firewalld
firewalldサービスの無効化 (システム起動時に自動で起動しないように設定)
sudo systemctl disable firewalld
firewalldサービスの現在の状態を確認
sudo systemctl status firewalld
“`
systemctl status firewalld
の出力でActive: active (running)
となっていれば、サービスは正常に起動しています。
ファイアウォール自体が有効な状態か(サービスが起動しているか)は、firewall-cmd
でも確認できます。
“`bash
firewalldの状態を確認 (running or not running)
sudo firewall-cmd –state
“`
2. ゾーンとインターフェースの確認
現在、どのゾーンが有効になっていて、どのインターフェースがどのゾーンに割り当てられているかを確認します。
“`bash
有効な(使用中の)ゾーンを表示
sudo firewall-cmd –get-active-zones
“`
出力例:
public
interfaces: eth0
これは、eth0
というインターフェースがpublic
ゾーンに割り当てられていることを示しています。
3. 特定のゾーンの設定確認
特定のゾーンに設定されているルール(サービス、ポート、リッチルールなど)を確認します。デフォルトのゾーン(public
など)や、--get-active-zones
で確認したゾーン名を指定します。
“`bash
publicゾーンの全てのルールを表示 (ランタイム設定)
sudo firewall-cmd –zone=public –list-all
publicゾーンの全てのルールを表示 (永続設定)
sudo firewall-cmd –zone=public –list-all –permanent
“`
--list-all
オプションは、そのゾーンで許可されているサービス、ポート、プロトコル、マスカレード、ポート転送、リッチルールなどをまとめて表示します。
出力例(publicゾーンのデフォルトに近い状態):
public (active)
target: default
icmp-block-invert: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
services: ssh dhcpv6-client
の部分は、このゾーンではSSHとDHCPv6クライアントの通信が許可されていることを示しています。
4. デフォルトゾーンの確認と変更
新しいインターフェースが追加された際に割り当てられるデフォルトのゾーンを確認したり、変更したりできます。
“`bash
デフォルトゾーンを確認
sudo firewall-cmd –get-default-zone
デフォルトゾーンをpublicに変更 (ランタイムのみ)
sudo firewall-cmd –set-default-zone=public
デフォルトゾーンをpublicに変更 (永続的に)
sudo firewall-cmd –set-default-zone=public –permanent
永続設定を反映するにはリロードが必要
sudo firewall-cmd –reload
“`
5. firewalld設定のリロード
永続設定(--permanent
オプションで変更した内容)を現在のランタイム設定に反映させるには、リロードが必要です。
“`bash
firewalld設定をリロードする
sudo firewall-cmd –reload
“`
リロードは、サービスを再起動するわけではないため、確立済みの接続(SSHセッションなど)は切断されずに維持されます。新しい接続に対して新しいルールが適用されます。ただし、一時的にルールがクリアされて再適用されるため、ごく短時間ですが通信に影響が出る可能性はゼロではありません。
注意: firewall-cmd --complete-reload
というコマンドもありますが、これはfirewalld
デーモン自体を完全に再起動します。--reload
よりも強力ですが、実行中の接続が全て切断される可能性があります。特別な理由がない限り、通常は--reload
を使用してください。
第3部:firewalldを使ったポート・サービスの開放と遮断
ここからは、最も頻繁に行う設定である、特定のサービスやポートの通信を許可・拒否する方法を具体的なコマンドと共に見ていきます。基本的な考え方は「必要な通信だけを許可する」です。
1. サービスの追加・削除(永続設定でSSHを許可する例)
サーバーにSSHで接続できるようにするには、通常、SSHサービス(TCP 22番ポート)を許可する必要があります。デフォルトのpublic
ゾーンではSSHが許可されていることが多いですが、他のゾーンを使う場合や、設定を確認・変更したい場合は以下のコマンドを使用します。
SSHサービス(ssh)をpublicゾーンで許可する:
“`bash
publicゾーンでSSHサービスを永続的に追加
sudo firewall-cmd –zone=public –add-service=ssh –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
解説:
--zone=public
: 設定を行うゾーンを指定します。--add-service=ssh
:ssh
という定義済みのサービスを追加します。--permanent
: この設定を永続化します。firewall-cmd --reload
: 永続設定で行った変更を、実行中のfirewalldに反映させます。
設定が正しく行われたか確認するには、--list-services
または--list-all
を使用します。
“`bash
publicゾーンで許可されているサービスを確認 (永続設定)
sudo firewall-cmd –zone=public –list-services –permanent
“`
出力にssh
が含まれていれば成功です。
重要な注意点: リモートからSSHで作業している場合、SSHサービスを誤って削除したり、SSHサービスが許可されていないゾーンをインターフェースに割り当てたりすると、サーバーへの接続を失ってしまう可能性があります。設定変更を行う際は、コンソールに直接アクセスできる状態で行うか、あるいはSSHポートを開けるコマンドとリロードコマンドをまとめて実行するシェルスクリプトを用意するなどの対策を検討してください。
SSHサービス(ssh)をpublicゾーンから削除する:
“`bash
publicゾーンからSSHサービスを永続的に削除
sudo firewall-cmd –zone=public –remove-service=ssh –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
2. ポートの追加・削除(永続設定でHTTP/HTTPSを許可する例)
Webサーバーを運用する場合、HTTP(TCP 80番)やHTTPS(TCP 443番)のポートを開放する必要があります。これらのポートは、http
やhttps
という定義済みサービスとして利用できますが、ここではポート番号を指定して開放する方法も示します。カスタムアプリケーションなど、定義済みサービスがないポートを開放する場合に役立ちます。
HTTP (TCP 80) ポートをpublicゾーンで許可する:
“`bash
publicゾーンでTCP 80番ポートを永続的に追加
sudo firewall-cmd –zone=public –add-port=80/tcp –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
HTTPS (TCP 443) ポートをpublicゾーンで許可する:
“`bash
publicゾーンでTCP 443番ポートを永続的に追加
sudo firewall-cmd –zone=public –add-port=443/tcp –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
解説:
--add-port=ポート番号/プロトコル
: 開放したいポート番号とプロトコル(tcpまたはudp)を指定します。- 複数ポートをまとめて指定することも可能です:
--add-port=80/tcp --add-port=443/tcp ...
設定が正しく行われたか確認するには、--list-ports
または--list-all
を使用します。
“`bash
publicゾーンで許可されているポートを確認 (永続設定)
sudo firewall-cmd –zone=public –list-ports –permanent
“`
出力に80/tcp
や443/tcp
が含まれていれば成功です。
HTTP (TCP 80) ポートをpublicゾーンから削除する:
“`bash
publicゾーンからTCP 80番ポートを永続的に削除
sudo firewall-cmd –zone=public –remove-port=80/tcp –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
3. ランタイム設定 vs 永続設定の使い分け
- 一時的にテストしたい場合:
sudo firewall-cmd --zone=public --add-service=ftp
(永続化オプションなし) のように実行します。この設定は、リロードや再起動で消えます。テストが完了したら、削除するか、永続化するかを決めます。 - 恒久的に設定したい場合:
sudo firewall-cmd --zone=public --add-service=http --permanent
のように実行し、その後必ずsudo firewall-cmd --reload
で反映させます。
現在のランタイム設定を永続化したい場合:
一時的な設定で問題がないことを確認した後で、永続化したい場合は以下のコマンドが便利です。
“`bash
現在のランタイム設定を永続設定として保存
sudo firewall-cmd –runtime-to-permanent
“`
このコマンドは、現在のランタイム設定(全てのゾーン、サービス、ポート、リッチルールなど)を/etc/firewalld/
以下の適切な設定ファイルに書き出します。
第4部:よくある設定例
実際のサーバー運用でよく encounter する設定例をいくつか紹介します。
例1:Webサーバー (HTTP/HTTPS) を公開する
サーバーでApacheやNginxなどのWebサーバーを動かしており、インターネットからアクセスできるようにしたい場合。
“`bash
publicゾーンでHTTP (TCP 80) サービスを許可 (定義済みサービス名を使用)
sudo firewall-cmd –zone=public –add-service=http –permanent
publicゾーンでHTTPS (TCP 443) サービスを許可 (定義済みサービス名を使用)
sudo firewall-cmd –zone=public –add-service=https –permanent
永続設定を反映
sudo firewall-cmd –reload
設定確認 (永続設定)
sudo firewall-cmd –zone=public –list-services –permanent
sudo firewall-cmd –zone=public –list-ports –permanent
“`
例2:FTPサーバーを公開する (Active/Passive mode考慮)
FTPはやや複雑で、制御コネクション(通常TCP 21)とデータコネクション(アクティブモードまたはパッシブモード)を使用します。firewalld
にはftp
サービスが定義されており、これを使うことでパッシブモードに必要なコネクショントラッキングも自動で設定されるため推奨されます。
“`bash
publicゾーンでFTPサービスを許可 (定義済みサービス名を使用)
sudo firewall-cmd –zone=public –add-service=ftp –permanent
永続設定を反映
sudo firewall-cmd –reload
設定確認 (永続設定)
sudo firewall-cmd –zone=public –list-services –permanent
“`
例3:特定のIPアドレスからのSSH接続のみを許可する
セキュリティを高めるため、特定のオフィスIPや自宅IPからのみSSH接続を許可したい場合。これはリッチルールを使います。
仮に、許可したいIPアドレスが 203.0.113.10
であるとします。
“`bash
publicゾーンで、送信元IP 203.0.113.10 からのSSH (TCP 22) 通信を許可するリッチルールを追加
sudo firewall-cmd –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”203.0.113.10″ service name=”ssh” accept’ –permanent
publicゾーンで、全てのIPからのSSH通信を拒否するリッチルールを追加 (許可ルールより優先順位が低いことを確認)
firewalldは通常、より具体的なルールやacceptルールを優先しますが、意図を明確にするために拒否ルールも追加することがあります。
または、デフォルトのサービスリストからsshを削除し、リッチルールでのみ許可する方がシンプルかもしれません。
ここでは、デフォルトサービスリストからsshを削除し、リッチルールで許可する方法を示します。
まず、デフォルトで許可されている可能性のあるsshサービスを削除
sudo firewall-cmd –zone=public –remove-service=ssh –permanent
特定IPからのSSH許可ルールを追加 (先ほど実行済み)
sudo firewall-cmd –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”203.0.113.10″ service name=”ssh” accept’ –permanent
永続設定を反映
sudo firewall-cmd –reload
設定確認 (永続設定)
sudo firewall-cmd –zone=public –list-all –permanent
“`
--list-all --permanent
の出力のrich rules:
の項目に、追加したルールが表示されているはずです。また、services:
の項目からssh
が消えていることを確認してください。
リッチルールの構文はやや複雑なので、ミスなく入力することが重要です。間違いやすい場合は、一度ランタイム設定(--permanent
なし)でテストしてから永続化すると良いでしょう。
POINT: リッチルールは、accept
やreject
/drop
などのアクションを指定できます。デフォルトでは、ゾーンに定義されていない通信は拒否されます(target: default
がdefault
の場合)。特定のIPからの通信をdrop
したい場合は、アクションをdrop
に変更します。
例:特定のIPアドレス 192.168.1.100
からの全ての通信を破棄する
“`bash
publicゾーンで、送信元IP 192.168.1.100 からの全ての通信を破棄するリッチルールを追加
sudo firewall-cmd –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.100″ drop’ –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
例4:特定のポート範囲を許可する
特定のアプリケーションが複数のポートを使用する場合など、ポート範囲を指定して許可することができます。
例:TCP 50000から51000までのポート範囲を許可する。
“`bash
publicゾーンでTCP 50000-51000番ポート範囲を永続的に追加
sudo firewall-cmd –zone=public –add-port=50000-51000/tcp –permanent
永続設定を反映
sudo firewall-cmd –reload
設定確認 (永続設定)
sudo firewall-cmd –zone=public –list-ports –permanent
“`
出力に50000-51000/tcp
が含まれていれば成功です。
例5:IPマスカレード(NAT)を有効にする
サーバーをルーターとして使用し、内部ネットワークのプライベートIPアドレスを持つマシンが、サーバーのグローバルIPアドレスを使ってインターネットにアクセスできるようにする(IPマスカレード、Source NAT)設定です。これは通常、external
ゾーンなどで設定されます。
仮に、外部に接続されたインターフェースがeth0
、内部ネットワークに接続されたインターフェースがeth1
で、eth0
がexternal
ゾーン、eth1
がinternal
ゾーンに割り当てられているとします。
“`bash
externalゾーンでIPマスカレードを有効化
sudo firewall-cmd –zone=external –add-masquerade –permanent
永続設定を反映
sudo firewall-cmd –reload
設定確認 (永続設定)
sudo firewall-cmd –zone=external –list-all –permanent
“`
出力のmasquerade:
がyes
になっていれば成功です。これに加えて、カーネルのIPフォワード設定(net.ipv4.ip_forward = 1
)も必要になります。
第5部:ゾーンの詳細と管理
firewalld
のゾーンは非常に強力な機能です。ここでは、ゾーンの管理についてもう少し詳しく見ていきます。
1. インターフェースとゾーンの関連付け
ネットワークインターフェース(例: eth0
)は、必ずどれかのゾーンに割り当てられています。デフォルトでは、ネットワーク設定(NetworkManagerなど)によって自動的に割り当てられることが多いですが、手動で変更することも可能です。
インターフェースがどのゾーンに割り当てられているか確認:
bash
sudo firewall-cmd --get-active-zones
または、特定のインターフェースがどのゾーンに割り当てられているか確認したい場合は、ip addr show
などでインターフェース名を確認し、firewall-cmd --get-zone-of-interface=インターフェース名
を使います。
“`bash
eth0がどのゾーンに割り当てられているか確認
sudo firewall-cmd –get-zone-of-interface=eth0
“`
インターフェースのゾーンを変更(ランタイムのみ):
“`bash
eth0をpublicゾーンからinternalゾーンに移動 (一時的)
sudo firewall-cmd –zone=internal –change-interface=eth0
“`
インターフェースのゾーンを変更(永続的に):
この設定は少し複雑で、設定ファイル(ifcfg-*
など)やNetworkManagerの設定で行うのが一般的ですが、firewall-cmd
でも可能です。
“`bash
eth0をpublicゾーンからinternalゾーンに永続的に移動
sudo firewall-cmd –zone=internal –change-interface=eth0 –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
注意: インターフェースのゾーンを変更すると、そのインターフェースを通る通信に適用されるルールが全く変わります。リモート接続中のインターフェースのゾーンを変更する場合は、SSHサービスが新しいゾーンで許可されているか、またはデフォルトゾーンが適切に設定されているかなどを慎重に確認しないと、接続が切れてしまうリスクがあります。
2. ゾーンの設定をコピーする
既存のゾーンの設定を別のゾーンにコピーして、それをベースにカスタマイズしたい場合などに便利です。
例:public
ゾーンの設定をコピーしてmyzone
という新しいゾーンを作成する(ゾーンの作成自体は自動で行われる)。
“`bash
publicゾーンの永続設定をmyzoneにコピー
sudo firewall-cmd –zone=public –copy-configuration=myzone –permanent
永続設定を反映
sudo firewall-cmd –reload
新しいゾーンの設定を確認
sudo firewall-cmd –zone=myzone –list-all –permanent
“`
3. ゾーンの削除
作成したカスタムゾーンを削除したい場合。
“`bash
myzoneゾーンを永続的に削除
sudo firewall-cmd –zone=myzone –delete-zone –permanent
永続設定を反映
sudo firewall-cmd –reload
“`
注意: インターフェースが割り当てられているゾーンは削除できません。まずインターフェースを別のゾーンに割り当てるか、インターフェースの割り当てを解除してから削除してください。
第6部:トラブルシューティングと確認事項
ファイアウォールを設定した後で「なぜか繋がらない」「設定したはずなのにブロックされる」といった問題が発生することはよくあります。トラブルシューティングの際に確認すべき点や役立つコマンドを紹介します。
1. firewalldサービスの状態確認
まず、firewalldサービスがそもそも起動しているか確認します。
bash
sudo systemctl status firewalld
active (running)
になっていない場合は、サービスを起動/有効化してください。
2. firewalld自体が有効か確認
サービスが起動していても、--state
コマンドで最終的な状態を確認します。
bash
sudo firewall-cmd --state
出力がrunning
であることを確認します。
3. 対象のインターフェースが正しいゾーンに割り当てられているか確認
通信がブロックされているインターフェースが、意図したゾーンに割り当てられているか確認します。
bash
sudo firewall-cmd --get-active-zones
もし間違ったゾーンに割り当てられていれば、そのゾーンの設定を確認するか、インターフェースを適切なゾーンに移動してください。
4. 設定したルール(サービスやポート)が有効なゾーンにあるか確認
対象のゾーンで、必要なサービスやポートが許可されているか確認します。ランタイム設定と永続設定の両方を確認しましょう。
“`bash
現在有効なランタイム設定を確認
sudo firewall-cmd –zone=対象ゾーン名 –list-all
永続設定を確認
sudo firewall-cmd –zone=対象ゾーン名 –list-all –permanent
“`
永続設定を変更したにも関わらずランタイム設定に反映されていない場合は、sudo firewall-cmd --reload
を実行してください。
5. リッチルールが意図せず通信をブロックしていないか確認
より詳細な制御のためにリッチルールを使っている場合、そのルールが特定の通信をブロックしている可能性があります。
bash
sudo firewall-cmd --zone=対象ゾーン名 --list-rich-rules
sudo firewall-cmd --zone=対象ゾーン名 --list-rich-rules --permanent
リッチルールはリストの上から順に評価されるため、意図しないブロックルールが必要な許可ルールの前に来ていないかなども確認します。
6. SELinuxの確認
CentOSでは、SELinuxもセキュリティ制御を行います。ファイアウォールでポートを許可しても、SELinuxがそのポートでの通信を許可していない場合、通信はブロックされます。
SELinuxがEnforcing
モードになっているか確認します。
bash
getenforce
SELinuxが原因で通信がブロックされている可能性があるか確認するには、監査ログを確認します。
bash
sudo ausearch -m avc -ts recent
大量に出力される場合は、特定のサービスのログを絞り込むこともできます。SELinuxのトラブルシューティングは別の専門知識が必要ですが、ファイアウォール設定で問題が解決しない場合の有力な原因候補として覚えておきましょう。一時的にSELinuxをPermissiveモードに変更して問題が解決するか確認する手もありますが、これはセキュリティレベルを下げるため、原因特定後にEnforcingに戻すことが重要です。
“`bash
SELinuxをPermissiveモードに変更 (一時的、再起動で元に戻る)
sudo setenforce 0
問題が解決したら、原因を特定して適切にSELinuxポリシーを設定するか、Enforcingに戻す
SELinuxをEnforcingモードに戻す
sudo setenforce 1
“`
7. アプリケーションが正しく起動しているか確認
ファイアウォール設定が正しくても、対象のサービスを提供するアプリケーション(Webサーバー、SSHデーモンなど)が起動していなければ、当然通信はできません。
bash
sudo systemctl status サービス名 # 例: sudo systemctl status httpd または sudo systemctl status sshd
アプリケーションが特定のポートで待ち受け(Listen)しているか確認します。
bash
sudo netstat -tulnp | grep ポート番号 # 例: sudo netstat -tulnp | grep 80
または、新しいss
コマンドも使えます。
bash
sudo ss -tulnp | grep ポート番号 # 例: sudo ss -tulnp | grep 80
LISTEN
状態になっていれば、アプリケーションはポートを開いています。
8. ネットワーク経路の確認 (ping
, traceroute
/mtr
)
クライアントからサーバーまでのネットワーク経路自体に問題がないか確認します。
“`bash
クライアント側からサーバーへ
ping サーバーのIPアドレスまたはホスト名
traceroute サーバーのIPアドレスまたはホスト名 # Linux/macOS
tracert サーバーのIPアドレスまたはホスト名 # Windows
経路上のパケットロスや遅延を詳細に調査 (Linux)
sudo mtr サーバーのIPアドレスまたはホスト名
“`
9. ポートスキャンの実行 (nmap
)
別のコンピューターから対象サーバーのポートがどのように見えているかを確認するために、ポートスキャンツールnmap
を使うことも有効です。
“`bash
クライアント側からサーバーへ (nmapコマンドがインストールされている必要があります)
nmap -sT -p 対象ポート サーバーのIPアドレスまたはホスト名 # TCPポートの場合
nmap -sU -p 対象ポート サーバーのIPアドレスまたはホスト名 # UDPポートの場合
nmap -sT -p 80,443,22 サーバーのIPアドレスまたはホスト名 # 複数ポートの場合
“`
nmap
の出力で、対象ポートがopen
またはfiltered
になっているか確認します。open
はファイアウォールが許可しており、アプリケーションが待ち受けている状態。filtered
はファイアウォールや経路上のデバイスによってブロックされている可能性を示します。closed
はファイアウォールは通過したが、アプリケーションが待ち受けていない状態です。
これらのステップを順に進めることで、問題の原因がファイアウォールにあるのか、それ以外の要素(アプリケーション、ネットワーク、SELinuxなど)にあるのかを切り分けることができます。
第7部:firewalldを無効にする(非推奨)
セキュリティ上の理由から強く非推奨ですが、特定の状況(例:閉じられたネットワーク内でのトラブルシューティング)で一時的にファイアウォールを完全に無効にしたい場合があります。
“`bash
firewalldサービスを停止
sudo systemctl stop firewalld
システム起動時に自動で起動しないように無効化
sudo systemctl disable firewalld
firewalldサービスの状態確認
sudo systemctl status firewalld
firewalldの状態確認
sudo firewall-cmd –state
“`
これによりファイアウォールは完全に停止し、全てのネットワーク通信が許可された状態になります(他のファイアウォールが動作していなければ)。
再度有効化する場合:
“`bash
firewalldサービスを有効化
sudo systemctl enable firewalld
firewalldサービスを起動
sudo systemctl start firewalld
firewalldサービスの状態確認
sudo systemctl status firewalld
“`
重要: ファイアウォールを無効にしたままサーバーをインターネットに接続することは、非常に危険です。必ず必要なときだけ無効にし、速やかに有効に戻してください。
第8部:セキュリティベストプラクティスとまとめ
ファイアウォール設定におけるいくつかのベストプラクティスです。
- 最小権限の原則: サーバーの役割に必要なサービス/ポートだけを許可し、それ以外は全てデフォルトで拒否するように設定します。
firewalld
のデフォルト設定は「全て拒否、明示的に許可したものだけ通す」という思想に基づいているため、この原則に沿っています。 - 信頼度の低いゾーンの利用: インターネットに直接接続されるインターフェースは、
public
やexternal
など、最も信頼度の低いゾーンに割り当て、厳格なルールを適用します。 - 定義済みサービスの利用: 可能な場合は、ポート番号を直接指定するよりも、定義済みのサービス名(
ssh
,http
,https
など)を使用します。設定が分かりやすくなり、firewalldの内部的な最適化や関連設定(Helperなど)の恩恵を受けられる場合があります。 - 永続設定の利用とリロード忘れに注意: 運用サーバーでの設定変更は必ず
--permanent
オプションを付けて行い、その後のfirewall-cmd --reload
を忘れないようにしましょう。 - リモートからの作業に注意: SSH接続経由でファイアウォール設定を変更する場合、誤った設定で自身を締め出さないように十分に注意が必要です。変更前に設定をバックアップしたり、別のポートでSSHを有効にしておいたり、直接コンソールにアクセスできる状態を確保するなどの対策を検討しましょう。
- 定期的な設定の見直し: サーバーの役割や公開サービスが変わった場合は、ファイアウォール設定も見直して、不要なポートが開いていないか、必要なポートが閉じられていないか確認しましょう。
- ログの監視: firewalldがパケットを拒否または破棄した際にログを記録するように設定し、不審なアクセス試行がないか監視することで、攻撃の兆候を早期に発見できます。ログは通常、
journalctl -u firewalld
や/var/log/messages
などで確認できます。
まとめ
このガイドでは、CentOSにおけるfirewalld
の基本的な概念、主要なコマンド、そして一般的な設定例とトラブルシューティングについて詳細に解説しました。
firewalld
の主な概念は以下の通りです。
- サービス: ポートとプロトコルの組み合わせに名前を付けたもの。
- ポート: 特定のポート番号とプロトコル(TCP/UDP)を直接指定する方法。
- ゾーン: ネットワークインターフェースを信頼度レベルで分類し、それぞれに異なるルールセットを適用する仕組み。
- リッチルール: より詳細な条件に基づいたフィルタリングルール。
- ランタイム vs 永続設定: 現在有効な設定(一時的)と、システム再起動後も保持される設定。
これらの概念を理解し、firewall-cmd
コマンドを適切に使うことで、CentOSサーバーのファイアウォールを効果的に管理し、セキュリティを強化することができます。
サーバーの安全な運用は、ファイアウォール設定から始まります。このガイドが、CentOS初心者の皆様にとって、firewalldを使ったセキュリティ設定の第一歩を踏み出す助けとなれば幸いです。実際にコマンドを入力し、設定の追加・削除・確認を繰り返して慣れていくことが、理解を深める一番の近道です。
より高度な設定(ポートフォワーディング、IPセット、ダイレクトルールなど)については、firewalldの公式ドキュメントや他の専門的な資料を参照してください。しかし、まずはこのガイドで解説した基本的なサービス/ポートの許可とゾーンの概念をマスターすることが重要です。
サーバーセキュリティは継続的な取り組みです。常に最新の情報を把握し、サーバーの状況に応じた適切な設定を行うように心がけましょう。
この詳細なガイドが、CentOSのファイアウォール設定を学ぶ上で役立つことを願っています。約5000語の要件に合わせて、各概念、コマンド、例、トラブルシューティングのステップをできる限り詳細に、初心者向けに解説しました。