今回はCentOS7から採用されたfirewalldについて、全2回の記事で解説を行います。
firewalldの特長
firewalldは、Dynamic Firewall Manager と呼ばれています。
従来のCentOSが採用していたiptables/ip6tablesでは、パケットフィルタリングのルールを変更するとサービスの再起動が必要でした。
そのため再起動の間は、いったんパケットフィルタリングのルールが無効になることから、通信が途絶えたり、許可すべき通信が拒絶されるなどの原因となっていました。
こうした問題を解決するため開発されたfirewalldは、設定を変更してもサービスを再起動する必要がありません。
またfirewalldは、Linux内部において、NICごとに仮想的なファイアウォールを設置する機能を提供します。
事前にゾーンというものを定義し、そのゾーンに対して許可するサービスを定義します。そして定義したゾーンを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パッケージをインストールした時点で、自動的に起動されるようになっていますが、意図的に停止していた場合、下記のコマンドで開始させます。
1 2 3 4 5 |
ファイアウォールの開始 # systemctl start firewalld ファイアウォールの自動起動設定 # systemctl enable firewalld |
一時設定と永続設定
firewalldの設定は、設定ファイルを編集するのではなく、firewalld-cmdを使って行います。また、firewalldのパケットフィルタリングルール設定は、特に何の設定も行わなければ、一時的にしか有効にならないものがあります。永続的に有効にするためには、”–permanent”オプションを指定する必要があります。
以降の解説では、”–permanent”が必要な場合には、明示的に書式例を表示します。
1 2 3 4 5 |
永続設定の反映 # firewall-cmd --reload firewalldサービスのリロード # systemctl reload firewalld.service |
ゾーンの設定
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をファイアウォールとして使った場合を想定してご説明します。
ゾーン一覧の参照
システムで利用可能なゾーン名を調べるには、”–get-zones”オプションを使います。システムであらかじめ定義されてる利用可能なゾーン名が一覧表示されます。
1 2 3 4 |
ゾーン一覧を表示する。 # firewall-cmd --get-zones block dmz drop external home internal public trusted work |
現在の設定の調査
1 2 3 4 5 6 7 8 9 10 |
# firewall-cmd --list-all-zones ------------------------------ (略) public (default, active) interfaces: enp0s3 sources: services: dhcpv6-client ssh (略) ------------------------------ 初期設定では publicゾーンに ssh のみ許可されています |
デフォルトゾーンの調査
現在のデフォルトゾーンが何かを調べるためには、”–get-default-zones”を指定します。次のように、現在のデフォルトゾーンが表示されます。
1 2 3 |
デフォルトゾーンを調べる。 # firewall-cmd --get-default-zone public |
デフォルトゾーンの変更
デフォルトのゾーンを変更します。デフォルトゾーンを変更すると、これまでのデフォルトゾーンに関連していたコネクションやインタフェースも、一緒に変更されますので注意してください。
1 2 3 |
デフォルトゾーンをinternalに変更する例 # firewall-cmd --set-default-zone=internal success |
アクティブなゾーンを調べる
現在、インタフェースやコネクションが紐づけられているゾーン名と、関連するインタフェース名を一覧表示します。次はその実行例です。
1 2 3 4 5 |
ゾーン名と所属するインタフェースを表示する # firewall-cmd --get-active-zone public interfaces: enp0s3 |
インタフェースのゾーンを変更する
インタフェース(interface)のゾーンを変更します。(zone)を省略するとデフォルトゾーンに設置されます。次は、enp0s3をworkゾーンに変更する場合の例です。
1 2 3 4 5 6 7 |
workゾーンに変更する # firewall-cmd --zone=work --change-interface=enp0s3 ゾーン変更 success # firewall-cmd --get-active-zone ゾーンの状態を確認 work interfaces: enp0s3 |
ゾーンの設定内容の表示
“–list-all”オプションを使うと、ゾーンに設定されている内容をすべて表示することができます。”–zone”オプションを使って、どのゾーンの設定を表示するのかを指定します。
ゾーンを指定しなかった場合には、デフォルトゾーンが表示されます。”–permanent”を指定しないと現在有効な設定が表示され、指定すると永続的な設定が表示されます。
次は、ゾーンの設定内容を表示した例です。
1 2 3 4 5 6 7 8 9 10 11 |
# firewall-cmd --permanent --zone=public --list-all public (default) interfaces: sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: |
サービスの公開
ゾーンの設定が完了したら、必要に応じてサービスの公開を行います。firewall-cmdには、あらかじめ多くのサービスが定義されています。規定されているサービスについては、後ほど説明するポートの公開設定を使うのではなく、ここで説明する方法を利用する必要があります。
サービス一覧の表示
firewalldにあらかじめ登録されているサービスは、firewall-cmdに–get-servicesオプションを付けて実行することで表示することが出来ます。
1 2 3 |
# firewall-cmd --get-services amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https |
サービスの公開設定
firewall-cmd [–permanent] [–zone=(zone)] –add-services=(services) [–timeout=(secounds)]
サービスを公開する場合には、”–add-services”オプションを使います。”–zone”オプションを使って、どのゾーンに対して設定を行うのか指定します。ゾーンを指定しなかった場合は、デフォルトゾーンに対して設定が行われます。
“–permanent”オプションを指定しない場合、設定は一時的に行われます。再起動すると設定が失われてしまうので、注意が必要です。さらに、”–timeout”オプションを付けると、指定した時間の間だけサービスが公開されます。
“–permanent”オプションを付けた場合でも、すぐには設定が反映されません。設定を反映するには、firewalldを再読み込みさせる必要があります。次は、HTTPサービスを公開する場合の設定例です。
1 2 3 4 |
HTTPサービスを公開する # firewall-cmd --permanent --add-service=http sucess |
サービスの公開停止
サービスを停止する場合には、”–remove-service”オプションを使います。”–zone”オプションを使って、どのゾーンに対して設定を行うかを指定します。ゾーンを指定しなかた場合には、デフォルトゾーンに対して設定が行われます。
“–permanent”を指定しない場合、設定は一時的に行われます。繰り返しになりますが再起動すると設定が元に戻りますので注意が必要です。次は、HTTPサービスの公開を停止する場合の設定例です。
1 2 3 4 5 6 |
HTTPサービスの公開を停止する # firewall-cmd --permanent --remove-service=http success # firewall-cmd --reload success |
サービスの公開状態の表示
ゾーンで、どのサービスが公開されているのかを調べるには、”–list-services”オプションを使います。デフォルトゾーン以外のゾーンを表示したい場合には、”–zone”オプションを使って、どのゾーンに対して表示を行うのかを指定します。
次は、設定されているサービスの一覧を表示する例です。
1 2 3 4 |
公開されているサービスを調べる。 # firewall-cmd --permanent --list-services dhcpv6-client ssh |
今回は、firewalldの特長から基本的な操作までの解説を行いましたが、いかがでしたでしょうか?
文法自体は単純なので、実際に利用していけばすぐに慣れるはずです。
次回はより実践的なポート指定及びポートフォワーディングの設定や複雑なルール設定(リッチルール)についての解説をメインに行います。