CentOS ファイアウォールの設定・状態を確認するコマンドまとめ


CentOS ファイアウォールの設定・状態を確認するコマンドまとめ ~詳細解説~

はじめに:なぜファイアウォールの状態確認が重要なのか

インターネットに接続されたサーバーにとって、ファイアウォールは最も基本的なセキュリティ対策の一つです。不要な通信を遮断し、許可された通信のみを通過させることで、不正アクセスや攻撃からシステムを保護します。

CentOSにおいて、主要なファイアウォール管理システムはバージョンによって異なります。

  • CentOS 7以降(CentOS Stream含む): デフォルトは firewalld です。これは動的なファイアウォール管理ツールで、サービス名やゾーンという抽象的な概念を用いてルールを管理します。
  • CentOS 6以前: デフォルトは iptables または ipchains (さらに古い) でした。iptables は低レベルで詳細なパケットフィルタリングルールを直接設定するツールです。

システム管理者は、これらのファイアウォールが意図した通りに機能しているか、必要なサービスへの通信が許可されているか、あるいは予期しないポートが開いていないかなどを常に把握しておく必要があります。そのために、ファイアウォールの設定や状態を確認するためのコマンドは不可欠です。

本記事では、CentOSで広く使われている firewalld および、依然として多くの環境や特定の用途で利用される iptables の、設定・状態確認に役立つ主要なコマンド群を詳細に解説します。単にコマンドとその機能だけでなく、それぞれのコマンドの出力結果が何を意味するのか、どのような状況で使うのかといった実践的な情報も含め、包括的に説明します。

この記事を読むことで、あなたはCentOSシステムにおけるファイアウォールの「今」の状態を正確に把握し、セキュリティ問題の発見やトラブルシューティングに役立てることができるようになります。

Section 1: firewalld の状態確認コマンド (CentOS 7/8/Stream デフォルト)

firewalldiptables をバックエンドとして(最近のバージョンでは nftables も選択可能)動作しますが、直接 iptables コマンドを操作するのではなく、firewall-cmd というコマンドラインツールを使って管理するのが一般的です。firewalld は「ゾーン」という概念を中心に設定を管理するため、iptables とは考え方が大きく異なります。

firewalld の設定は、実行中の設定(runtime configuration)と、再起動後も維持される恒久的な設定(permanent configuration)に分かれています。状態確認の際には、どちらの設定を見ているのかを意識することが重要です。デフォルトでは --runtime が適用されますが、多くの確認コマンドでは --permanent オプションを付けて恒久設定を確認することが多いでしょう。

1.1 firewalld サービスの全体的な状態を確認する

システム上で firewalld デーモンが実行されているかどうかを確認します。

コマンド:
bash
sudo systemctl status firewalld

説明:
systemctl は systemd のサービス管理コマンドです。status firewalldfirewalld.service の現在の状態を表示します。

出力例と読み方:
“`
● firewalld.service – firewalld – Dynamic Firewall Daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-10-27 10:00:00 JST; 1 day ago
Docs: man:firewalld(1)
Main PID: 1234 (firewalld)
Tasks: 2 (limit: 4915)
Memory: 35.0M
CPU: 1.500s
CGroup: /system.slice/firewalld.service
└─1234 /usr/libexec/firewalld –nofork

Oct 27 10:00:00 hostname systemd[1]: Starting firewalld – Dynamic Firewall Daemon…
Oct 27 10:00:01 hostname systemd[1]: Started firewalld – Dynamic Firewall Daemon.

``
*
Loaded: サービスのユニットファイルが読み込まれているか (enabledはシステム起動時に自動起動する設定になっていることを示す)。
*
Active: サービスの状態。active (running)であれば、ファイアウォールデーモンが正常に動作しています。inactive (dead)failedの場合は、動作していません。
*
since: サービスが起動してからの時間。
*
Main PID: デーモンのプロセスID。
*
CGroup`: プロセスが属するcgroup。
* 最後のログメッセージ:サービスの起動や状態変化に関する最近のログエントリ。

確認のポイント:
* Active: active (running) であること。
* Loaded: ...; enabled; ... であれば、システム起動時に自動的にファイアウォールが有効になる設定です。

1.2 firewalld が動作しているか(簡易確認)

systemctl よりシンプルに、firewalld がアクティブな状態かだけを確認します。

コマンド:
bash
sudo firewall-cmd --state

説明:
firewall-cmd は firewalld デーモンと通信して設定の取得や変更を行うコマンドです。--state オプションはデーモンの現在の状態(running/not running)を返します。

出力例:
bash
running

または
bash
not running

確認のポイント:
* running と表示されれば、firewalld デーモンは動作中です。

1.3 firewalld のバージョンを確認する

トラブルシューティングや機能の互換性を確認する際に役立ちます。

コマンド:
bash
sudo firewall-cmd --version

説明:
firewalld のバージョン番号を表示します。

出力例:
bash
0.6.3

1.4 現在アクティブなゾーンを確認する

firewalld は、ネットワークインターフェースやソースIPアドレスに基づいて、トラフィックを特定の「ゾーン」に分類します。各ゾーンには独自のルールセット(許可されるサービス、ポートなど)が関連付けられています。このコマンドは、どのゾーンが現在使用されており、どのインターフェースやソースがどのゾーンに割り当てられているかを表示します。

コマンド:
bash
sudo firewall-cmd --get-active-zones

説明:
現在トラフィックが通過しており、かつ特定のゾーンに割り当てられているインターフェースとそのゾーンの関連付けを表示します。

出力例と読み方:
bash
public
interfaces: eth0 eth1
internal
sources: 192.168.1.0/24

* この例では、「public」ゾーンがアクティブで、インターフェース eth0eth1 がこのゾーンに割り当てられています。
* 「internal」ゾーンもアクティブで、ソースIPアドレス 192.168.1.0/24 からのトラフィックがこのゾーンに割り当てられています。

確認のポイント:
* システムが接続されているネットワークインターフェース(例: eth0, ens192 など)がどのゾーンに割り当てられているかを確認します。これは、そのインターフェースを通過するトラフィックにどのゾーンのルールが適用されるかを意味します。

1.5 定義されている全てのゾーンを確認する

システムに定義されている全てのゾーンの名前をリストします。

コマンド:
bash
sudo firewall-cmd --get-zones

説明:
firewalld にデフォルトで用意されている、またはカスタムで追加された全てのゾーン名を表示します。

出力例:
bash
block dmz drop external home internal public trusted work

確認のポイント:
* どのようなゾーンが利用可能なのかを知ることができます。それぞれのゾーンはデフォルトで異なるセキュリティレベルや用途を想定しています(例: public は外部向け、trusted は全ての通信を許可、drop は全ての通信を破棄)。

1.6 特定のゾーンの詳細な設定(実行中)を確認する

特定のゾーンに設定されている全てのルール(サービス、ポート、masquerade、フォワードポート、リッチルール、ダイレクトルールなど)をリストします。これは、そのゾーンを通過するトラフィックに対して具体的にどのような許可/拒否ルールが適用されているかを知るための最も重要なコマンドの一つです。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-all

<zone_name> には確認したいゾーン名(例: public, internal, trusted など)を指定します。ゾーン名を省略すると、デフォルトゾーン(後述の --get-default-zone で確認可能)の設定が表示されます。

説明:
指定したゾーンの「実行中」の設定詳細を一覧表示します。

出力例と読み方 (例: public ゾーン):
bash
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1 # <-- このゾーンに割り当てられているインターフェース (activeな場合)
sources: # <-- このゾーンに割り当てられているソースIPアドレス/ネットワーク
services: ssh dhcpv6-client # <-- 許可されているサービス
ports: 80/tcp 443/tcp # <-- 許可されているポートとプロトコル
protocols: # <-- 許可されているプロトコル (例: vrrp)
masquerade: no # <-- IPマスカレード (NAT) が有効か
forward-ports: # <-- ポートフォワーディング設定
source-ports: # <-- 許可されているソースポート
icmp-block: # <-- ブロックされているICMPタイプ
rich-rules: # <-- より詳細なルール (rich rules)
forward: yes # <-- フォワーディングが許可されているか
direct: # <-- ダイレクトルール (iptables書式)

* public (active): ゾーン名と、現在アクティブであるかどうかが表示されます。
* target: このゾーンに合致したトラフィックのデフォルトの振る舞い (default は通常、明示的に許可されていないものは拒否)。
* interfaces, sources: このゾーンに現在割り当てられているインターフェースやソースIP。
* services: firewalld に事前定義されたサービス名(例: ssh, http, https)。これらのサービスに関連付けられたポートやプロトコルが自動的に許可されます。
* ports: 明示的に許可されているポート番号とプロトコル(例: 80/tcp, 443/tcp)。
* masquerade: サーバーがルーターのように振る舞い、内部ネットワークからの発信元IPアドレスをサーバーの外部IPアドレスに変換する設定です。
* forward-ports: 特定のポートへの通信を別のポートやIPアドレスに転送する設定です。
* rich-rules: より複雑な条件(送信元/宛先IP、ポート範囲、レート制限など)を指定できる詳細なルールです。
* direct: iptables コマンドに近い書式で低レベルなルールを直接追加する機能です。これはfirewalldの抽象化レイヤーをバイパスするため、注意して使用する必要があります。

確認のポイント:
* 目的のサービス/ポートが services または ports に含まれているか? これが最も一般的な確認点です。
* 不要なサービス/ポートが許可されていないか?
* masqueradeforward-ports が意図せず有効になっていないか?
* 複雑なルールが rich-rulesdirect に定義されていないか?

1.7 全てのゾーンの詳細な設定(実行中)を確認する

全ての定義済みゾーンの実行中の設定を一度に表示します。出力が長くなる可能性があります。

コマンド:
bash
sudo firewall-cmd --list-all-zones

説明:
--zone=<zone_name> --list-all を全てのゾーンに対して実行した結果を連結したものです。

確認のポイント:
* システムの全てのゾーン設定を俯瞰したい場合に便利ですが、特定のゾーンの設定を確認したい場合は --zone=<zone_name> --list-all の方が効率的です。

1.8 特定のゾーンの詳細な設定(恒久的)を確認する

上記 --list-all は実行中の設定を表示しますが、再起動後も維持される恒久的な設定を確認するには --permanent オプションが必要です。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-all --permanent

ゾーン名を省略すると、デフォルトゾーンの恒久的設定が表示されます。

説明:
指定したゾーンの /etc/firewalld/zones/ ディレクトリ以下の設定ファイル(またはデフォルト設定)に基づいた、恒久的な設定を一覧表示します。

確認のポイント:
* 再起動後にファイアウォール設定がどのようにロードされるかを確認できます。
* 新しいルールを追加したり、既存のルールを変更した後に --reload やシステム再起動を行う前に、その変更が正しく恒久設定に保存されているかを確認するために使用します。

1.9 全てのゾーンの詳細な設定(恒久的)を確認する

全てのゾーンの恒久的な設定を一度に表示します。

コマンド:
bash
sudo firewall-cmd --list-all-zones --permanent

説明:
全てのゾーンの恒久設定ファイルを読み込み、その内容を一覧表示します。

1.10 デフォルトゾーンを確認する

特定のインターフェースやソースに明示的にゾーンが割り当てられていない場合に使用されるデフォルトゾーンを確認します。

コマンド:
bash
sudo firewall-cmd --get-default-zone

説明:
現在デフォルトとして設定されているゾーンの名前を表示します。

出力例:
bash
public

確認のポイント:
* システムに接続された新しいインターフェースが自動的にどのゾーンに分類されるかを知ることができます。

1.11 ゾーンに割り当てられているインターフェースを確認する

特定のゾーンに現在割り当てられているネットワークインターフェースをリストします。これは --list-all の出力に含まれる情報ですが、インターフェースだけを素早く確認したい場合に便利です。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-interfaces

説明:
指定したゾーンに割り当てられているインターフェース(実行中)をリストします。

出力例:
bash
eth0 eth1

1.12 インターフェースが割り当てられているゾーンを確認する

特定のネットワークインターフェースがどのゾーンに割り当てられているかを確認します。

コマンド:
bash
sudo firewall-cmd --get-zone-of-interface=<interface_name>

<interface_name> には確認したいインターフェース名(例: eth0, ens192)を指定します。

説明:
指定したインターフェースが現在属しているゾーン名を表示します。

出力例:
bash
public

1.13 ゾーンに割り当てられているソースを確認する

特定のゾーンに現在割り当てられているソースIPアドレスやネットワークをリストします。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-sources

説明:
指定したゾーンに割り当てられているソースIP/ネットワーク(実行中)をリストします。

出力例:
bash
192.168.1.0/24

1.14 定義済みのサービス一覧を確認する

firewalld では、SSH, HTTP, HTTPSなどの一般的なサービスに対して、必要なポートやプロトコルが定義された「サービス」がプリセットされています。これらのサービス名を確認できます。

コマンド:
bash
sudo firewall-cmd --get-services

説明:
firewalld にデフォルトで含まれている、またはカスタムで追加された全てのサービス名をアルファベット順にリストします。

出力例:
bash
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apache ajp bacula bacula-client bgp dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipps ipsec iscsi iscsi-target jenkins kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd mqtt mqtts ms-rpc ms-sql mysql nfs ni-divert ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio rpc-bind rsh rsyncd samba samba-client sddp-multicast sip sips smtp smtps snmp snmptrap spideroak-lansync ssh steam-streaming syslog syslog-tls telnet tftp tftp-client tide timeserver tlsv1.0 tlsv1.1 tlsv1.2 varnish vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-trapper

確認のポイント:
* --add-service コマンドなどで指定できるサービス名のリストです。

1.15 特定のゾーンで許可されているサービスを確認する

特定のゾーンで、どのプリセットサービスが許可されているかを確認します。これも --list-all の出力に含まれる情報ですが、サービスだけを素早く確認したい場合に便利です。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-services

説明:
指定したゾーンで許可されているサービス名(実行中)をリストします。

出力例:
bash
ssh dhcpv6-client

1.16 特定のゾーンで特定のサービスが許可されているか確認する

特定のサービスが特定のゾーンで許可されているかを YES/NO で確認します。スクリプトなどでの判定に便利です。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --query-service=<service_name>

<service_name> には確認したいサービス名(例: ssh, http)を指定します。

説明:
指定したゾーンの実行中の設定で、指定したサービスが有効になっていれば yes、無効になっていれば no を返します。

出力例:
bash
yes

または
bash
no

1.17 特定のゾーンで許可されているポートを確認する

特定のゾーンで、どのポートとプロトコルの組み合わせが許可されているかを確認します。これも --list-all の出力に含まれる情報ですが、ポートだけを素早く確認したい場合に便利です。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-ports

説明:
指定したゾーンで許可されているポートとプロトコルの組み合わせ(実行中)をリストします。

出力例:
bash
80/tcp 443/tcp

1.18 特定のゾーンで特定のポートが許可されているか確認する

特定のポート番号とプロトコルが特定のゾーンで許可されているかを YES/NO で確認します。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --query-port=<port_number/protocol>

例: sudo firewall-cmd --zone=public --query-port=80/tcp

説明:
指定したゾーンの実行中の設定で、指定したポート/プロトコルが有効になっていれば yes、無効になっていれば no を返します。

出力例:
bash
yes

または
bash
no

1.19 特定のゾーンで許可されているプロトコルを確認する

特定のゾーンで、どのプロトコル(例: vrrp, igmp)が許可されているかを確認します。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-protocols

説明:
指定したゾーンで許可されているプロトコル(実行中)をリストします。

1.20 特定のゾーンで特定のプロトコルが許可されているか確認する

特定のプロトコルが特定のゾーンで許可されているかを YES/NO で確認します。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --query-protocol=<protocol_name>

例: sudo firewall-cmd --zone=public --query-protocol=vrrp

1.21 特定のゾーンでIPマスカレードが有効か確認する

指定したゾーンでIPマスカレード(NAT)が有効になっているかを確認します。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --query-masquerade

説明:
指定したゾーンの実行中の設定で、IPマスカレードが有効になっていれば yes、無効になっていれば no を返します。

出力例:
bash
yes

または
bash
no

1.22 特定のゾーンでフォワードポート設定を確認する

指定したゾーンで設定されているポートフォワーディングルールを確認します。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-forward-ports

説明:
指定したゾーンの実行中の設定で、設定されているポートフォワードルールをリストします。

出力例:
bash
port=22:proto=tcp:toport=2222:toaddr=192.168.1.100

この例は、このゾーン宛てのTCP 22番ポートへの通信を、IPアドレス 192.168.1.100 のTCP 2222番ポートに転送する設定を示します。

1.23 特定のゾーンでICMPブロック設定を確認する

指定したゾーンでブロックされているICMPタイプを確認します。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-icmp-blocks

説明:
指定したゾーンの実行中の設定で、ブロックされているICMPタイプ(例: echo-request)をリストします。

出力例:
bash
echo-request

1.24 特定のゾーンのリッチルールを確認する

指定したゾーンで設定されているリッチルールを確認します。リッチルールは、サービスやポート設定よりも詳細で柔軟な条件を指定できるルールです。

コマンド:
bash
sudo firewall-cmd --zone=<zone_name> --list-rich-rules

説明:
指定したゾーンの実行中の設定で、設定されているリッチルールをリストします。

出力例:
bash
rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept
rule family="ipv4" source address="10.0.0.0/8" reject

* 1行目: IPv4トラフィックで、送信元が192.168.1.0/24 かつ 宛先ポートが3306/tcp であれば許可。
* 2行目: IPv4トラフィックで、送信元が10.0.0.0/8 であれば拒否。

確認のポイント:
* より複雑な許可/拒否ルールが設定されている可能性があるため、念入りに確認する必要があります。

1.25 ダイレクトルールを確認する

ダイレクトルールは、firewalldのゾーンやサービスの抽象化をバイパスし、低レベルな iptables 書式で直接ルールを追加する機能です。特定の高度な設定や、firewalldが提供しない細かい制御が必要な場合に使用されますが、ゾーンやサービスとの整合性が取りにくくなるため、注意が必要です。

コマンド:
bash
sudo firewall-cmd --direct --get-all-rules

説明:
設定されている全てのダイレクトルール(実行中)をリストします。出力は iptables コマンドの引数のような形式になります。

出力例:
bash
ipv4 filter IN_public_allow 0 -p tcp -m tcp --dport 5432 -j ACCEPT
ipv4 filter INPUT 0 -s 172.16.0.0/12 -j ACCEPT

* 1行目: IPv4フィルタテーブルの IN_public_allow チェーンの先頭に、TCP 5432ポートへの通信を許可するルールを追加。
* 2行目: IPv4フィルタテーブルの INPUT チェーンの先頭に、ソースが172.16.0.0/12からの通信を許可するルールを追加。

確認のポイント:
* もしこの出力に何か表示されている場合、標準的なゾーン/サービス設定だけでなく、低レベルなルールも考慮する必要があります。

1.26 恒久的設定の確認に関する注意点

firewall-cmd--permanent オプションを付けて確認した設定は、/etc/firewalld/ ディレクトリ以下の設定ファイルの内容を反映しています。しかし、この設定は firewall-cmd --reload コマンドを実行するか、firewalld サービスを再起動するまで、実行中の設定には反映されません。

新しいルールを追加・変更した場合:
1. firewall-cmd --zone=... --add-service=... --permanent のように --permanent を付けて恒久設定に追加/変更します。
2. 変更が正しく保存されたか、firewall-cmd --zone=... --list-all --permanent で確認します。
3. firewall-cmd --reload を実行して、恒久設定を実行中の設定に反映させます。
4. 最後に firewall-cmd --zone=... --list-all (reload後はpermanent不要) で、実行中の設定に反映されたことを確認します。

これらのコマンドを使い分けることで、意図した設定が正しく恒久的に保存され、かつシステムに現在適用されているかを確実に確認できます。

1.27 firewalld の設定ファイルの場所

恒久的な設定は通常以下のディレクトリに保存されます。コマンドだけでなく、直接ファイルを確認することもできますが、通常は firewall-cmd を使うのが推奨されます。

  • /etc/firewalld/: カスタム設定ファイル(ゾーン、サービス、ICMPタイプなど)。
  • /usr/lib/firewalld/: デフォルト設定ファイル(ゾーン、サービス、ICMPタイプなど)。/etc/firewalld/ に同じ名前のファイルが存在する場合、/etc/ のファイルが優先されます。

ゾーンの設定ファイルは /etc/firewalld/zones//usr/lib/firewalld/zones/ にあります(例: public.xml)。

Section 2: iptables の状態確認コマンド (CentOS 6以前、または firewalld の direct rule 使用時)

iptables は Linux カーネルの Netfilter フレームワークを操作するためのコマンドラインユーティリティです。firewalld が抽象化されたインターフェースを提供するのに対し、iptables はより低レベルで、パケットがネットワークスタックを通過する際の様々な段階(チェーン)で、詳細な条件に基づいてパケットを処理(ターゲット)するルールを設定します。

firewalld がデフォルトのCentOS 7/8/Stream環境でも、firewalld の Direct Rule 機能や、直接 iptables/nftables を操作するような状況では、iptables の知識とコマンドが必要になる場合があります。

iptables の設定はデフォルトでは実行時のみ有効であり、システム再起動によって失われます。これを永続化するには、別途設定を保存・復元する仕組みが必要です(例: iptables-services パッケージ)。

2.1 iptables サービスの全体的な状態を確認する (iptables-services 使用時)

CentOS 6 または CentOS 7/8 で iptables-services パッケージをインストールして firewalld を無効にし、iptables をサービスとして管理している場合に使用します。

コマンド:
bash
sudo systemctl status iptables

説明:
systemd が iptables サービス(iptables.service)を管理している場合、その状態を表示します。

出力例:
firewalld の systemctl status コマンドと同様の形式で出力されます。Active: active (exited) のような状態であることが多いです。これは、iptables サービスは起動時に設定ファイルを読み込んでルールを適用し、その後は終了する(デーモンとして常駐しない)ためです。重要なのは、サービスがエラーなく起動したか(設定が適用されたか)です。

確認のポイント:
* サービスが active な状態であること。
* エラーメッセージが出ていないこと。

2.2 現在有効な iptables ルールをリストする (最も重要)

現在カーネルの Netfilter にロードされている全ての iptables ルールをリストします。これは iptables を使う上で最も基本的な確認コマンドです。

コマンド:
bash
sudo iptables -L

説明:
filter テーブル(デフォルト)の全ての組み込みチェーン(INPUT, FORWARD, OUTPUT)およびユーザー定義チェーンのルールをリストします。

出力例と読み方:
“`bash
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp — anywhere anywhere
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:ssh
REJECT rej — anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT rej — anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
``
*
Chain INPUT (policy ACCEPT): INPUT チェーンの名前とデフォルトポリシー(このチェーンのどのルールにもマッチしなかったパケットの扱い - ACCEPT/DROP/REJECT)。ここでは、デフォルトでは許可する設定になっています(ただし、通常は INPUT チェーンの *前* に DROP/REJECT ルールが追加されているか、最終的に REJECT ルールで終了します)。
*
target: ルールにマッチしたパケットに対して実行されるアクション(ACCEPT, DROP, REJECT, LOG, または別のチェーンへのジャンプ)。
*
ACCEPT: パケットを通過させる。
*
DROP: パケットを静かに破棄し、送信元に何も通知しない。
*
REJECT: パケットを破棄し、送信元にエラーメッセージ(通常はICMPホスト禁止や到達不能)を返す。
*
LOG: パケットに関する情報をシステムログに出力する。
* 別のチェーン名: そのチェーンに処理を移す。
*
prot: プロトコル(tcp, udp, icmp, all など)。
*
opt: オプション(通常は)。
*
source: 送信元IPアドレスまたはネットワーク (anywhereは 0.0.0.0/0 を意味)。
*
destination: 宛先IPアドレスまたはネットワーク (anywhereは 0.0.0.0/0 を意味)。
* 最後の列: マッチ条件の詳細(例:
state RELATED,ESTABLISHEDは既存のコネクションに関連するパケット、tcp dpt:ssh` はTCPのSSHポートへの通信)。

よくある確認のポイント:
* INPUT チェーンに、目的のサービス(SSH: tcp/22, HTTP: tcp/80, HTTPS: tcp/443 など)を許可するルールがあるか?
* 許可ルールよりも前に、広範囲を拒否するルール(例: DROP all -- anywhere anywhere)がないか? もしあれば、許可ルールはその拒否ルールよりも に(リストの早い行に)記述されている必要がある。ルールは上から順に評価されるため。
* INPUT チェーンの最後や、特に指定のない場合のデフォルトポリシーが DROP または REJECT になっていて、明示的に許可された通信以外はブロックする設定になっているか? (良いセキュリティプラクティス)
* FORWARD チェーンは、このサーバーがルーターとしてパケットを転送する場合に関係します。通常、サーバー自身への通信(INPUT)とサーバーからの発信(OUTPUT)だけを扱う場合はあまり関係ありません。

2.3 iptables ルールを詳細情報付きでリストする

パケットカウンタやバイトカウンタを含め、より詳細な情報を表示します。

コマンド:
bash
sudo iptables -nvL

説明:
n: ホスト名やサービス名に変換せず、IPアドレスやポート番号のまま表示する(変換による遅延を防ぎ、正確な番号を確認できる)。
v: 詳細表示(インターフェース、フラグ、パケット/バイトカウンタなど)。
L: ルールをリストする。

出力例と読み方:
“`bash
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
123 12345 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
5 300 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0
50 3000 ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 REJECT rej — * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT rej — * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
``
*
pkts,bytes: そのルールにマッチしたパケット数と合計バイト数。これにより、どのルールが頻繁にヒットしているか、あるいは全くヒットしていないかを確認できます。トラブルシューティングに非常に役立ちます。
*
in,out: パケットが通過した入力/出力インターフェース(*は任意のインターフェース)。
* チェーンのヘッダーの
policy ACCEPT 0 packets, 0 bytes`: デフォルトポリシーにマッチしたパケット数とバイト数。

確認のポイント:
* パケットカウンタ: 目的の通信(例: SSH接続試行)がどのルールにマッチしているかを確認します。特定の許可ルールにパケットカウンタが増えていれば、そのルールが機能しています。意図せずDROP/REJECTルールにパケットがカウントされている場合は、そのルールが通信をブロックしていることを意味します。
* どのインターフェース経由の通信がルールにマッチしているか。

2.4 iptables ルールを行番号付きでリストする

ルールをリストする際に、各行に番号を付けます。これは、後で特定のルールを削除したり挿入したりする際に、どのルールを指しているのかを明確にするために非常に重要です。

コマンド:
bash
sudo iptables -nvL --line-numbers

説明:
--line-numbers オプションは、各ルールの行番号を表示します。

出力例:
“`bash
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 123 12345 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 5 300 ACCEPT icmp — * * 0.0.0.0/0 0.0.0.0/0
3 50 3000 ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
4 0 0 REJECT rej — * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT rej — * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
``
*
num`: チェーン内でのルールの順番を示す行番号。

確認のポイント:
* トラブルシューティングで特定のルールを見つけ、「このルールの設定はどうなっているんだ?」となったときに、この行番号を控えておくと、後で削除や編集をする際に役立ちます。

2.5 特定のチェーンのルールをリストする

全てのチェーンではなく、特定のチェーン(例: INPUT, FORWARD, OUTPUT)のルールのみをリストします。

コマンド:
bash
sudo iptables -L <chain_name>

または詳細情報付きで
bash
sudo iptables -nvL <chain_name>
sudo iptables -nvL <chain_name> --line-numbers

例: sudo iptables -nvL INPUT

説明:
指定したチェーンのルールをリストします。

確認のポイント:
* 通常、サーバー自身への通信は INPUT チェーン、サーバーから外部への通信は OUTPUT チェーン、サーバーを経由する通信は FORWARD チェーンを見ます。確認したいパケットの方向に応じて使い分けます。

2.6 特定のテーブルのルールをリストする

iptables には複数のテーブル(filter, nat, mangle, raw)があります。デフォルトは filter ですが、NAT(ネットワークアドレス変換)やパケットの書き換えルールを確認したい場合は、他のテーブルを指定する必要があります。

コマンド:
bash
sudo iptables -t <table> -L

または詳細情報付きで
bash
sudo iptables -t <table> -nvL
sudo iptables -t <table> -nvL --line-numbers

例: sudo iptables -t nat -nvL

説明:
指定したテーブルの全てのチェーンとルールをリストします。

よく使うテーブル:
* filter (デフォルト): パケットをフィルタリング(通過/破棄)するためのテーブル。
* nat: ネットワークアドレス変換(送信元/宛先IPアドレスやポートの変換)を行うためのテーブル。通常、PREROUTING, POSTROUTING, OUTPUT チェーンで使用されます。
* mangle: パケットヘッダーの特定のフィールドを変更するためのテーブル(例: TTL値の変更)。
* raw: 接続追跡(connection tracking)の対象とするかどうかを決定するためのテーブル。

確認のポイント:
* IPマスカレードやポートフォワーディングが設定されているか確認したい場合は、-t nat を指定して PREROUTING (宛先NAT) や POSTROUTING (送信元NAT – マスカレード含む) チェーンを確認します。

2.7 現在の iptables 設定を保存する (永続化)

実行中の iptables ルールは、デフォルトではシステム再起動時に失われます。現在のルールを永続化するには、ファイルに保存しておく必要があります。

コマンド (iptables-services パッケージ使用時):
bash
sudo service iptables save

説明:
iptables-services パッケージが提供するサービススクリプトは、現在の filter, nat, mangle, raw テーブルのルールを /etc/sysconfig/iptables ファイル(および /etc/sysconfig/iptables-nat, など、設定による)に保存します。システム起動時にこのファイルが読み込まれてルールが復元されます。

コマンド (手動保存):
bash
sudo iptables-save > /etc/sysconfig/iptables

説明:
iptables-save コマンドは、現在カーネルにロードされている iptables ルールを、iptables-restore が読み込める形式で標準出力に出力します。これをファイルにリダイレクトすることで保存できます。このファイルは、通常 iptables-services が起動時に読み込む場所です。

確認のポイント:
* ルールを変更した後、このコマンドを実行しないと、再起動後に変更が失われます。
* 保存が成功したか確認するには、保存先のファイルの内容を catless で確認します。

2.8 保存された iptables 設定ファイルの内容を確認する

保存された設定ファイルの内容を直接確認します。これは、再起動後にどのようなルールが適用される予定かを知るために重要です。

コマンド:
bash
sudo cat /etc/sysconfig/iptables

または
bash
sudo less /etc/sysconfig/iptables

必要に応じて、他のテーブルの設定ファイル (/etc/sysconfig/iptables-nat など) も確認します。

説明:
iptables-save コマンドによって書き出されたファイルの内容を表示します。このファイルは、iptables-restore コマンドが解釈できる形式でルールが記述されています。

出力例:
“`bash

Generated by iptables-save v1.4.21 on Tue Oct 28 10:00:00 2023

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
COMMIT

Completed on Tue Oct 28 10:00:00 2023

``
*
*filter: これからfilterテーブルの設定セクションが始まることを示す。
*
:INPUT ACCEPT [0:0]: INPUT チェーンのデフォルトポリシーと、保存時のパケット/バイトカウンタ。
*
-A INPUT …: INPUT チェーンにルールを追加する (-A) コマンドの形式。これはiptablesコマンドの引数とほぼ同じ書式です。
*
COMMIT`: このテーブルの設定セクションの終了を示す。

確認のポイント:
* ファイルに保存されているルールが、意図した通りの内容になっているか。
* 再起動後も有効にしたいルールが全て含まれているか。

2.9 実行中の iptables ルールをクリアする (注意!)

現在の Netfilter にロードされている全ての iptables ルールをクリアします。これは非常に危険なコマンドであり、実行すると全てのファイアウォール保護が無効になるため、本番環境での安易な使用は絶対に避けるべきです。トラブルシューティングやメンテナンス時に、ファイアウォールが問題の原因であるかを切り分ける目的などで、細心の注意を払って使用されることがあります。

コマンド:
bash
sudo iptables -F # 全てのチェーンから全てのルールを削除
sudo iptables -X # ユーザー定義チェーンを全て削除
sudo iptables -Z # 全てのチェーンのパケット/バイトカウンタをゼロにする
sudo iptables -P INPUT ACCEPT # デフォルトポリシーをACCEPTにする (必要であれば)
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

説明:
* -F: Flush。指定したチェーン(指定しなければ全てのチェーン)の全てのルールを削除します。
* -X: eXterminate。ユーザーが作成したチェーンを削除します。組み込みチェーン(INPUT, FORWARD, OUTPUTなど)は削除できません。
* -Z: Zero。指定したチェーン(指定しなければ全てのチェーン)のパケット/バイトカウンタをリセットします。
* -P: Policy。指定したチェーンのデフォルトポリシーを設定します。通常、ファイアウォールを無効にする場合は、全てのチェーンのポリシーを ACCEPT に設定します。

確認のポイント:
* これらのコマンドを実行した後に sudo iptables -L を実行すると、チェーンにルールが何も表示されず、ポリシーが ACCEPT になっていることを確認できます(-F, -X のみの場合、ポリシーは変更されません)。
* 警告: これらのコマンドを実行する際は、SSHセッションが切断される可能性や、外部からの全ての通信が許可されるリスクを理解しておく必要があります。物理的にサーバーにアクセスできる環境で行うか、少なくとも同時に有効なコンソールセッションを開いておくなど、安全策を講じるべきです。

2.10 iptables のパケットカウンタをリセットする

iptables -nvL で表示されるパケットカウンタとバイトカウンタをゼロにリセットします。これは、特定の時間帯や特定の操作を行った後のトラフィック量を測定したい場合に便利です。

コマンド:
bash
sudo iptables -Z

または、特定のチェーンのみリセットする場合は
bash
sudo iptables -Z <chain_name>

例: sudo iptables -Z INPUT

説明:
パケットカウンタをゼロにリセットします。ルール自体は変更されません。

確認のポイント:
* リセット後に再度トラフィックを発生させ、しばらく待ってから iptables -nvL を実行すると、リセット後のトラフィック量を確認できます。

Section 3: その他の確認に役立つコマンド

ファイアウォールが正しく機能しているかを確認するには、ファイアウォール自体の設定だけでなく、システム上でどのサービスがどのポートで待ち受けているか、あるいは外部から特定のポートにアクセス可能かなどを確認することも重要です。

3.1 サーバーが待ち受けているポートを確認する (ss / netstat)

システム上で現在動作しているプロセスが、どのIPアドレスとポートで接続を待ち受けているか(Listen しているか)を確認します。ファイアウォールでポートを開放しても、そのポートで待ち受けているサービスがなければ外部から接続することはできません。

コマンド:
bash
sudo ss -tulnp

または (古いシステム):
bash
sudo netstat -tulnp

説明:
* ss および netstat は、ネットワーク接続、ルーティングテーブル、インターフェース統計などを表示するコマンドです。
* オプション:
* -t: TCPソケットを表示。
* -u: UDPソケットを表示。
* -l: 待ち受け(Listen)状態のソケットのみを表示。
* -n: ホスト名、ポート名、ユーザー名を解決せず、数値形式で表示(高速で正確)。
* -p: ソケットを使用しているプロセスのPIDとプログラム名を表示(root権限が必要な場合が多い)。

出力例 (ss):
bash
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=789,fd=3))
tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=1234,fd=13))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=789,fd=4))
tcp LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1234,fd=14))
tcp LISTEN 0 50 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=5678,fd=4))
tcp LISTEN 0 50 [::]:80 [::]:* users:(("httpd",pid=5678,fd=6))

* Local Address:Port: サーバー側の待ち受けIPアドレスとポート番号。0.0.0.0[::] は全てのインターフェースを意味します。127.0.0.1[::1] はローカルホスト(そのサーバー自身)のみを意味します。
* users:(("sshd",pid=789,fd=3)): そのポートで待ち受けているプロセス名とPID。

確認のポイント:
* 目的のポート(例: 80, 443, 22)が LISTEN 状態になっているか?
* 待ち受けアドレスが 0.0.0.0 (IPv4) や [::] (IPv6) になっているか? もし 127.0.0.1 (IPv4) や [::1] (IPv6) になっている場合、そのサービスはローカルホストからしかアクセスできません。
* 待ち受けているプロセスが意図したサービス(sshd, httpd, mysqld など)であるか?

3.2 外部から特定のポートへの接続性を確認する (telnet / nc / nmap)

ファイアウォール設定と待ち受けサービスの両方が正しく設定されていても、ネットワーク経路上の問題などで接続できないことがあります。特定のポートへの接続を試みることで、疎通性を確認できます。これは、対象のサーバー自身からではなく、別のクライアントマシンから実行することが最も一般的で有効な方法です。

コマンド (telnet – クライアントマシンから):
bash
telnet <server_ip_address> <port_number>

例: telnet 192.168.1.100 22 (SSHポートへの接続試行)
例: telnet example.com 80 (HTTPポートへの接続試行)

説明:
指定したIPアドレスまたはホスト名の指定したポートに対してTCP接続を試みます。

出力例と読み方:
* 接続に成功した場合: Connected to <server_ip_address>. Escape character is '^]'. のようなメッセージが表示されます。その後、通常は何も入力せずに Ctrl+] を押してから quit と入力して終了します。
* 接続に失敗した場合: Connection refused (対象ポートでサービスが待ち受けているがファイアウォールやTCP Wrapperなどで拒否されたか、サービスが接続を拒否した) または Connection timed out / No route to host (ファイアウォールでDROPされたか、ネットワーク経路が存在しない/ブロックされている) のようなメッセージが表示されます。

コマンド (nc – netcat – クライアントマシンから):
nctelnet よりも多機能で、TCP/UDPポートのスキャンなどにも使えます。

bash
nc -zv <server_ip_address> <port_number>

例: nc -zv 192.168.1.100 22
例: nc -zv example.com 80

説明:
* -z: データを送信せずに接続試行のみを行う(ゼロI/Oモード)。
* -v: 詳細表示(接続状況を表示)。

出力例と読み方:
* 接続に成功した場合: Connection to <server_ip_address> <port_number> port [tcp/*] succeeded! のようなメッセージが表示されます。
* 接続に失敗した場合: nc: connect to <server_ip_address> port <port_number> (tcp) failed: Connection refused または nc: connect to <server_ip_address> port <port_number> (tcp) failed: Connection timed out など。

コマンド (nmap – クライアントマシンから):
nmap は強力なポートスキャナーです。ファイアウォールの状態確認にも非常に役立ちます。

bash
nmap -sT -p <port_number> <server_ip_address>

例: nmap -sT -p 22 192.168.1.100
例: nmap -sT -p 80,443 example.com (複数のポートを指定)
ポート範囲も指定可能: nmap -sT -p 1-1000 192.168.1.100

説明:
* -sT: TCPコネクトスキャンを実行します(telnetnc -zv と似た方法)。
* -p <port_number>: スキャンするポート番号を指定します。

出力例と読み方:
“`bash
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-28 10:00 JST
Nmap scan report for 192.168.1.100
Host is up (0.001s latency).

PORT STATE SERVICE
22/tcp open ssh
80/tcp closed http
443/tcp filtered https

Nmap done: 1 IP address (1 host up) scanned in 0.50 seconds
``
*
STATE: ポートの状態を示します。
*
open: ポートは開いており、そこでサービスが待ち受けています(ファイアウォールも通過している)。
*
closed: ポートは開いていません(そこでサービスが待ち受けていない)。ファイアウォールがパケットを通過させたが、TCP RST応答を受け取った場合。
*
filtered: パケットがファイアウォールによってブロックされており、ポートが開いているか閉じているか判断できません(ファイアウォールでDROPされた場合)。
*
unfiltered: ポートはアクセス可能ですが、nmapはそれがopenかclosedかを判断できませんでした(ACKスキャンなどで見られる)。
*
open|filtered: ポートが開いているか、またはフィルタリングされているか判断できません(UDPスキャンなどでよく見られる)。
*
closed|filtered: ポートが閉じているか、またはフィルタリングされているか判断できません。
*
SERVICE`: そのポートで一般的に実行されているサービス名。

確認のポイント:
* telnet / nc: 接続に成功するか? 失敗した場合のメッセージから原因の手がかりを得る。
* nmap: ポートの状態が open と表示されるか? filtered と表示される場合は、ファイアウォールが通信をブロックしている可能性が高いです。

3.3 ICMP (Ping) が通過するか確認する

ファイアウォール設定でICMP (Internet Control Message Protocol) の echo-request (ping要求) や echo-reply (ping応答) が許可されているかを確認するために ping コマンドを使用します。多くのセキュリティポリシーでは、不要な情報漏洩を防ぐために外部からのping応答を無効にしています。

コマンド:
bash
ping <server_ip_address>

例: ping 192.168.1.100

説明:
指定したIPアドレスにICMP echo-request パケットを送信し、応答があるかを確認します。

出力例と読み方:
* 応答がある場合: 64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.123 ms のような行が継続して表示されます。
* 応答がない場合: Request timeout for icmp_seq 1 のような行が継続して表示されるか、Destination Host UnreachableNetwork is unreachable のようなエラーが表示されます。

確認のポイント:
* pingに応答がないからといって、必ずしもサーバーがダウンしているわけではありません。ファイアウォールでICMP echo-requestまたはecho-replyがブロックされている可能性が高いです。
* firewalld の場合、ゾーン設定の icmp-blockrich-rulesdirect ルールでICMPがブロックされていないかを確認します (firewall-cmd --zone=public --list-icmp-blocks など)。
* iptables の場合、INPUT チェーンに ICMP を ACCEPT または REJECT/DROP するルールがないか確認します (iptables -nvL INPUT)。

3.4 ファイアウォール関連のログを確認する

ファイアウォールによってブロックされた通信や、特定のルールにマッチした通信は、設定によってはログに記録されます。これらのログを確認することで、何がブロックされているのか、あるいは特定の通信がどのルールにマッチしているのかといった情報を得ることができます。

firewalld の場合:

firewalld 自体のデーモンの動作ログは journalctl で確認するのが一般的です。

コマンド:
bash
sudo journalctl -u firewalld --since "yesterday"

説明:
journalctl は systemd のジャーナルログを表示するコマンドです。-u firewalld で firewalld サービスのログのみをフィルタリングし、--since "yesterday" で昨日のログから表示します。

出力例:
bash
Oct 27 10:00:01 hostname systemd[1]: Started firewalld - Dynamic Firewall Daemon.
Oct 28 10:15:00 hostname firewall-cmd[5678]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure feature.
Oct 28 10:30:00 hostname firewalld[1234]: New machine connected: <MAC Address>
...

確認のポイント:
* firewalld デーモンが正常に起動しているか。
* 設定の再読み込み(reload)やエラーに関するメッセージがないか。

特定のトラフィックをログに記録するように firewalld のルール(特に rich rules や direct rules で LOG ターゲットを指定)を設定している場合、そのログは通常 syslog を経由して /var/log/messagesjournalctl のカーネルログに出力されます。

iptables の場合:

iptablesLOG ターゲットを指定したルールにマッチしたパケットのログは、syslog デーモンによって処理され、通常は /var/log/messages または journalctl -k (カーネルログ) に記録されます。

コマンド:
bash
sudo tail /var/log/messages

または
bash
sudo less /var/log/messages

よりフィルタリングして確認する場合(rootで実行):
bash
sudo grep "IN=" /var/log/messages

または (journalctl の場合):
bash
sudo journalctl -k --since "yesterday" | grep "IN="

説明:
tail はファイルの末尾を表示、less はファイルの内容をページングして表示します。grep "IN=" は、ログエントリの中から文字列 IN= を含む行を検索します。iptables が記録するログには通常 IN= (入力インターフェース), OUT= (出力インターフェース), SRC= (送信元IP), DST= (宛先IP), DPT= (宛先ポート), SPT= (送信元ポート) などの情報が含まれます。

出力例 (grep “IN=”):
Oct 28 10:05:01 hostname kernel: [123.456789] IN=eth0 OUT= MAC=... SRC=1.2.3.4 DST=192.168.1.100 LEN=40 TOS=0x00 PREC=0x00 TTL=249 ID=12345 PROTO=TCP DPT=80 [SYN]
この例は、IPアドレス 1.2.3.4 から eth0 インターフェース経由でサーバーのTCP 80番ポートへのSYNパケットが、ログルールにマッチしたことを示しています。

確認のポイント:
* 意図せずブロックされている通信がログに記録されていないか?
* 不正アクセスやスキャンと見られる通信が記録されていないか?
* ログに出力されている情報(送信元/宛先IP, ポート, プロトコル)から、どのファイアウォールルールにマッチしたのかを推測し、iptables -nvL --line-numbers と突き合わせる。

まとめと次のステップ

本記事では、CentOS環境におけるファイアウォールの主要な管理ツールである firewalld と iptables の設定・状態確認コマンドについて詳細に解説しました。

  • firewalld (firewall-cmd): ゾーンとサービスの概念に基づいた動的な管理。--state, --get-active-zones, --list-all, --list-services, --list-ports などのコマンドで、現在有効なルールや恒久設定を確認します。--permanent オプションの利用と firewall-cmd --reload の重要性を理解することが鍵です。
  • iptables (iptables): テーブルとチェーン、ルールの概念に基づいた低レベルな管理。iptables -nvL コマンドで現在カーネルにロードされているルールを詳細に確認し、パケットカウンタや行番号を利用します。設定の永続化には service iptables saveiptables-save が必要です。
  • その他のツール: ss/netstat でサービスが待ち受けているポートを確認し、telnet/nc/nmap を他のマシンから実行して外部からの接続性をテストすることが、ファイアウォール設定が正しく機能しているかを確認するために非常に有効です。ファイアウォールログは問題発生時の貴重な手がかりとなります。

ファイアウォールの設定確認は、サーバーのセキュリティを維持し、ネットワーク関連のトラブルシューティングを行う上で不可欠なスキルです。これらのコマンドを習得し、定期的にシステムの状態を確認することで、セキュリティリスクを低減し、サービスの安定稼働に貢献できます。

ファイアウォールルールの変更は、誤った設定をするとサーバーにアクセスできなくなるなどの深刻な問題を引き起こす可能性があります。設定変更を行う前には必ず現在の設定を保存し、変更内容を十分に確認し、可能であればテスト環境で試すなど、慎重に進めてください。

これらのコマンドが、あなたのCentOSサーバー管理の一助となれば幸いです。


コメントする

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

上部へスクロール