Rocky Linux 9でfirewalldを使用してファイアウォールを設定する方法
はじめに
firewalldは多くのLinuxディストリビューションで利用可能なファイアウォール管理ソフトウェアです。これはLinuxのカーネルベースのnftablesやiptablesパケットフィルタリングシステムのフロントエンドとして機能します。
このガイドでは、Rocky Linux 9サーバーのファイアウォールを設定する方法と、ファイアウォールを管理するためのファイアウォール管理ツールであるfirewall-cmdの基本を確認します。
必要条件 (Hitsuyō jōken)
このチュートリアルを完了するには、Rocky Linux 9を実行しているサーバーが必要です。非ルートでsudo権限を持つユーザーとしてこのサーバーにログインしている必要があります。これをセットアップするためには、Rocky Linux 9の初期サーバーセットアップガイドを参照してください。
ステップ1 – firewalldの中核コンセプトの復習
ファイアウォールの設定を管理するために実際にファイアウォール管理ユーティリティでどのように使うかを見る前に、このツールが導入するいくつかの概念に慣れておくべきです。
ゾーン
ファイアウォールデーモンは、ゾーンと呼ばれるエンティティを使用して、ルールのグループを管理します。ゾーンは信頼レベルに応じて許可するトラフィックを規定するルールの集合です。ネットワークインターフェースは、ファイアウォールが許可するべき動作を規定するためにゾーンに割り当てられます。
頻繁にネットワークを移動する可能性のあるコンピュータ(例えば、ノートパソコン)にとって、このような柔軟性は環境に応じてルールを変更する良い方法を提供しています。公共のWi-Fiネットワークで操作する時には、ほとんどのトラフィックを禁止する厳しいルールを設定する一方で、自宅ネットワークに接続された場合にはより緩やかな制限を許可することができます。一方、サーバーにはネットワーク環境がめったに変わらないため、これらのゾーンはそれほど重要ではありません。
どれほど動的なネットワーク環境でも、firewalldの事前定義ゾーンの各概念について知っておくことは依然として役立ちます。firewalld内の事前定義ゾーンは、最も信頼されない順に並んでいます。
- drop: The lowest level of trust. All incoming connections are dropped without reply and only outgoing connections are possible.
- block: Similar to the above, but instead of dropping connections, incoming requests are rejected with an icmp-host-prohibited or icmp6-adm-prohibited message.
- public: Represents public, untrusted networks. You don’t trust other computers but may allow selected incoming connections on a case-by-case basis.
- external: External networks in the event that you are using the firewall as your gateway. It is configured for NAT masquerading so that your internal network remains private but reachable.
- internal: The other side of the external zone, used for the internal portion of a gateway. The computers are fairly trustworthy and some additional services are available.
- dmz: Used for computers located in a DMZ (isolated computers that will not have access to the rest of your network). Only certain incoming connections are allowed.
- work: Used for work machines. Trust most of the computers in the network. A few more services might be allowed.
- home: A home environment. It generally implies that you trust most of the other computers and that a few more services will be accepted.
- trusted: Trust all of the machines in the network. The most open of the available options and should be used sparingly.
ファイアウォールを使用するためには、ルールを作成し、ゾーンのプロパティを変更して、ネットワークインターフェースを適切なゾーンに割り当てることができます。
ルールの永続性
firewalldでは、ルールは現在の実行中ルールセットに適用されるか、または永続的に設定されます。ルールが追加または変更されると、デフォルトでは実行中のファイアウォールのみが変更されます。次回の再起動やfirewalldサービスの再読み込み後には、永続的なルールのみが残ります。
ほとんどのファイアウォールコマンドは、–permanentフラグを使用して永続的な設定への変更を示すことができます。さらに、現在実行中のファイアウォールを永続的な設定に保存するには、firewall-cmd –runtime-to-permanentコマンドを使用することができます。
ランタイムと永久的な設定の分離により、アクティブなファイアウォールでルールを安全にテストし、問題がある場合はリロードして最初からやり直すことができます。
ステップ2- firewalldのインストールと有効化
デフォルトで、Rocky Linuxを含む一部のLinuxディストリビューションには、firewalldがインストールされています。ただし、あなた自身でfirewalldをインストールする必要がある場合もあります。Rockyのdnfパッケージマネージャーを使用することで、これを実行することができます。
- sudo dnf install firewalld -y
ファイアウォールをインストールした後、systemctlを使用してサービスを有効にする必要があります。ファイアウォールを有効にすると、起動時にサービスが開始されることに注意してください。潜在的な問題を避けるために、SSHでログインしたままでファイアウォールのルールを作成し、テストする機会を利用することが最善です。
- sudo systemctl enable firewalld
- sudo systemctl start firewalld
サービスが実行中で到達可能かどうかを確認するには、入力してください。
- sudo firewall-cmd –state
running
以下は、日本語でのパラフレーズ例です:「これは、ファイアウォールがデフォルトの設定で起動していることを示しています。さらなる変更を行う前に、firewalldによって提供されるデフォルトの環境とルールに慣れることが必要です。」
デフォルトを探索する
ファイアウォールのデフォルトのゾーンがどれかは、”firewall-cmd –get-default-zone” を実行することで確認できます。
- firewall-cmd –get-default-zone
public
デフォルトゾーンからの逸脱コマンドをfirewalldに与えていないし、インターフェースも他のゾーンにバインドされていないため、そのゾーンはアクティブゾーンとして唯一のゾーンになります(インターフェースのトラフィックを制御しているゾーンです)。firewall-cmd –get-active-zonesを実行して確認できます。
- firewall-cmd –get-active-zones
public interfaces: eth0 eth1
ここでは、お客様の例のサーバーがファイアウォールによって制御されている2つのネットワークインターフェース(eth0とeth1)が表示されます。現在、両方のインタフェースは公開ゾーンに定義されたルールに基づいて管理されています。
ファイアウォールの設定に関連するルールをデフォルトゾーンの構成に基づいて出力するには、firewall-cmd –list-allコマンドを使用できます。
- sudo firewall-cmd –list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
以下の出力から、このゾーンがデフォルトであり、アクティブであること、そしてeth0とeth1インターフェースがこのゾーンに関連付けられていることがわかります。サービスの行からは、このゾーンがDHCPクライアント(IPアドレスの割り当てのため)、SSH(リモート管理のため)、およびCockpit(Webベースのコンソール)のトラフィックを許可していることもわかります。
代替的なエリアの探索
他のゾーンの情報も見つけることができます。 (Hoka no zōn no jōhō mo mitsukeru koto ga dekimasu.)
利用可能なゾーンのリストを取得するには、firewall-cmd –get-zones を実行してください。
- firewall-cmd –get-zones
block dmz drop external home internal nm-shared public trusted work
あなたが–list-allコマンドに–zone=パラメータを含めることで、ゾーンに関連する具体的な設定を確認することができます。
- sudo firewall-cmd –zone=home –list-all
home target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client mdns samba-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
–list-all-zonesオプションを使用することで、すべてのゾーン定義を出力することができます。次に、ネットワークインターフェースにゾーンを割り当てる方法について学びます。
ステップ3 — インターフェースのゾーンを選択する
ネットワークインターフェースの設定を変更していない限り、ファイアウォールが起動すると、各インターフェースはデフォルトのゾーンに配置されます。
インターフェースのゾーンを変更する
セッション中に–zone=パラメータを–change-interface=パラメータと組み合わせて使用することで、インタフェースをゾーン間で移動することができます。ファイアウォールを変更するすべてのコマンドと同様に、sudoを使用する必要があります。
たとえば、eth0 インターフェースをホームゾーンに移動することができます。
- sudo firewall-cmd –zone=home –change-interface=eth0
success
Note
アクティブゾーンを再度確認することで、これが成功したことを確認できます。
- firewall-cmd –get-active-zones
home interfaces: eth0 public interfaces: eth1
デフォルトゾーンの調整
もしすべてのインターフェースが予め定義された1つのゾーンで適切に扱えるならば、そのゾーンをデフォルトに設定すべきです。デフォルトゾーンは、–set-default-zone=パラメーターで変更することができます。これにより、デフォルトゾーンを使用しているすべてのインターフェースが即座に変更されます。
- sudo firewall-cmd –set-default-zone=home
success
ステップ4:アプリケーションのルール設定
ファイアウォール例外の定義方法について進めてみましょう。
あなたのゾーンにサービスを追加する
最も直接的な方法は、使用しているゾーンに必要なサービスまたはポートを追加することです。firewall-cmdの–get-servicesオプションを使用することで利用可能なサービスの定義のリストを取得することができます。
- firewall-cmd –get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps 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-controller-manager kube-scheduler kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd netbios-ns nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wireguard wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
Note
SSH
Secure Shell(SSH)は、リモートマシンにログインしてコマンドを実行するためのプロトコルです。安全で暗号化された通信を提供します。ファイアウォールで保護されたインターフェース経由でリモートでマシンにアクセスする予定がある場合は、このオプションを有効にしてください。このオプションを有用にするには、openssh-serverパッケージがインストールされている必要があります。
–add-service=パラメータを使用して、ゾーンにサービスを有効にすることができます。この操作はデフォルトゾーン、または–zone=パラメータで指定されたゾーンを対象とします。デフォルトでは、これは現在のファイアウォールセッションのみを調整し、サービスの再起動や再起動後には永続しません。–permanentフラグを含めることで、永続的なファイアウォール設定を調整することができます。
例えば、従来のHTTPトラフィックを提供するウェブサーバーを実行している場合、パブリックゾーンのインターフェースで一時的にこのトラフィックを許可することができます。
- sudo firewall-cmd –zone=public –add-service=http
デフォルトゾーンを変更するために、–zone=フラグを省略することができます。操作の成功を確認するために、–list-allまたは–list-servicesの操作を使用できます。
- sudo firewall-cmd –zone=public –list-services
cockpit dhcpv6-client http ssh
必要に応じてすべてが正常に動作することをテストした後、永続的なファイアウォールのルールを変更することで、再起動後もサービスが利用可能な状態にすることができます。前のコマンドを永続的にするには、–permanentフラグを追加します。
- sudo firewall-cmd –zone=public –add-service=http –permanent
success
別の選択肢として、現在実行中のファイアウォールの設定を永続的な構成に保存するために –runtime-to-permanent フラグを使用することもできます。
- sudo firewall-cmd –runtime-to-permanent
このオプションには注意してください。実行中のファイアウォールに行われたすべての変更は永久に適用されます。
どの方法を選んでも、–list-services操作に–permanentフラグを追加することで、成功したことを確認できます。–permanentの操作にはsudoが必要です。
- sudo firewall-cmd –zone=public –list-services –permanent
cockpit dhcpv6-client http ssh
ご利用のパブリックゾーンは、ポート80上のHTTPウェブトラフィックを許可します。もしウェブサーバーがSSL/TLSを使用している場合は、httpsサービスを追加する必要もあります。現在のセッションと永続的なルールセットに追加するには、次のように入力してください:
- sudo firewall-cmd –zone=public –add-service=https
- sudo firewall-cmd –zone=public –add-service=https –permanent
firewalldのインストールに含まれるサービスは、アクセスを許可する必要のある一般的なアプリケーションの多くをカバーしています。ただし、これらのサービスが要件にマッチしない場合もあるでしょう。
この状況では、あなたには2つの選択肢があります。
あなたのゾーンにポートを開放する
特定のアプリケーションに対するサポートを追加する最も直接的な方法は、適切なゾーンで使用するポートを開放することです。これは、ポートまたはポート範囲と関連するプロトコル(TCPまたはUDP)を指定して行います。
たとえば、アプリケーションがポート5000上で実行され、TCPを使用している場合、–add-port=パラメーターを使用して一時的にこれをパブリックゾーンに追加することができます。プロトコルはtcpまたはudpとして指定することができます。
- sudo firewall-cmd –zone=public –add-port=5000/tcp
success
–list-ports操作を使用して、これが成功したことを確認することができます。
- sudo firewall-cmd –zone=public –list-ports
5000/tcp
始めのポートと終わりのポートをダッシュで分けることで、連続したポートの範囲も指定することができます。例えば、あなたのアプリケーションがUDPポートの4990から4999を使用している場合、これらを公開するには以下のように入力してください。
- sudo firewall-cmd –zone=public –add-port=4990-4999/udp
テスト終了後、これらを恒久的なファイアウォールに追加することができます。sudo firewall-cmd –runtime-to-permanentを使用するか、–permanentフラグと共にコマンドを再実行してください。
- sudo firewall-cmd –zone=public –permanent –add-port=5000/tcp
- sudo firewall-cmd –zone=public –permanent –add-port=4990-4999/udp
- sudo firewall-cmd –zone=public –permanent –list-ports
success success 5000/tcp 4990-4999/udp
サービスの定義
各ゾーンのポートを開放することは、簡単な解決策ですが、それぞれのポートが何に使われているかを追跡するのは難しい場合があります。サーバー上でサービスを廃止した場合、開放されたポートがまだ必要かどうかをカタログ化するのに苦労するかもしれません。このような状況を避けるために、新しいサービスを定義することができます。
サービスは、関連する名前と説明を持つポートのコレクションです。サービスを使用してファイアウォールを管理する方が、通常、ポートをマッピングするよりもメンテナンスが容易ですが、初期設定が必要です。ファイアウォールは非標準の定義を見つける場所として、既存のスクリプトを/usr/lib/firewalld/servicesから/etc/firewalld/servicesディレクトリにコピーして開始することができます。
例えば、このようにして、SSHサービスの定義をコピーして、あなたの例のサービス定義に利用することができます。ファイアウォールのサービスリスト内のサービス名は、このファイル名から.xmlの拡張子を取り除いたものとなります。
- sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
ファイルを開いてください。viまたはお気に入りのテキストエディタを使用してください。
- sudo vi /etc/firewalld/services/example.xml
最初に、コピーしたSSHの定義がファイルに含まれます。
/etc/firewalld/services/example.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
この定義の大部分は実際にはメタデータです。サービスのタグ内の短い名前を変更する必要があります。これはサービスの読みやすい名前です。また、将来サービスを監査する必要がある場合には、より詳細な情報を持つために説明を追加する必要があります。実際にサービスの機能に影響を与える唯一の設定は、開くポートの番号とプロトコルを識別するポートの定義です。複数のタグを指定することができます。
あなたのサービスの例では、TCPのポート7777とUDPのポート8888を開放する必要があると想像してください。次のような既存の定義を変更することができます。
以下のファイルにアクセスします:/etc/firewalld/services/example.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Example Service</short>
<description>This is just an example service. It probably shouldn't be used on a real system.</description>
<port protocol="tcp" port="7777"/>
<port protocol="udp" port="8888"/>
</service>
ファイルを保存して閉じてください。
新しいサービスにアクセスするためにファイアウォールを再読み込みしてください。
- sudo firewall-cmd –reload
今、利用可能なサービスのリストに含まれていることがわかります。
- firewall-cmd –get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server example finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps 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-controller-manager kube-scheduler kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd netbios-ns nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wireguard wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
通常通りに、あなたの地域でこのサービスを利用することができます。
ステップ5 – 自分のゾーンの作成
多くのユーザーにとっては、事前に定義されたゾーンが機能するはずですが、より具体的な役割を持つ独自のゾーンを定義することも役立ちます。
例えば、Webサーバーのためのゾーンを作成する必要があります。このゾーンは「publicweb」と呼ばれるかもしれません。しかし、プライベートネットワーク上で提供されるDNSサービスのためには、別のゾーンを構成する必要があります。そのためには、「privateDNS」という名前の別のゾーンを作成することができます。
ゾーンを追加する際には、それを恒久的なファイアウォールの設定に追加する必要があります。その後、設定を実行中のセッションに反映させるためにリロードすることができます。たとえば、firewall-cmd –new-zoneコマンドを使用してこれらの2つのゾーンを作成することができます。
- sudo firewall-cmd –permanent –new-zone=publicweb
- sudo firewall-cmd –permanent –new-zone=privateDNS
「これらが永続的な設定に存在していることを確認するには、入力して確認できます。」
- sudo firewall-cmd –permanent –get-zones
block dmz drop external home internal nm-shared privateDNS public publicweb trusted work
これらの新しいゾーンをアクティブなランタイム構成に取り込むためにファイアウォールを再読み込みしてください。
- sudo firewall-cmd –reload
- firewall-cmd –get-zones
block dmz drop external home internal nm-shared privateDNS public publicweb trusted work
今、適切なサービスとポートをゾーンに割り当てることができます。実行時のファイアウォールを調整し、テスト後に永続的な設定に変更を保存することは通常良い考えです。たとえば、publicwebゾーンにはSSH、HTTP、およびHTTPSサービスを追加することができます。
- sudo firewall-cmd –zone=publicweb –add-service=ssh
- sudo firewall-cmd –zone=publicweb –add-service=http
- sudo firewall-cmd –zone=publicweb –add-service=https
- sudo firewall-cmd –zone=publicweb –list-all
publicweb target: default icmp-block-inversion: no interfaces: sources: services: http https ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
その後、プライベートDNSゾーンにDNSサービスを追加することができます。
- sudo firewall-cmd –zone=privateDNS –add-service=dns
- sudo firewall-cmd –zone=privateDNS –list-all
privateDNS target: default icmp-block-inversion: no interfaces: sources: services: dns ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
それから、これらの新しいゾーンに私達のインターフェースを切り替えて、それらをテストすることができます。
- sudo firewall-cmd –zone=publicweb –change-interface=eth0
- sudo firewall-cmd –zone=privateDNS –change-interface=eth1
この時点では、設定をテストする機会があります。これらの値があなたに合っている場合、このルールを恒久的な設定に追加する必要があります。—permanentフラグを付けて再びすべてのコマンドを実行することで行うことができますが、この場合、—runtime-to-permanentフラグを使用してランタイム構成全体を永久に保存します。
- sudo firewall-cmd –runtime-to-permanent
これらのルールを永久に適用した後、変更が維持されていることを確認するためにファイアウォールを再読み込みしてください。
- sudo firewall-cmd –reload
正しいゾーンが割り当てられたことを検証してください。
- firewall-cmd –get-active-zones
privateDNS interfaces: eth1 publicweb interfaces: eth0
両ゾーンに適切なサービスが利用可能かどうかを確認してください。
- sudo firewall-cmd –zone=publicweb –list-services
http https ssh
- sudo firewall-cmd –zone=privateDNS –list-services
dns
あなたは自分のゾーンを成功裏に設定しました!他のインターフェースのデフォルトにするために、–set-default-zone=パラメータでその動作を設定することを忘れないでください。
- sudo firewall-cmd –set-default-zone=publicweb
結論
日常の使用のためにRocky Linuxシステムでfirewalldサービスを管理する方法について、あなたは今かなり詳しい理解を持つべきです。
firewalldサービスは、ネットワーク環境を考慮したメンテナンス可能なルールとルールセットの設定を可能にします。ゾーンの使用により、異なるファイアウォールポリシー間でシームレスに移行することができます。このシステムの作業知識を習得することで、このツールが提供する柔軟性と機能を最大限に活用することができます。
ファイアウォールDに関する詳細情報については、公式のファイアウォールDのドキュメンテーションをご覧ください。