🦁

firewalld の使い方

2020/09/28に公開

ファイアウォールサービスである Fireawalld について、基本的な操作や設定方法について記載する。

サービスの確認

firewalldの現在の状態は以下のようにして確認できる(デフォルトは有効なはず)。

$ sudo systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor p>
   Active: active (running) since Wed 2019-09-24 23:16:35 JST; 18min ago
     Docs: man:firewalld(1)
 Main PID: 801 (firewalld)
    Tasks: 2 (limit: 25025)
   Memory: 30.9M
   CGroup: /system.slice/firewalld.service
           └─801 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork ->

Sep 24 23:16:34 localhost.localdomain systemd[1]: Starting firewalld - dynamic >
Sep 24 23:16:35 localhost.localdomain systemd[1]: Started firewalld - dynamic f>

この時、Active: active (running)と表示されている場合は、firewalldは稼働中であること示している。

firewalldを動かすと、デフォルトではインバウンドの通信はほぼ許可されていないため、 サーバに設定/公開するサービス/アプリケーションに応じて許可設定を行う必要がある。
もしサーバの上位にファイアウォール機器が設置されており、 サーバ側でファイアウォールは必要ないといった場合は以下のようにして停止することも可能。

sudo systemctl stop firewalld

自動起動設定も無効にする場合は下記。

sudo systemctl disable firewalld

基本操作

firewalldにおける各種サービスの定義はゾーンに対して設定する。
設定したゾーンとネットワークインターフェースを関連付けることで設定が有効となる。

サービスが停止している場合は、起動してついでに自動起動するように設定しておく。

sudo systemctl enable --now firewalld

今回環境のデフォルトでは以下のように publicゾーンがデフォルトゾーンとしてネットワークインターフェースに適用され、cockpit,dhcpv6-client,sshサービスが許可されている。
firewall-cmdコマンドで様々な操作を行う際に、適用先のゾーン指定(--zone=***)を省略した場合は、このデフォルトゾーンに対して設定が適用される。

デフォルトゾーンを表示

$ sudo firewall-cmd --get-default-zone
public

現在の設定を表示

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

定義されている全てのゾーンを表示

$ sudo 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:
  ... 省略 ...

ゾーンを指定して許可されているサービスを表示

$ sudo firewall-cmd --list-service --zone=external
ssh

デフォルトゾーンを変更

$ sudo firewall-cmd --set-default-zone=external
success

特定インターフェースのゾーンを変更

change-interfaceでは--permanentを付加しても永続化されず再起動すると戻る。
永続化する場合はnmcliを使用する。

$ sudo firewall-cmd --change-interface=ens8 --zone=external
success
$ sudo firewall-cmd --list-all --zone=external

external (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens8
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

$ sudo nmcli connection modify ens8 connection.zone external
$ sudo firewall-cmd --get-active-zone
external
  interfaces: ens8
public
  interfaces: ens2

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

$ sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

定義されているサービスの定義ファイルは以下の場所に保管されている。
独自に定義を追加する場合は当該ディレクトリに XML ファイルを保存する。

$ ls /usr/lib/firewalld/services
amanda-client.xml        jenkins.xml               redis.xml
amanda-k5-client.xml     kadmin.xml                RH-Satellite-6.xml
amqps.xml                kerberos.xml              rpc-bind.xml
amqp.xml                 kibana.xml                rsh.xml
apcupsd.xml              klogin.xml                rsyncd.xml
...省略...
ipsec.xml                ptp.xml                   xmpp-server.xml
ircs.xml                 pulseaudio.xml            zabbix-agent.xml
irc.xml                  puppetmaster.xml          zabbix-server.xml
iscsi-target.xml         quassel.xml
isns.xml                 radius.xml

サービスの追加/削除

サービスを追加する場合は --add-service オプション、削除を行う場合は --remove-service オプションを指定する。
恒久的に変更する場合は --permanent オプションを指定する。
--permanent を指定しなかった場合、システムを再起動すると設定は実行前の状態に戻ってしまうので注意。

[http] を追加(設定は即時有効になる)

$ sudo firewall-cmd --add-service=http
success
$ sudo firewall-cmd --list-service
cockpit dhcpv6-client http ssh

[http] を削除

$ sudo firewall-cmd --remove-service=http
success
$ sudo firewall-cmd --list-service
cockpit dhcpv6-client ssh

[http] を恒久的に追加(設定を反映させるために要リロード)

$ sudo firewall-cmd --add-service=http --permanent
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-service
cockpit dhcpv6-client http ssh

ポートの追加/削除

ポートを追加する場合は --add-port オプション、削除を行う場合は --remove-port オプションを指定する。

[TCP 465] を追加

$ sudo firewall-cmd --add-port=465/tcp
success
$ sudo firewall-cmd --list-port
465/tcp

[TCP 465] を削除

$ sudo firewall-cmd --remove-port=465/tcp
success
$ sudo firewall-cmd --list-port

[TCP 465] を恒久的に追加(設定を反映させるために要リロード)

$ sudo firewall-cmd --add-port=465/tcp --permanent
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-port
465/tcp

ICMPの追加と削除

ICMP のタイプを追加する場合は--add-icmp-blockオプション、削除を行う場合は--remove-icmp-blockオプションを指定する。

[echo-request] を追加

$ sudo firewall-cmd --add-icmp-block=echo-request
success
$ sudo firewall-cmd --list-icmp-blocks
echo-request

[echo-request] を削除

$ sudo firewall-cmd --remove-icmp-block=echo-request
success
$ sudo firewall-cmd --list-icmp-blocks

指定可能な ICMP タイプの一覧を表示

$ sudo firewall-cmd --get-icmptypes
address-unreachable bad-header beyond-scope communication-prohibited destination-unreachable echo-reply echo-request failed-policy fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect reject-route required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option

Discussion