RedHatではfirewalldサービスによってファイアウォールを提供する。
firewalldではZone(ゾーン)という概念を用いて通信を許可する対象を定義している。
ゾーンには以下の10種類ある。
trusted: 常にあらゆる通信を許可。テスト用。実運用では安易に指定してはいけない。
internal: ssh, mdns, samba-client, dhcpv6-client, cockpitを許可
home: ssh, mdns, samba-client, dhcpv6-client, cockpitを許可
public: デフォルト。ssh, dhcpv6-client, cockpitのみを許可
work: ssh, dhcpv6-client, cockpitのみを許可
external: sshのみ許可。IPマスカレード有効
dmz: sshのみ許可
block: 外部からのパケットを受信拒否して、ICMP Prohibitedメッセージを返す。
drop: 外部からのパケットをすべて破棄する。
nm-shared: NetworkManagerが使う。Zoneとして指定はしない。
ベースとなるゾーンを選んだあと、さらに外部からのアクセス許可を追加する。内部から外部へのアクセスは原則すべて許可する(制限をかけることは可能)。
定義済みサービスは100種類を超える。以下は主なサービスです。
cockpit(TCP9090): Webコンソール
dhcpv6-client(UDP546): HDCPv6クライアント通信
dns(TCP/UDP53): DNS
http(TCP80): HTTP
https(TCP443): HTTPS
mdns(UDP5353): mDNS
ssh(TCP22): SSH
samba-client(UDP137/138): SMB
firewallが稼働中か調べる
$ sudo firewall-cmd --state
Zone一覧を表示する
$ sudo firewall-cmd --get-zones
現在のデフォルトゾーンで許可されているサービス一覧
$ sudo firewall-cmd --list-services
指定したゾーン(internal)で許可されているサービス一覧
$ sudo firewall-cmd --list-services --zone=internal
サービスを追加する(HTTPS)。ここではruntime上のみ。
$ sudo firewall-cmd --add-service=https
サービスを削除する(HTTPS)。ここではruntime上のみ。
$ sudo firewall-cmd --remove-service=https
runtime上の変更を永続化する。
$ sudo firewall-cmd --runtime-to-permanent
runtime上の変更を破棄する
$ sudo firewall-cmd --reload
ルール外のトラフィック受信時の動作をDROPにする
$ sudo firewall-cmd --zone=public --set-target=DROP --permanent
(REJECTの他にDROPとdefaultがある)
すべてのトラフィックを無効にする(緊急時。SSHも止まる)
$ sudo firewall-cmd --panic-on
(--panic-offにすると元に戻る)