Introduction

備忘録。
firewall-cmd は使う機会が多いのだが、どうにもコマンドが長くて覚えにくいのでメモ。

ここでは CentOS 8.1 での利用を想定。

How to use?

サービス名指定で通信許可

下記は cockpit のサービスの通信許可設定の追加または削除。

追加
1
2
$ firewall-cmd --permanent --zone=public --remove-service=cockpit
$ firewall-cmd --reload
削除
1
2
$ firewall-cmd --permanent --zone=public --remove-service=cockpit
$ firewall-cmd --reload

ポート番号指定で通信許可

下記は ポート番号 9090 に対する通信許可設定の追加または削除。

追加
1
2
$ firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 port port=9090 protocol=tcp accept"
$ firewall-cmd --reload
削除
1
2
$ firewall-cmd --permanent --zone=public --remove-rich-rule="rule family=ipv4 port port=9090 protocol=tcp accept"
$ firewall-cmd --reload

通信元でフィルタ

前述の方法の場合、送信元に関係なく通信を許可してしまう。
そこで特定の送信元 IP (ここでは 192.168.11.21) からの通信のみを許可するようにしてみる。

追加
1
2
$ firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.11.21/32 port port=9090 protocol=tcp accept"
$ firewall-cmd --reload
削除
1
2
$ firewall-cmd --permanent --zone=public --remove-rich-rule="rule family=ipv4 source address=192.168.11.21/32 port port=9090 protocol=tcp accept"
$ firewall-cmd --reload

ネットワーク指定も可能である。
その場合は 192.168.11.0/24 とか。

リジェクトのログを見る

ある端末からの通信が firewalld が原因で通信ができないのかを切り分けたいことは結構ある。
firewalld がリジェクトしているかどうかをログで見る

既定ではリジェクトのログは出力されないので明示的に有効化する。

現在の設定確認
1
2
$ firewall-cmd --get-log-denied
off
設定変更
1
2
$ firewall-cmd --set-log-denied all
success
ログの確認

/var/log/messagestail でチェックし、問題の端末からアクセスを試してもらえば結果がわかる。
下記は、10.100.10.17 (つまり firewalld が動いている通信先のサーバー) に対して、10.100.1.1 という端末からポート番号 9090 にアクセスがあったが REJECT したというログになる。

1
2
$ tail -f /var/log/messages
Nov 26 14:48:36 V026 kernel: FINAL_REJECT: IN=eth0 OUT= MAC=00:15:5d:0b:15:91:00:15:5d:0b:15:8b:08:00 SRC=10.100.1.1 DST=10.100.10.17 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=21515 DF PROTO=TCP SPT=65366 DPT=9090 WINDOW=64240 RES=0x00 SYN URGP=0