server-memo.net

firewalldの設定方法(基本設定編)

      2017/06/23

「firewalld」の基本的な設定方法です。

ポートフォワーディング等の設定方法は別途作成していく予定です。

firewalldについて

CentOS6までのファイアウォールは「iptables」でしたが、CentOS7からは「firewalld」が初期状態では有効となっています。

「firewalld」について簡単に説明すると、通信制御のポリシーを設定する場合、事前に定義されたゾーンに対して通信の許可・遮断ルールを適用し、そのゾーンを各NIC(ネットワークアダプタ)に割り当てていくという方式になっています。

コマンドラインで「firewalld」を制御するために「firewall-cmd」というコマンドが用意されているので、その基本的な使用方法についてもまとめてます。

ゾーンについて

初期状態で9つのゾーンが用意されています。
※自分でもゾーンを新規に作成することもできます。

下記は初期に定義されてるゾーンの一覧です。

ゾーン 通信許可サービス 説明
block なし 外部からの接続はすべて遮断 設定変更不可
遮断時は「CIMP Pohibited」を返し、内部からの通信時は戻りの通信も許可される
dmz ssh dmz用に定義されたゾーン
drop なし 外部からの通信はすべて遮断 設定変更不可
内部からの通信は送信できるが、外部からの戻りの通信は遮断されるため、結果的にすべての通信が出来ない
external ssh IPマスカレード有効でルータなど外部ネットワークとの接続で使用するために定義されたゾーン
home dhcpv6-client
ipp-client
mdns
samba-client
ssh
自宅などで使用するために定義されたゾーン
internal dhcpv6-client
ipp-client
mdns
samba-client
ssh
内部ネットワークで使用するために定義されたゾーン
public dhcpv6-client
ssh
公共の場所で使用するために定義されたゾーン
trusted すべての通信を許可 設定変更不可
work dhcpv6-client
ipp-client
ssh
職場などの業務エリアで使用するために定義されたゾーン

確認系コマンド

「fierwalld」の状態や設定内容を確認するためのコマンドについて説明していきます。

firewalld稼働状況確認

「firewalld」の稼働状況は下記のコマンドで確認することが出来ます。

# firewall-cmd --state

実行例

「firewalld」が動作している場合は「running」、停止している場合は「not running」と表示されます。

動作中
# firewall-cmd --state
running
停止中
# firewall-cmd --state
not running

systemctlコマンドを使用した確認

稼働状況の確認は「firewall-cmd」コマンド以外にも「systemctl」コマンドを使用することで確認出来ます。

# systemctl status firewalld
起動している場合

Active: active (running)と表示され、動作していることが確認できます。

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 金 2016-08-26 15:13:37 JST; 26min ago
 Main PID: 735 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq735 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

 8月 26 15:13:35 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
 8月 26 15:13:37 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
停止している場合

Active: inactive (dead)と表示され、firewalldが停止していることが分かります。

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 金 2016-08-26 15:40:18 JST; 20s ago
  Process: 735 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 735 (code=exited, status=0/SUCCESS)

 8月 26 15:13:35 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
 8月 26 15:13:37 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
 8月 26 15:40:18 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
 8月 26 15:40:18 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.

ゾーンの設定確認

ゾーンの設定状態を確認するためのコマンドについて説明します。

defaultゾーン設定を表示

下記のコマンドで「default」として設定されているゾーンの設定内容を確認できます。

firewall-cmd --list-all
実行例

下記の実行例では、「public」ゾーンが「default」設定となっていて、「eno16777736」「eno33554984」のNICに割り当てられていること等がわかります。

# firewall-cmd --list-all
public (default, active)
  interfaces: eno16777736 eno33554984
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

指定したゾーンの設定を表示

「--zone」で確認したいゾーンを指定することで、対象としたゾーンの情報を表示させることができます。

firewall-cmd --zone=ゾーン名 --list-all
実行例

下記の実行例は「dmz」ゾーンの設定を表示させた例となります。

# firewall-cmd --zone=dmz --list-all
dmz
  interfaces:
  sources:
  services: ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

全てのゾーンの設定を表示

全てのゾーン情報を表示させるには「--list-all-zones」を使用します。

firewall-cmd --list-all-zones
実行例

初期定義されている9つのゾーンの情報が表示されます。

# firewall-cmd --list-all-zone
block
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

dmz
  interfaces:
  sources:
  services: ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

drop
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

external
  interfaces:
  sources:
  services: ssh
  ports:
  masquerade: yes
  forward-ports:
  icmp-blocks:
  rich rules:

home
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

internal
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

public (default, active)
  interfaces: eno16777736 eno33554984
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

trusted
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

work
  interfaces:
  sources:
  services: dhcpv6-client ipp-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

--permanentオプションの有無について

ゾーンの設定を確認する際に「--permanent」オプションを指定して確認を行うと、一時的に設定を追加されているルールについては表示されません。

  • --permanentなし 現在の設定状態を表示
  • --permanentあり permanent付きで設定されたものだけ表示

例として「--permanent」オプションを指定せずに「public」ゾーンへ「http」サービスを追加し、「--permanent」オプションの有り無しでどのように表示されるのかを確認してみます。

httpサービスをpublicゾーンに追加

まず、一時的に「public」ゾーンへ「http」サービスの通信を許可する設定を行います。

# firewall-cmd --zone=public --add-service=http
success
--permanentオプション無しで状態を確認

servicesに「http」が追加されていることが確認できます。

# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eno33554984
  sources:
  services: dhcpv6-client http ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
--permanentオプションをつけて状態を確認

追加された「http」サービスは一時的な設定なので、servicesにhttpが表示されていません。

# firewall-cmd --zone=public --permanent --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

このように、「--permanent」オプションの有り無しで表示結果が異なるので確認の際は注意してください。

デフォルトゾーンの確認

「default」として設定されているゾーンを表示します。

# firewall-cmd --get-default-zone
public

「default」として設定されているゾーンが「public」であることがわかります。

設定系コマンド

「firewalld」の設定に関するコマンドを説明します。

コマンド自体はまだまだたくさんあるのですが、まずは私が普段よく使っているものを記述させていただきます。

一時的設定と恒久的設定について

設定のコマンドを説明する前に一時的設定と恒久的設定について説明していきます。

一時的設定(--permanentオプション無し)

「firewall-cmd」コマンドで設定を行う際に、「--permanent」オプションを指定しなければその設定は一時的な設定となり、サーバや「firewalld」のサービスを再起動すると設定が消えてしまいます。

恒久的設定(--permanentオプションあり)

サーバの再起動や「firewalld」サービスの再起動で設定が消えてしまわないようにするためには、「--permanent」オプションを使用して設定を行う必要があります。

その際、「--permanent」オプションを指定して設定を行った場合は、そのままでは「firewalld」に設定が反映されないため「fiewall-cmd --reload」で設定を反映させる必要があります。

ゾーンへのサービス追加・削除

ゾーンに通信を許可するサービスの追加する方法と、削除する方法について説明します。

サービス追加

すでに定義されているサービスをゾーンに追加するためには「--add-service」でサービスの指定行います。

firewall-cmd [--permanent] --zone=ゾーン名 --add-service=サービス名

恒久的にゾーンにサービスを追加したい場合は「--permanent」オプションをつけて設定を行う必要があります。

一時的にサービスを追加する設定例

一時的に「public」ゾーンに「http」サービスを追加する例です。

# firewall-cmd --zone=public --add-service=http
恒久的にサービスを追加する設定例

「--permanent」オプションを指定して、「public」ゾーンに「http」サービスを追加する例です。

# firewall-cmd --permanent --zone=public --add-service=http 
success
# firewall-cmd --reload
success

設定を有効化するために「firewall-cmd --reload」で設定の反映を忘れずに行いましょう。

サービス削除

ゾーンに設定されているサービスを削除するには「--remove-service」を使用します。

firewall-cmd [--permanent] --zone=ゾーン名 --remove-service=サービス名

先ほど設定した「http」サービスを「public」ゾーンから削除してみます。

# firewall-cmd --permanent --zone=public --remove-service=http
success
# firewall-cmd --reload
success

一時的に「http」サービスをゾーンから削除したい場合は「--permanent」オプションの指定を行わないでください。

ゾーンへのポート追加・削除

サービスとして追加されていない通信をゾーンに追加する場合は、ポート番号とプロトコルを指定して追加するという方法もあります。

ポートの追加

ゾーンへのポート追加は「--add-port」を使用して行います。

firewall-cmd [--permanent]--zone=ゾーン --add-port=ポート番号/プロトコル
設定例

「public」ゾーンにポート番号「10022」プロトコル「TCP」のルールを追加してみます。

# firewall-cmd --permanent --zone=public --add-port=10022/tcp
success
# firewall-cmd --reload
success

設定内容を確認するとportsに「10022/tcp」が追加されていることが確認できます。

# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eno16777736 eno33554984
  sources:
  services: dhcpv6-client ssh
  ports: 10022/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

ポートの削除

ゾーンからポートを削除するには「--remove-port」を使用します。

firewall-cmd [--permanent]--zone=ゾーン --remove-port=ポート番号/プロトコル
設定例

先ほど追加した「public」ゾーンの「10022/tcp」ルールを削除します。

# firewall-cmd --permanent --zone=public --remove-port=10022/tcp
success
# firewall-cmd --reload
success

設定内容を確認するとportsから「10022/tcp」が削除されていることが確認できます。

# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eno16777736 eno33554984
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

デフォルトゾーンの変更

「default」に設定されているゾーンを変更する場合は「--set-default-zone」を使用します。

firewall-cmd --set-default-zone=ゾーン名

デフォルトのゾーンを変更する場合は「--permanent」オプションを使用しなくても設定は恒久的となります。

設定例

「dmz」ゾーンをdefault設定に変更してみます。

# firewall-cmd --set-default-zone=dmz
success

default設定のゾーンを確認すると「dmz」に変更されていることが確認できます。

# firewall-cmd --get-default-zone
dmz

NICへ割り当てられているゾーンの変更

「default」に設定されているゾーン以外をNICに割り当てる場合の方法について説明します。

一時的にゾーンを変更

一時的にゾーンを変更する場合は「--change-interface」を使用します。

firewall-cmd --zone=ゾーン名 --change-interface=NIC名
設定例

「eno16777736」というNICに「trusted」ゾーンを割り当てる例となります。

# firewall-cmd --zone=trusted --change-interface=eno16777736
success

「trusted」ゾーンの情報を確認すると、interfacesに「eno16777736」が表示されているのが確認できます。

# firewall-cmd --zone=trusted --list-all
trusted (active)
  interfaces: eno16777736
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

恒久的にゾーンを変更

NICに割り当てられているゾーンを恒久的に変更するためには「firewall-cmd」コマンドを使用せずに、NICの設定ファイルに下記内容を追加することでゾーンの割り当て設定します。

※NICの設定ファイルは「/etc/sysconfig/network-scripts/ifcfg-xxx」となります。

設定追加内容
ZONE=ゾーン名
設定例

「eno16777736」というNICに「trusted」ゾーンを割り当てる例となります。

# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736

NICの設定ファイルに下記内容を追加します。

ZONE=trusted

設定ファイルの編集が終わったら、ネットワークを再起動させて設定を反映させます。

# systemctl restart network

「trusted」ゾーンを確認するとinterfacesに「eno16777736」が表示されていることが確認できます。

# firewall-cmd --zone=trusted --list-all
trusted (active)
  interfaces: eno16777736
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

ゾーンの割り当てには「--permanent」オプションが使えない

これまでゾーンにサービスやポートを追加する場合、恒久的な設定を行う場合は「--permanent」オプションを使っていましたが、NICにゾーンを割り当てる場合は「--permanent」が使用できません。

実際に「--permanent」を使用してゾーンの割り当てを行ってみると、「success」と表示されて設定が成功したようにみえます。

# firewall-cmd --permanent --zone=trusted --change-interface=eno16777736
success

ですが、「firewall-cmd --reload」を行ってもNICはdefaultのゾーンに割り当てられたままとなっています…

# firewall-cmd --reload
success
# firewall-cmlist-all
public (default, active)
  interfaces: eno16777736 eno33554984
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

当然サーバの再起動を行ってもNICへの割り当てはそのままでした。

man firewall-cmd

設定方法が間違っているのかと思い、「man firewall-cmd」で確認すると下記のように記述されていました。

[--zone=zone] --change-interface=interface
Change zone the interface interface is bound to to zone zone. If
zone is omitted, default zone will be used. If old and new zone are
the same, the call will be ignored without an error. If the
interface has not been bound to a zone before, it will behave like
--add-interface.

[--permanent] [--zone=zone] --query-interface=interface
Query whether interface interface is bound to zone zone. Returns 0
if true, 1 otherwise.

[--permanent] [--zone=zone] --remove-interface=interface
Remove binding of interface interface from zone zone. If zone is
omitted, default zone will be used.

内容を確認すると、「--change-interface=interface」の項目には [--permanent]の記述がありません…

であれば、「--permanent」が使用できないのも当然なのですが、使えないはずのオプションを指定しているのにコマンドの実行結果で「success」と表示するはなぜでしょう?

出来ればエラーを返してほしかったですね。

起動・停止方法

「firewalld」は「systemd」で制御されているので、起動と停止には「systemctl」コマンドを使用します。

firewalldの起動

# systemctl start firewalld

firewalldの停止

# systemctl stop firewalld

自動起動設定

詳しくは下記のページで説明しているので、参考にしてみてください。

http://www.server-memo.net/centos-settings/centos7/firewalld-stop.html

 - firewalld