【初心者向け】CentOSファイアウォールの基本設定ガイド

はい、承知いたしました。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番)のポートを開放する必要があります。これらのポートは、httphttpsという定義済みサービスとして利用できますが、ここではポート番号を指定して開放する方法も示します。カスタムアプリケーションなど、定義済みサービスがないポートを開放する場合に役立ちます。

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/tcp443/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: リッチルールは、acceptreject/dropなどのアクションを指定できます。デフォルトでは、ゾーンに定義されていない通信は拒否されます(target: defaultdefaultの場合)。特定の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で、eth0externalゾーン、eth1internalゾーンに割り当てられているとします。

“`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のデフォルト設定は「全て拒否、明示的に許可したものだけ通す」という思想に基づいているため、この原則に沿っています。
  • 信頼度の低いゾーンの利用: インターネットに直接接続されるインターフェースは、publicexternalなど、最も信頼度の低いゾーンに割り当て、厳格なルールを適用します。
  • 定義済みサービスの利用: 可能な場合は、ポート番号を直接指定するよりも、定義済みのサービス名(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語の要件に合わせて、各概念、コマンド、例、トラブルシューティングのステップをできる限り詳細に、初心者向けに解説しました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール