Nedia What's up!

ネディアのエンジニアによるIT技術やサービスの紹介・検証などをお届け!

CentOS7徹底入門 -firewalld- 1/2

今回はCentOS7から採用されたfirewalldについて、全2回の記事で解説を行います。

firewalldの特長

firewalldは、Dynamic Firewall Manager と呼ばれています。

従来のCentOSが採用していたiptables/ip6tablesでは、パケットフィルタリングのルールを変更するとサービスの再起動が必要でした。
そのため再起動の間は、いったんパケットフィルタリングのルールが無効になることから、通信が途絶えたり、許可すべき通信が拒絶されるなどの原因となっていました。
こうした問題を解決するため開発されたfirewalldは、設定を変更してもサービスを再起動する必要がありません。

またfirewalldは、Linux内部において、NICごとに仮想的なファイアウォールを設置する機能を提供します。

firewalld03

事前にゾーンというものを定義し、そのゾーンに対して許可するサービスを定義します。そして定義したゾーンをLinuxサーバ上のNICと紐付けを行うという方法で設定していきます。 (ゾーンについては後述致します)

iptablesは設定すれば全NICに適用されましたが、firewalldはNIC毎に設定を用意し適用させることができるため、より細かいパケットフィルタリングのルールが可能になっています。

firewalldサービス

CentOSにおけるfirewalldのユニット名は、firewalld.serviceです。firewalldサービスのサーバプロセス名は、/usr/sbin/firewalldです。
firewalldはスタンドアロンのデーモンプロセスとして常駐します。

firewalldサービスの情報

Unit name firewalld.service
Selinux module firewalld 1.0.6
Daemon program /usr/sbin/slapd
Configuration /etc/firewalld/firewalld.conf
Document files usr/share/doc/firewalld-0.3.9/

サービスの自動起動

firewalldは、CentOS7を最小構成でインストールした場合でもインストールされています。またfirewalldパッケージをインストールした時点で、自動的に起動されるようになっていますが、意図的に停止していた場合、下記のコマンドで開始させます。

一時設定と永続設定

firewalldの設定は、設定ファイルを編集するのではなく、firewalld-cmdを使って行います。また、firewalldのパケットフィルタリングルール設定は、特に何の設定も行わなければ、一時的にしか有効にならないものがあります。永続的に有効にするためには、”–permanent”オプションを指定する必要があります。
以降の解説では、”–permanent”が必要な場合には、明示的に書式例を表示します。

ゾーンの設定

firewalldでは、ネットワークインターフェースをゾーンというグループに分けて管理します。CentOSでは、あらかじめ下記のゾーンが定義されています。

分類 ゾーン名 役割 デフォルト許可サービス
一般用途 public デフォルトのゾーン。公共領域での利用を想定。受信コネクションを選択的に許可。 ssh、dhcppv6-clinet
work 業務での利用を想定したゾーン。ほとんどのコンピュータが信頼できる環境での利用を想定。受信コネクションを選択的に許可。 ssh、ipp-clinet、dhcpv6-client
home 家庭での利用を想定したゾーン。ほとんどのコンピュータが信頼できる環境での利用を想定。受信コネクションを選択的に許可。 ssh、ipp-clinet、mdns、samba-client、dhcpv6-client
ファイアウォール internal ファイアウォールの内部ネットワーク側での利用を想定したゾーン。ほとんどのコンピュータが信頼できる環境での利用を想定。受信コネクションを選択的に許可。 ssh,ipp-client,mdns,samba-client,dhcpv6-client
external ファイアウォールの外部ネットワーク側での利用を想定したゾーン。他のコンピュータが利用できない環境での利用を想定。受信コネクションを選択的に許可。 ssh、IP masquerade
dmz ファイアウォールのDMZでの利用を想定したゾーン。受信コネクタを選択的に利用可。 ssh
特殊 block 受信パケットは基本的に拒否。外部への通信とそれに関連する受信パケットだけを受信。
drop 受信パケットは基本的に破棄。外部への通信とそれに関連する受信パケットだけを受信。
trusted すべてのネットワークコネクションを許可。

ゾーンは、ネットワーク構成と深く関連しています。firewalldをインストールした段階では、すべてのインタフェースがpublicゾーンに所属しています。これを、目的に合わせて適切なゾーンに変更します。

なお、通常はCentOS7をファイアウォール単体として使うことはありませんが、今回はfirewalldの説明を分かりやすくするため、下記の図を含めてにCentOS7をファイアウォールとして使った場合を想定してご説明します。

firewalld04

ゾーン一覧の参照

システムで利用可能なゾーン名を調べるには、”–get-zones”オプションを使います。システムであらかじめ定義されてる利用可能なゾーン名が一覧表示されます。

現在の設定の調査

デフォルトゾーンの調査

現在のデフォルトゾーンが何かを調べるためには、”–get-default-zones”を指定します。次のように、現在のデフォルトゾーンが表示されます。

デフォルトゾーンの変更

デフォルトのゾーンを変更します。デフォルトゾーンを変更すると、これまでのデフォルトゾーンに関連していたコネクションやインタフェースも、一緒に変更されますので注意してください。

アクティブなゾーンを調べる

現在、インタフェースやコネクションが紐づけられているゾーン名と、関連するインタフェース名を一覧表示します。次はその実行例です。

インタフェースのゾーンを変更する

インタフェース(interface)のゾーンを変更します。(zone)を省略するとデフォルトゾーンに設置されます。次は、enp0s3をworkゾーンに変更する場合の例です。

ゾーンの設定内容の表示

“–list-all”オプションを使うと、ゾーンに設定されている内容をすべて表示することができます。”–zone”オプションを使って、どのゾーンの設定を表示するのかを指定します。
ゾーンを指定しなかった場合には、デフォルトゾーンが表示されます。”–permanent”を指定しないと現在有効な設定が表示され、指定すると永続的な設定が表示されます。
次は、ゾーンの設定内容を表示した例です。

サービスの公開

ゾーンの設定が完了したら、必要に応じてサービスの公開を行います。firewall-cmdには、あらかじめ多くのサービスが定義されています。
規定されているサービスについては、後ほど説明するポートの公開設定を使うのではなく、ここで説明する方法を利用する必要があります。

サービス一覧の表示
firewalldにあらかじめ登録されているサービスは、firewall-cmdに–get-servicesオプションを付けて実行することで表示することが出来ます。

サービスの公開設定

firewall-cmd [–permanent] [–zone=(zone)] –add-services=(services) [–timeout=(secounds)]

サービスを公開する場合には、”–add-services”オプションを使います。”–zone”オプションを使って、どのゾーンに対して設定を行うのか指定します。ゾーンを指定しなかった場合は、デフォルトゾーンに対して設定が行われます。

“–permanent”オプションを指定しない場合、設定は一時的に行われます。再起動すると設定が失われてしまうので、注意が必要です。さらに、”–timeout”オプションを付けると、指定した時間の間だけサービスが公開されます。

“–permanent”オプションを付けた場合でも、すぐには設定が反映されません。設定を反映するには、firewalldを再読み込みさせる必要があります。次は、HTTPサービスを公開する場合の設定例です。

サービスの公開停止

サービスを停止する場合には、”–remove-service”オプションを使います。”–zone”オプションを使って、どのゾーンに対して設定を行うかを指定します。ゾーンを指定しなかた場合には、デフォルトゾーンに対して設定が行われます。
“–permanent”を指定しない場合、設定は一時的に行われます。繰り返しになりますが再起動すると設定が元に戻りますので注意が必要です。次は、HTTPサービスの公開を停止する場合の設定例です。

サービスの公開状態の表示

ゾーンで、どのサービスが公開されているのかを調べるには、”–list-services”オプションを使います。デフォルトゾーン以外のゾーンを表示したい場合には、”–zone”オプションを使って、どのゾーンに対して表示を行うのかを指定します。
次は、設定されているサービスの一覧を表示する例です。

今回は、firewalldの特長から基本的な操作までの解説を行いましたが、いかがでしたでしょうか?
文法自体は単純なので、実際に利用していけばすぐに慣れるはずです。

次回はより実践的なポート指定及びポートフォワーディングの設定や複雑なルール設定(リッチルール)についての解説をメインに行います。