最低限知っておきたいfirewalldの使い方

2019年9月27日

firewalld

CentOS7 で firewalld を使う機会があり、調べたことの備忘録。zone の説明と、firewall-cmd のよくある使い方を解説します。

目次

  1. firewalld とは
  2. firewalld の起動・停止
  3. zone を理解する
  4. 特定の service の通信を許可する
  5. よく使う firewall-cmd コマンド
  6. 参考

firewalld とは

CentOS7では、ファイアウォールの設定に firewalld を使います。Web サーバなら HTTP や HTTPS など、提供したいサービスの通信プロトコルを許可し、それ以外の通信を拒否するのがファイアウォールの仕事です。

firewalld の起動・停止

firewalld の起動・停止は systemctl から行います。ちなみに .service は省略できます。

起動確認

systemctl status firewalld.service

起動

systemctl start firewalld.service

終了

systemctl stop firewalld.service

起動しているかの判断は以下のように systemctl status firewalld.service コマンドを実行して Active: active (running) と表示されていれば起動しています。

systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2019-09-27 02:11:25 UTC; 21min ago
Docs: man:firewalld(1)
Main PID: 2674 (firewalld)
CGroup: /system.slice/firewalld.service
└─2674 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

firewalld は通常は自動起動させると思いますので、自動起動させるコマンドもセットで覚えておきましょう。

自動起動の状態確認

systemctl is-enabled firewalld.service

自動起動

systemctl enable firewalld.service

自動起動停止

systemctl disable firewalld.service

zone を理解する

firewalld を理解するには zone を理解しておく必要があります。zone とはファイアウォールの設定をグループ分けして管理する仕組みです。zone に 各種サービスの許可・拒否設定を登録し、zone を NIC や SIDR ブロックに関連付けて通信の制限を行います。

具体例を見てみましょう。zone の設定は firewall-cmd --list-all コマンドで確認することができます。デフォルトでいくつかの zone が事前登録されています。

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

コマンドの結果の一番上の行に表示されている public が zone です。services: の行で、ssh と dhcpv6-client の通信が許可されているのが確認できます。interfaces: の行で、ネットワークカード eth0 に 関連付けられていることが確認できます。

zone には他にもいくつか事前定義されていて、public がデフォルトになっています。他の zone の設定は firewall-cmd --list-all-zones コマンドで確認できます。

firewall-cmd --list-all-zones
block
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
dmz
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
...

いろんな zone が定義されていますが、ほとんどの場合はデフォルトの public のみの利用で事足りますので、まずは public の zone をきちんと扱えるようになりましょう。

特定の service の通信を許可する

これまでの説明で、firewalld の public の zone が eth0 のネットワークカードに関連付けられていて、ssh と dhcpv6-client のサービスが許可されていることが分かりました。この状態から目的のサービスの firewall を許可していきます。

例として http のサービスを許可する場合は firewall-cmd --add-service=http --permanent のコマンドを利用します。--permanent オプションは、再起動しても設定が消えないようにするオプションで、毎回つけるようにするのが安全です。

firewall-cmd --add-service=http --permanent

firewall-cmd --reload コマンドで反映します。

firewall-cmd --reload

firewall-cmd --list-all コマンドで確認すると、services: の行に http が追加されていることが分かります。

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh http
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

さきほど firewall-cmd --add-service=http コマンドのオプションで指定した http のサービス名はどうやって調べたら良いのでしょうか。指定できるサービス名は firewall-cmd --get-services コマンドで調べられます。

firewall-cmd --get-services
... http https imap imaps ...

さらに、サービスの詳細情報は firewall-cmd --info-service=http コマンドで確認ができます。

firewall-cmd --info-service=http
http
  ports: 80/tcp
  protocols:
  source-ports:
  modules:
  destination:

よく使う firewall-cmd コマンド

以上の概念を理解しておけば、firewalld は最低限使えるようになると思います。
後は、私がよく使うコマンドをメモしておきます。詳細は man firewall-cmd コマンドで確認ができます。

起動確認

firewall-cmd --state

zone の状態を確認(zone オプションを省略するとデフォルトの public になる)

firewall-cmd --list-all --zone=public

すべての zone の状態を確認

firewall-cmd --list-all-zones

定義されているサービスの一覧を表示

firewall-cmd --get-services

定義されているサービスの詳細を確認する

firewall-cmd --info-service=http

サービスを許可する

firewall-cmd --add-service=http --permanent

IPを許可する

firewall-cmd --add-source=192.168.0.0/24 --permanent

サービスの許可を削除する

firewall-cmd --remove-service=http --permanent

ポート番号を許可する

firewall-cmd --add-port=3000/tcp

ポート番号を許可を削除する

firewall-cmd --remove-port=3000/tcp

特定のIPとポートの通信を許可する(リッチルール)

firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.33.13/32 port port=9000 protocol=tcp accept" --permanent

上記設定を表示する(リッチルールの表示)

firewall-cmd –-list-rich-rules --permanent

上記設定を削除する(リッチルールの削除)

firewall-cmd --remove-rich-rule="rule family=ipv4 source address=192.168.33.13/32 port port=9000 protocol=tcp accept" --permanent

設定の反映

firewall-cmd --reload

参考

systemctl と journalctlの使い方を解説する記事も書いていますので、併せてどうぞ。

systemd
最低限知っておきたいsystemctlとjournalctlの使い方

Amazon Linux2 上で systemd を使ってサービスを運用する機会があったので備忘録。この記事で紹介してい ...

続きを見る

-技術ブログ
-