RHEL7やCentOS7からfirewalldサービスがデフォルトのファイアーウォールになりました(これ以前はiptablesが使われていました)。本記事ではこのfirewalldサービスの基本的な設定方法を紹介したいと思います。
firewalldは根本的な思想が刷新され、ゾーンという概念が新たに追加されました。これにより設定の仕方がiptablesのときと全く異なります。firewalldでネットワークはゾーンに分けられ、ゾーンに所属するネットワークインターフェイスやパケットフィルタリングのルールを追加する形になっています。
iptablesではちょっとした設定を行うにも、ある程度ネットワークの知識が必要でしたが、firewalldでは簡単に設定することができます。firewalldのもっとも簡単な設定方法は、ゾーンを選択し、そのゾーンにパケットフィルタリングのルールをサービス名で追加・削除することです。
ゾーンとは
firewalldでは、ゾーンにパケットフィルタリングのルールを設定していきます。ゾーンはあらかじめ用途別にいくつかテンプレートが用意されています。環境にあったゾーンを選択して、必要であればパケットフィルタリングの設定を追加や削除するのが基本です。
あらかじめ定義されているゾーンとその説明は次の通りです。
ゾーンの種類 | 説明 |
---|---|
drop | 外部からのパケットは全て破棄(drop)する。ICMPメッセージも破棄される。内部から外部への接続のみ許可する |
block | 外部からのパケットは全て拒否(reject)する。ただし、ICMPメッセージは許可する。内部から開始された外部への接続は双方向を許可する |
public | パブリックエリア用 |
external | 外部ネットワーク用。マスカレードが有効に設定されている |
dmz | DMZ用 |
work | 業務エリア用 |
home | 家庭用 |
internal | 内部ネットワーク用 |
trusted | 全てのネットワーク接続を許可 |
firewalldサービスの制御
ファイアーウォールを使うにはfirewalldサービスを起動します。ここではfirewalldサービスを制御する基本的なコマンドについて説明します。
firewalldサービスを起動する
firewalldサービスを起動するにはsystemctlコマンドを使って次のように実行します。
# systemctl start firewalld.service
firewalldサービスを停止する
firewalldサービス停止するには、次のようにします。
# systemctl stop firewalld.service
firewalldサービスの起動状態を確認する
firewalldサービスの起動状態を確認するには、systemctlまたはfirewall-cmdを使います。
# systemctl status firewalld.service # firewall-cmd --state
サービスが起動していれば「Active: active (running)」あるいは「running」と表示されます。
# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor > Active: active (running) since Fri 2021-10-22 20:29:55 UTC; 5s ago ... # firewall-cmd --state running
停止していれば「Active: inactive (dead)」あるいは「not running」と表示されます。
# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor > Active: inactive (dead) ... # firewall-cmd --state not running
firewalldサービスの自動起動設定の確認
通常、OS起動時にfirewalldサービスは起動されていて欲しいでしょう。firewalldサービスの自動起動設定を確認するには、次のコマンドを実行します。
# systemctl is-enabled firewalld.service enabled
自動起動が有効であれば「enabled」、無効であれば「disabled」と表示されます。
firewalldサービスの自動起動設定の有効化
自動起動設定を有効化するには次のようにします。
# systemctl enabled firewalld.service
firewalldサービスの自動起動設定の無効化
無効化するには、次のコマンドを実行します。
# systemctl disable firewalld.service
ゾーンを選択する
ファイアーウォール設定の第一歩はゾーンを選択することです。ゾーンを選択した後、そのゾーンに対して設定を行います。
ゾーンの情報を表示する
まずは、特定のゾーンの情報を表示してみましょう。それには --info-zone オプションに特定のゾーンを指定して実行します。次の例では public ゾーンの情報を表示しています。
# firewall-cmd --info-zone=public
実際にpublicゾーンの情報を表示すると、次のように表示されます。本記事では「services」や「ports」の部分の設定の仕方を説明しますが、それ以外にも多くの項目があることがわかります。
# firewall-cmd --info-zone=public public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: cockpit dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
現在(デフォルト)のゾーンを表示する
現在のゾーンを確認するには次のように実行します。
# firewall-cmd --get-default-zone public
現在(デフォルト)のゾーンを変更する
現在のゾーンを変更するには次のように実行します。これは永続的な変更です。
# firewall-cmd --set-default-zone=block # firewall-cmd --reload
設定を反映させるためにはリロードなどの設定の再読み込みが必要です。 この例では block ゾーンに変更しています。
ゾーンのサービスをカスタマイズする
ゾーンには、あらかじめパケットフィルタリングのルールが定義されています。必要であればこれをカスタマイズすることができます(一部カスタマイズできないゾーンもあります)。
ここではもっとも基本的なサービス名でルールを設定する方法を説明します。
firewalldではパケットフィルタリングのルールをサービス名を使って設定できます。サービス名を追加すると、そのサービスの通信は許可されます。通信を禁止したければ、ゾーンからそのサービスを削除します。
ゾーンのサービスを確認する
まずは現在のゾーンに設定されているサービスを確認してみましょう。次のように実行するとアクティブ(有効)なサービスの設定を表示します。
# firewall-cmd --list-service cockpit dhcpv6-client ssh
永続的なサービスを確認するには次のように --permanent オプションを付けて実行します。
# firewall-cmd --permanent --list-service cockpit dhcpv6-client ssh
永続的なサービス設定の情報はファイルへ保存されていますので、(OS起動時などの)firewalldサービス起動時に、これらの設定がアクティブになります。そのためfirewalldサービス起動時は、上述のどちらのコマンドを実行しても設定されているサービスは同じです。この例ではどちらも「cockpit」、「dhcpv6-client」、「ssh」の通信が許可されています。
しかし、このあと見るように、アクティブ(有効)なサービス設定と永続的なサービス設定は別々に追加や削除ができます。
ゾーンにサービスを追加する
現在のゾーンにサービスを追加するには次のようにします。
# firewall-cmd --add-service=http
これはアクティブな設定に追加していますので、追加が成功した時点で有効になります。この例ではhttpの通信を許可しています。
ただし、永続的な設定ではありませんので、firewalldサービスやOSの再起動で設定は消えてしまいます。
永続的にサービスを追加するには次のように実行します。
# firewall-cmd -permanent --add-service=http # firewall-cmd --add-service=http
1つ目のコマンドで永続的にサービスを追加しています。しかし、これだけではアクティブな設定に反映されませんので、アクティブな設定に追加するために2つ目のコマンドを実行します。
あるいは、次のように永続的な設定を追加して、設定を再読み込みします。
# firewall-cmd -permanent --add-service=http # firewall-cmd --reload
ゾーンからサービスを削除する
ゾーンからサービスを削除するには次のようします。これはアクティブな設定からサービスを削除します。
# firewall-cmd --remove-service=http
追加のときと同様に、永続的にサービスを削除するには次のように実行します。
# firewall-cmd -permanent --remove-service=http # firewall-cmd --remove-service=http
あるいは次のように実行します。
# firewall-cmd -permanent --add-service=http # firewall-cmd --reload
サービスの名前を一覧表示する
どのようなサービス名が使えるかわからないときは次のコマンドを実行します。すると使用できるサービス名の一覧を表示します。
# firewall-cmd --get-services
ゾーンのポートをカスタマイズする
特定のポート番号の通信を許可したい場合があります。例えば、SSHで使用するポート番号を変更したときなどです。このようなとき、特定のポート番号でポートを制御する必要があります。ここではその方法を説明します。
ゾーンのポートを設定する
まず、現在のゾーンのポート設定を確認することから始めましょう。次のコマンドはアクティブな設定と永続的な設定をそれぞれ表示します。
# firewall-cmd --list-ports # firewall-cmd --permanent --list-ports
ゾーンにポートを追加する
特定のポートの通信を許可するには、ゾーンにポートを追加します。それには --add-port オプションに「ポート番号」と「プロトコル」を「/」で区切って指定します。プロトコルにはtcp、udp、sctp、dccpのいずれかを使用できます。
# firewall-cmd --add-port=10022/tcp
この例ではポート番号10022のTCP通信を許可しています。この例はアクティブな設定へポートを追加しているだけなので、firewalldサービスやOSの再起動で設定は消えてしまいます。
永続的にポートを追加するには次のように実行します。
# firewall-cmd --permanent --add-port=10022/tcp # firewall-cmd --add-port=10022/tcp
サービス追加の時と同様、1つ目のコマンドだけでは永続的な設定にしか追加されませんので、2つ目のコマンドでアクティブな設定へも追加しています。
あるいは、永続的な設定に追加して、設定を再読み込みしても同じです。
# firewall-cmd --permanent --add-port=10022/tcp # firewall-cmd --reload
ゾーンからポートを削除する
ゾーンからポートを削除したい場合は --remove-port オプションを使います。
# firewall-cmd --remove-port=10022/tcp
永続的にポート削除するには、同様に --permanent オプションを付けます。
# firewall-cmd --permanent --remove-port=10022/tcp # firewall-cmd --remove-port=10022/tcp
あるいは次のようにします。
# firewall-cmd --permanent --remove-port=10022/tcp # firewall-cmd --reload
おわりに
この記事ではファイアーウォールのもっとも基礎的な部分を紹介しました。ファイアーウォールは機能が非常に豊富で複雑です。一つ一つ根気強く学習する必要があるでしょう。