firewalldの概要
- 概要
Linuxサーバとサービスを保護するための重要なツールである
firewalldについて習得します。firewalldは、多くの最新ディストリビューションにおけるデフォルトかつ主要なネットワーク防御メカニズムです。直感的なゾーンベースの管理と動的設定機能により、サービスを中断することなくネットワークトラフィックを正確に制御できます。- 目的
firewalldは、複雑なファイアウォールのルールを直感的なゾーンとサービスに抽象化することで、Linuxシステム上のネットワークセキュリティを管理するための現代的、動的でユーザフレンドリな方法を提供するため、不可欠です。- 所要時間
この記事の理解には30分ほどを要します。
- 目標
Linuxシステムのセキュリティを効果的に管理し強化すること。
- 要件
sudoまたはroot特権。firewalldコマンド、特にファイアウォールルールに永続的な変更を加えるコマンドには、昇格された特権が必要だからです。firewalldは、多くの最新のLinuxディストリビューションのデフォルトのファイアウォールです。システムにプリインストールされていない場合は、firewalldパッケージをインストールする必要があります。Linux端末の基本的な理解が不可欠です。
1 firewalldについて #
firewalldは、Linuxシステム上のネットワークトラフィックを柔軟かつ効率的に制御する動的ファイアウォール管理サービスです。既存の接続を中断することなく変更することができます。firewalldを使用する利点は次のとおりです。
動的設定:既存の接続を切断することなく、変更を即座に適用できます。
ユーザフレンドリなインタフェース:ゾーンとサービスは複雑なファイアウォールルールを簡素化します。
抽象化:一般的なシナリオでは、
nftablesルールを直接操作する必要はありません。永続的な設定:再起動後も維持されるルールを簡単に管理できます。
永続的な設定:デフォルトでは、
firewalldは、明示的に許可されていない限り、すべての着信トラフィックをブロックするdeny-all原則に基づいて動作します。
1.1 firewalldゾーン #
ファイアウォールゾーンは、特定のネットワークインタフェースまたは送信元IPアドレスに対する送受信ネットワークトラフィックの処理方法を規定する定義済みのルールセットです。各ゾーンは、関連付けられているネットワークの異なる信頼レベルを表します。ネットワーク接続の発信元に基づいて、さまざまなセキュリティポリシーを適用できます。
ゾーンはセキュリティプロファイルのようなものです。たとえば、公共のWi-Fi接続と安全なホームネットワークに異なるファイアウォールルールを適用したい場合があります。firewalldゾーンを使用すると、こうした個別のルールセットを定義し、それに応じて適用できます。ネットワーク接続は、1つのfirewalldゾーンのルールのみに従います。firewalldゾーンには、多数のネットワークインタフェースまたは送信元IPアドレスを含めることができます。
/usr/lib/firewalld/zones/ディレクトリには、事前定義済みのゾーンが格納されます。次に例を示します。
> /usr/lib/firewalld/zones ls
block.xml dmz.xml docker.xml drop.xml external.xml home.xml internal.xml nm-shared.xml public.xml trusted.xml work.xml事前定義済みゾーンのデフォルト設定の一部は次のとおりです。
-
drop 信頼レベル:完全に信頼しません。
動作:すべての受信ネットワークパケットは、応答なしでドロップされます。システムから開始された発信接続のみが許可されます。これにより、外部の攻撃者にはシステムが存在しないように見える「ステルス」モードが提供されます。
使用事例:ステルス性とセキュリティを最大限に高めるために使用し、不要なトラフィックを完全に無視します。着信接続を絶対に受け入れてはいけないサーバの厳格なデフォルトとして適しています。
-
block 信頼レベル:非常に低い。
動作:すべての受信ネットワーク接続は、IPv4の場合は
icmp-host-prohibitedメッセージ、IPv6の場合はicmp6-adm-prohibitedメッセージで拒否されます。これにより、接続が明示的に拒否されたことが送信者に通知されます。システムから開始された発信接続のみが可能です。使用事例:接続試行がブロックされていることを送信者に明示的に通知する場合に適用されます。
-
public 信頼レベル:信頼できない、またはパブリック。
動作:他のシステムを信頼しない、パブリックの信頼できないネットワークを表します。デフォルトでは、SSH、DHCPv6クライアントなど、選択された着信接続のみが受け入れられます。
使用事例:ルータのWANインタフェースなど、インターネットに直接接続されたインタフェースの一般的なデフォルトゾーン。また、他のデバイスを制御できないネットワークへの接続も含まれます。
-
external 信頼レベル:マスカレード付きの外部。
動作:ファイアウォールがゲートウェイまたはルータとして機能する場合の外部ネットワーク向けです。通常、NATマスカレードはデフォルトで有効になっています。このネットワーク上の他のシステムを信頼していないという前提で、選択された着信接続のみが受け入れられます。
使用事例:Linuxマシンがルータとして動作し、内部のプライベートネットワークをパブリックインターネットに接続する場合に使用されます。外部インタフェースはこのゾーンに配置され、内部ネットワークトポロジを隠しながら、内部クライアントがインターネットなどの外部リソースにアクセスできるようにします。
-
dmz (Demilitarized Zone) 信頼レベル:制限されたパブリックアクセス。
動作:パブリックアクセス可能だが、内部ネットワークへのアクセスは制限されているDMZゾーン内のシステム用。選択された着信接続のみが受け入れられます。デフォルトには通常、SSHや公開するその他のサービスが含まれます。
使用事例:Webサーバ、メールサーバ、DNSサーバなどのパブリックサーバに適しています。これらのサーバは意図的にインターネットに公開されていますが、内部のより信頼できるネットワークからは隔離されています。中核となる内部インフラストラクチャへのリスクを最小限に抑えながら、インターネットにアクセスできる必要があるサービスをホストする場合に便利です。
-
work 信頼レベル:ほぼ信頼(作業環境)。
動作:作業環境では、通常、ネットワーク上の他のコンピュータを信頼します。SSHやDHCPv6クライアントなど、作業環境でよく使用される特定の着信接続を許可します。
使用事例:オフィスネットワークや企業LAN上のシステムに適しています。
-
home 信頼レベル:ほぼ信頼(ホーム環境)。
動作:ホーム環境では、ネットワーク上の他のシステムをほぼ信頼します。パブリックゾーンや外部ゾーンよりも多くのサービスを許可します。多くの場合、ファイル共有、メディアサーバ、プリンタなどの一般的なホームネットワークサービスに加え、SSHやDHCPv6クライアントも含まれます。
使用事例:ホームネットワークや小規模ホームオフィスのセットアップに最適です。
-
trusted 信頼レベル:最も高い。
動作:すべてのネットワーク接続は、フィルタリングなしで受け入れられます。このゾーンに割り当てられた接続にはファイアウォールは実装されていません。
使用事例:信頼性の高い接続用に予約されています。
1.2 firewalldポリシーとルール #
firewalldポリシーは、従来のゾーンと比較して、より高度で柔軟なネットワークトラフィック管理方法を提供します。これにより、トラフィック、サービス、ポート、および許可、拒否、ドロップなどのアクションの送信元と宛先を指定する豊富なルールを定義できます。これらのポリシーは、複雑なルーティングやポート転送を設定したり、単一ホスト内で分離されたネットワークセグメントを作成したりする場合に便利です。
firewalldポリシーは、ゾーンを利用してルールセットを定義します。ルールはステートフルかつ一方向に適用されるため、一方向にトラフィックフローを定義すると、firewalldはリターンパスを暗黙的に許可します。これらのポリシーは、入力ゾーン(トラフィックが入る場所)と出力ゾーン(トラフィックが出る場所)をリンクします。これにより、ポリシーのルールが適用される具体的なパスと方向が定義されます。たとえば、ポリシーは次のように表示できます。
> /usr/lib/firewalld/policies ls
allow-host-ipv6.xmlファイアウォールルールは、ネットワークトラフィックを正確に制御し、許可またはブロックしてシステムをセキュリティの脅威から保護できます。ファイアウォールルールは、送信元と送信先のIPアドレス、ポート、ネットワークインタフェースなどのさまざまな属性に基づいて特定の基準を定義します。firewalldは、ファイアウォールルールをゾーンとポリシーに分けます。firewalldの各ゾーンには、関連するネットワークインタフェースへのトラフィック権限を規定する固有のルールセットがあります。
1.3 サービスとポート #
事前定義済みのサービスが利用できる場合は、サービスを使用することが推奨されます。たとえば、HTTPがTCPポート80を使用していることを覚えておく代わりに、httpサービスを追加するだけで済みます。これにより、エラーが発生しにくくなり、管理も容易になります。サービスが事前定義されていない場合や、サービスにカスタムポートを使用している場合は、ポートを使用してください。デフォルトゾーンのアクティブなサービスとポートは、次のコマンドで確認できます。
>sudofirewall-cmd --list-services
>sudofirewall-cmd --list-ports
2 ファイアウォールルールとゾーンの管理 #
firewalldゾーンとそのルールは、グラフィカルなWebインタフェースCockpitまたはコマンドライン制御用のfirewall-cmdユーティリティを使用して設定できます。
2.1 firewalld-cmdユーティリティを使用したfirewallルールとゾーンの管理 #
CLIインタフェースを使用してfirewalldゾーンを管理できます。
2.1.1 firewalldゾーンの追加 #
新しいfirewalldゾーンを追加するには:
新しいゾーンを作成します。例:
>sudofirewall-cmd --permanent --new-zone=testデフォルト動作を定義するゾーンの信頼レベルを設定します。
>sudofirewall-cmd --permanent --zone=example --set-target=trustedfirewalldサービスを再ロードして新しい設定を適用します。>sudofirewall-cmd --reload
2.1.2 ゾーンへのサービスの追加 #
ゾーンにサービスを追加するには:
すべてのサービスを一覧表示して、サービスがすでに事前定義されているかどうかを確認します。
>sudofirewall-cmd --get-services0-AD RH-Satellite-6 RH-Satellite-6-capsule afp alvr amanda-client amanda-k5-client amqp amqps anno-1602 anno-1800 apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent civilization-iv civilization-v cockpit collectd condor-collector cratedb ctdb dds dds-multicast dds-unicast dhcp dhcpv6 dhcpv6-client distcc dns dns-over-quic dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server factorio finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git gpsd grafana gre http http3 https ident imap imaps ipfs ipp ipp-client ipsec irc ircs [...]サービスは、ランタイムセッション用に一時的に追加することも、永続的に追加することもできます。例:
>sudofirewall-cmd --zone=public --add-service=http>sudofirewall-cmd --zone=public --permanent --add-service=http--permanentフラグにより、すべての再起動後も変更が維持されます。firewalldサービスを再ロードして新しい設定を適用します。>sudofirewall-cmd --reload結果を確認します。
>sudofirewall-cmd --zone=public --list-services
2.1.3 ゾーンへのポートの追加 #
アプリケーションに事前定義済みのサービスがない場合は、特定のポートまたはポートの範囲を開くことができます。
ポートは、ランタイムセッション用に一時的に追加することも、永続的に追加することもできます。例:
>sudofirewall-cmd --zone=public --add-port=8080/tcp>sudofirewall-cmd --zone=public --permanent --add-port=8080/tcp--permanentフラグにより、すべての再起動後も変更が維持されます。firewalldサービスを再ロードして新しい設定を適用します。>sudofirewall-cmd --reload結果を確認します。
>sudofirewall-cmd --zone=public --list-ports
2.1.4 firewalldゾーンの削除 #
ゾーンを削除するには:
ゾーンがデフォルトでも使用中でもないことを確認します。
>sudofirewall-cmd --get-default-zoneゾーンが使用中またはデフォルトの場合、別のゾーンを設定します。例:
>sudofirewall-cmd --set-default-zone=NEW_DEFAULT_ZONEネットワークインタフェースがゾーンにバインドされているかどうかを確認します。
>sudofirewall-cmd --zone=ZONE_TO_BE_DELETED --list-all出力の
interfacesフィールドには、すべてのインタフェースが一覧表示されます。これらのインタフェースは別のゾーンに再割り当てする必要があります。次に例を示します。>sudofirewall-cmd --zone=public --permanent --change-interface=ITERFACE_NAMEゾーンを削除します。
>sudofirewall-cmd --permanent --delete-zone=ZONE_TO_BE_DELETEDfirewalldサービスを再ロードして新しい設定を適用します。>sudofirewall-cmd --reload
2.2 Cockpitによるファイアウォールルールとゾーンの管理 #
Cockpitでは、新しいゾーンの作成や既存のゾーンの更新を行うことができます。ファイアウォールの設定で、ゾーンにサービスを追加したり、ポートへのアクセスを許可したりできます。
Cockpitサービスをデフォルトのファイアウォールゾーンから削除しないでください。Cockpitサービスがブロックされ、サーバから切断される可能性があります。
2.2.1 ファイアウォールゾーンの追加 #
はデフォルトのファイアウォールゾーンです。新しいゾーンを追加するには、次の手順に従います。
ページに移動します。
をクリックします。
をクリックします。
を選択します。ネットワーク接続の各信頼レベルには、付属するサービスの事前定義済みのセットがあります(Cockpitサービスはすべての信頼レベルに付属します)。
ゾーン内で許可するアドレスを定義します。次のいずれかの値を選択します。
- サブネット内のすべてのアドレスを許可します。
- IPアドレスとルーティングプレフィクスのコンマ区切りリスト。たとえば、192.0.2.0/24, 2001:db8::/32です。
を選択して続行します。
2.2.2 ゾーンへの許可するサービスとポートの追加 #
次に説明するように、既存のファイアウォールゾーンにサービスを追加できます。
ページに移動します。
をクリックします。
をクリックします。
サービスを追加するには、をオンにして、リストからサービスを選択します。
カスタムポートを許可するには、をオンにして、UDPまたはTCP、あるいはその両方のポート値を指定します。このポートに識別子を割り当てることができます。
変更を確認するには、またはをそれぞれクリックします。
3 一般的なfirewalldコマンド #
firewall-cmdコマンドラインツールは、firewalldデーモンの設定と管理に使用されます。これは強力で動的なユーティリティであり、サービスの全面的な再起動を必要とせずにファイアウォールルールを作成、変更、削除できるため、アクティブなネットワーク接続の中断を防ぐことができます。
一般的なfirewall-cmdコマンド例には次のものがあります。
firewalldが実行中かどうかチェックする。出力はrunning、not running、またはRUNNING_BUT_FAILEDです。次に例を示します。>sudofirewall-cmd --staterunning利用可能なすべてのゾーンを一覧表示する。例:
>sudofirewall-cmd --get-zonesblock dmz docker drop external home internal nm-shared public trusted workデフォルトゾーンを表示する。例:
>sudofirewall-cmd --get-default-zonepublicアクティブなゾーンと割り当てられているゾーンを表示する。例:
>sudofirewall-cmd --get-active-zonesdocker interfaces: docker0 public (default) interfaces: lo enp1s0デフォルトゾーンのすべてのルールを表示する。例:
>sudofirewall-cmd --list-allpublic (default, active) target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: enp1s0 lo sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="192.168.1.100" service name="ssh" accept特定のゾーンのすべてのルールを表示する。例:
>sudofirewall-cmd --zone=public --list-allpublic (default, active) target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: enp1s0 lo sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="192.168.1.100" service name="ssh" accept利用可能なすべての事前定義済みサービスを一覧表示する。例:
>sudofirewall-cmd --get-services0-AD RH-Satellite-6 RH-Satellite-6-capsule afp alvr amanda-client amanda-k5-client amqp amqps anno-1602 anno-1800 apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent civilization-iv civilization-v cockpit collectd condor-collector cratedb ctdb dds dds-multicast dds-unicast dhcp dhcpv6 dhcpv6-client distcc dns dns-over-quic dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server factorio finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git gpsd grafana gre http http3 https ident imap imaps ipfs ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-api kube-apiserver kube-control-plane kube-control-plane-secure kube-controller-manager kube-controller-manager-secure kube-nodeport-services kube-scheduler kube-scheduler-secure [...]デフォルトゾーンで現在許可されているサービスを一覧表示する。例:
>sudofirewall-cmd --list-servicescockpit dhcpv6-client sshデフォルトゾーンにサービスを永続的に追加する。例:
>sudofirewall-cmd --permanent --add-service=httpsuccessサービスを完全に削除する。例:
>sudofirewall-cmd --permanent --remove-service=httpsuccessデフォルトゾーンで現在開いているポートを一覧表示する。例:
>sudofirewall-cmd --list-ports22/tcp特定のTCPポートを一時的に開く。例:
>sudofirewall-cmd --add-port=8080/tcpsuccess開いているポートを完全に削除する。例:
>sudofirewall-cmd --permanent --remove-port=8080/tcpsuccess特定のゾーンにインタフェースを一時的に追加する。例:
>sudofirewall-cmd --zone=trusted --add-interface=eth1success
4 firewalldのトラブルシューティング #
firewalldのトラブルシューティングには、ステータスのチェック、ルールの確認、サービスの再起動または再ロードが含まれます。問題が発生した場合は、必要に応じてデバッグを有効にしたり、ログを調べたり、ファイアウォールルールを調整したりできます。
4.1 firewalldステータスのチェック #
systemctl statusコマンドを使用します。例:>sudosystemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled) Active: active (running) since Thu 2025-07-17 09:47:36 CEST; 5min ago Invocation: a7ea482f16d2431fa92d6204c297ebd9 Docs: man:firewalld(1) Main PID: 921 (firewalld) Tasks: 2 CPU: 262ms CGroup: /system.slice/firewalld.service └─921 /usr/bin/python3.13 /usr/sbin/firewalld --nofork --nopidfirewall-cmd --stateコマンドは、running、not running、またはRUNNING_BUT_FAILED出力で簡単なステータスチェックを行います。次に例を示します。>sudofirewall-cmd --staterunningfirewalldが実行されていない場合は、systemctl start firewalldコマンドを使用します。>sudosystemctl start firewalldfirewalldサービスがマスクされている場合は、まずそのサービスのマスクを解除し、次に有効にしてから起動します。例:>sudosystemctl unmask --now firewalld>sudosystemctl enable firewalld>sudosystemctl start firewalld
4.2 firewalldルールのチェック #
firewall-cmd --list-all-zonesコマンドは、すべてのゾーンとそのルールを表示します。例:>sudofirewall-cmd --list-all-zonesblock target: %%REJECT%% ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: sources: services: ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: dmz target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: sources: services: ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: docker (active) target: ACCEPT ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no [...]firewall-cmd --list-portsコマンドは、開いているポートを表示します。例:>sudofirewall-cmd --list-ports22/tcpfirewall-cmd --zone=YOUR_ZONE --list-all.コマンドは、特定のゾーンのポートを一覧表示します。例:>sudofirewall-cmd --zone=dmz --list-alldmz target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: sources: services: ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
4.3 firewalldのデバッグ #
--debug=[level]をFIREWALLD_ARGSに追加して、/etc/sysconfig/firewalldのデバッグを有効にします。例:>sudovi /etc/sysconfig/firewalld # firewalld command line args # possible values: --debug FIREWALLD_ARGS=--debug=[level]--debugオプションを指定してfirewalldを起動します。例:>sudofirewalld --nofork --debug2025-07-23 11:10:05 DEBUG1: start() 2025-07-23 11:10:05 DEBUG1: Loading firewalld config file '/etc/firewalld/firewalld.conf' 2025-07-23 11:10:05 DEBUG1: CleanupOnExit is set to 'True' 2025-07-23 11:10:05 DEBUG1: CleanupModulesOnExit is set to 'False' 2025-07-23 11:10:05 DEBUG1: IPv6 rpfilter is enabled 2025-07-23 11:10:05 DEBUG1: LogDenied is set to 'off' 2025-07-23 11:10:05 DEBUG1: FirewallBackend is set to 'nftables' 2025-07-23 11:10:05 DEBUG1: FlushAllOnReload is set to 'False' 2025-07-23 11:10:05 DEBUG1: RFC3964_IPv4 is set to 'True' 2025-07-23 11:10:05 DEBUG1: NftablesFlowtable is set to 'off' 2025-07-23 11:10:05 DEBUG1: NftablesCounters is set to 'False' 2025-07-23 11:10:05 DEBUG1: Loading lockdown whitelist 2025-07-23 11:10:05 ipset not usable, disabling ipset usage in firewall. Other set backends (nftables) remain usable. 2025-07-23 11:10:05 iptables-restore and iptables are missing, IPv4 direct rules won't be usable. 2025-07-23 11:10:05 ip6tables-restore and ip6tables are missing, IPv6 direct rules won't be usable. 2025-07-23 11:10:05 ebtables-restore and ebtables are missing, eb direct rules won't be usable. 2025-07-23 11:10:05 DEBUG1: Loading icmptype file '/usr/lib/firewalld/icmptypes/address-unreachable.xml' 2025-07-23 11:10:05 DEBUG1: Loading icmptype file '/usr/lib/firewalld/icmptypes/bad-header.xml' 2025-07-23 11:10:05 DEBUG1: Loading icmptype file '/usr/lib/firewalld/icmptypes/beyond-scope.xml' 2025-07-23 11:10:05 DEBUG1: Loading icmptype file '/usr/lib/firewalld/icmptypes/communication-prohibited.xml' 2025-07-23 11:10:05 DEBUG1: Loading icmptype file '/usr/lib/firewalld/icmptypes/destination-unreachable.xml' [...]すべてのログファイルは、
/var/log/firewalldにあります。
5 詳細情報 #
firewalldの詳細は、次のリソースを参照してください。
6 法的事項 #
Copyright© 2006–2025 SUSE LLC and contributors. All rights reserved.
この文書は、GNUフリー文書ライセンスのバージョン1.2または(オプションとして)バージョン1.3の条項に従って、複製、頒布、および/または改変が許可されています。ただし、この著作権表示およびライセンスは変更せずに記載すること。ライセンスバージョン1.2のコピーは、「GNU Free Documentation License」セクションに含まれています。
SUSEの商標については、https://www.suse.com/company/legal/を参照してください。その他の第三者のすべての商標は、各社の所有に帰属します。商標記号(®、™など)は、SUSEおよび関連会社の商標を示します。アスタリスク(*)は、第三者の商標を示します。
本書のすべての情報は、細心の注意を払って編集されています。しかし、このことは正確性を完全に保証するものではありません。SUSE LLC、その関係者、著者、翻訳者のいずれも誤りまたはその結果に対して一切責任を負いかねます。