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

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
success

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


# firewall-cmd --reload
success

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
サービスの許可を削除する
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

参考

関連記事