CentOS7 で firewalld を使う機会があり、調べたことの備忘録。zone の説明と、firewall-cmd のよくある使い方を解説します。
目次
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
参考
- 第5章 ファイアウォールの使用 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
- 5.15. 「リッチ言語」構文を使用した複雑なファイアウォールルールの設定 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
- Documentation | firewalld
systemctl と journalctlの使い方を解説する記事も書いていますので、併せてどうぞ。
-
最低限知っておきたいsystemctlとjournalctlの使い方
Amazon Linux2 上で systemd を使ってサービスを運用する機会があったので備忘録。この記事で紹介してい ...
続きを見る