ここでは、RedHat系Linuxでfirewall-cmdコマンドを使ってファイアウォール(firewalld)を設定する方法を使用例をメインに解説します。
目次
firewall-cmdコマンドの作法
firewall-cmdを使ってファイアウォールに設定を追加したり変更する場合、変更内容はLinuxを再起動すると破棄されてしまうため、設定内容を再起動後も適用させたい(永続化させたい)ときは、firewall-cmdコマンドを実行するときに「--permanent」オプションを追加してコマンドを実行し、コマンド実行後に「firewall-cmd --reload」コマンドを実行して、設定を反映させる必要があります。
ゾーンの設定
firewalldでは、ネットワークインターフェースをゾーンというグループに分けて管理し、用途に合わせたゾーンが9種類用意されています。
- public - 公共領域での利用を想定したゾーン
- work - 業務での利用を想定したゾーン
- home - 家庭での利用を想定したゾーン
- internal - ファイアウォールの内側での利用を想定したゾーン
- external - ファイアウォールの外側での利用を想定したゾーン
- dmz - ファイアウォールのDMZでの利用を想定したゾーン
- drop - 受信パケットを遮断し、外部への通信とそれに関連する受信パケットだけを受信できるゾーン
- block - 受信パケットを拒否し、外部への通信とそれに関連する受信パケットだけを受信できるゾーン
- trusted - すべてのネットワーク通信を許可するゾーン
なお、デフォルトですべてのネットワークインターフェースは「public」と呼ばれるゾーンが割り当てられています。
ゾーン一覧の参照
システムで利用可能なゾーンを確認するときは、以下のようにコマンドを実行します。
# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
デフォルトのゾーンの確認
現在のデフォルトゾーンを確認したいときは、以下のようにコマンドを実行します。
# firewall-cmd --get-default-zone
public
デフォルトゾーンの変更
デフォルトのゾーンを変更したいときは、以下のようにコマンドを実行します。なお、デフォルトゾーンを変更すると、これまでのデフォルトゾーンに紐づいていたインタフェースも変更されます。
たとえば、デフォルトゾーンをinternalに変更したいときは、以下のようにコマンドを実行します。
# firewall-cmd --set-default-zone=internal
success
現在使用しているゾーンの確認
現在使用している(アクティブな)ゾーンを確認するときは、以下のようにコマンドを実行し、コマンドを実行すると、ゾーン名と紐づくネットワークインターフェース名が表示されます。
# firewall-cmd --get-active-zone
public
interfaces: eth0
ゾーンの設定の確認
ゾーンの設定内容を確認したいときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=public --list-all
public (default)
interfaces:
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
すべてのゾーンの設定内容を確認したいときは、以下のようにコマンドを実行します。
# firewall-cmd --list-all-zones
インタフェースのゾーンの変更
ネットワークインタフェースに紐づいているゾーンを変更したいときは、以下のようにコマンドを実行します。
たとえば、eth0をworkゾーンに変更したいときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=work --change-interface=eth0
success
サービスへのアクセスを許可
特定のサービスへのアクセス許可したいときは、以下のようにコマンドを実行します。たとえば、HTTPサービスを許可したいときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=public --add-service=http
sucess
指定できるサービス名の一覧は、以下のコマンドで確認できます。
# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb dds dds-multicast dds-unicast dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git gpsd grafana gre high-availability http http3 https ident imap imaps ipfs ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-api kube-apiserver kube-control-plane kube-control-plane-secure kube-controller-manager kube-controller-manager-secure kube-nodeport-services kube-scheduler kube-scheduler-secure kube-worker kubelet kubelet-readonly kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr llmnr-client llmnr-tcp llmnr-udp managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd nebula netbios-ns netdata-dashboard nfs nfs3 nmea-0183 nrpe ntp nut opentelemetry openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus prometheus-node-exporter proxy-dhcp ps2link ps3netsrv ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptls snmptls-trap snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui syncthing-relay synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server warpinator wbem-http wbem-https wireguard ws-discovery ws-discovery-client ws-discovery-tcp ws-discovery-udp wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server zerotier
サービスの許可設定を削除するときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=public --remove-service=http
success
TCP/UDPポートへのアクセスを許可
特定のTCP/UDPポートへのアクセスを許可したいときは、以下のようにコマンドを実行します。たとえば、TCP12345番ポートを許可したいときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=public --add-port=12345/tcp
success
ポートの許可設定を削除するときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=public --remove-port=12345/tcp
success
IPアドレスの許可
特定のIPアドレスからのアクセス許可したいときは、以下のようにコマンドを実行します。たとえば、IPアドレス「192.168.0.100」からの通信を許可したいときは、以下のようにコマンドを実行します。
なお、IPアドレスの指定では「192.168.0.0/24」のように、CIDER表記でIPアドレスの範囲を指定することもできます。
# firewall-cmd --zone=public --add-source=192.168.0.100
success
IPアドレスの許可設定を削除するときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=public --remove-source=192.168.0.100
success
詳細な許可設定
IPアドレスとサービスを組み合わせた許可設定を追加したいときや、IPアドレスとポートを組み合わせた許可設定を追加したいとき、ポートフォワードを設定したいときは、リッチルールを作成します。
IPアドレスとサービスを組み合わせた許可
特定のIPアドレスからの特定のサービスへのアクセスを許可したいときは、以下のようにコマンドを実行してリッチルールを作成します。
# firewall-cmd --add-rich-rule=’rule family=ipv4 source address=<IPアドレス> servicename=<サービス名> accept’ --zone=<ゾーン名>
success
追加したリッチルールを削除するときは、以下のようにコマンドを実行します。
# firewall-cmd --remove--rich-rule=’rule family=ipv4 source address=<IP アドレス> service
name=<サービス名> accept’ --zone=<ゾーン名>
IPアドレスとポートを組み合わせた許可
特定のIPアドレスからの特定のポートへのアクセス許可したいときは、以下のようにコマンドを実行します。
# firewall-cmd --add-rich-rule=’rule family=ipv4 source address=<IPアドレス> port
port=<ポート番号> protocol=[tcp/udp] accept’ --zone=<ゾーン名>
追加したリッチルールを削除するときは、以下のようにコマンドを実行します。
# firewall-cmd --remove--rich-rule=’rule family=ipv4 source address=<IPアドレス> port
port=<ポート番号> protocol=[tcp/udp] accept’ --zone=<ゾーン名>
ポートフォワード(ポート転送)
特定のポートへのアクセスを別のポートへ転送(フォワード)したいときは、以下のようにコマンドを実行します。
# firewall-cmd --add-forward-port=port=<転送元ポート番号>:proto=<tcp|udp>:toport=<転送先ポート番号>
追加したフォワード設定を削除するときは、以下のようにコマンドを実行します。
# firewall-cmd --remove-forward-port=port=<転送元ポート番号>:proto=<tcp|udp>:toport=<転送先ポート番号>
なお、特定のポートへのアクセスを別のマシンのポートへ転送(フォワード)することもできます。
# firewall-cmd --add-forward-port=port=<転送元ポート番号>:proto=<tcp|udp>:toport=<転送先ポート番号>:toaddr=<転送先IPアドレス>
また、特定のIPアドレスからの特定のポートへの通信をポートフォワードすることもできます。
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=<IPアドレス> forward-port port=<転送元ポート番号> protocol=<tcp|udp> to-port=<転送先ポート番号>' --zone=public
IPアドレスの遮断
特定のIPアドレスからの通信を遮断したいときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=drop --add-source=<IPアドレス>
なお、IPアドレスの指定では「192.168.0.0/24」のように、CIDER表記でIPアドレスの範囲を指定することもできます。
追加した設定を削除するときは、以下のようにコマンドを実行します。
# firewall-cmd --zone=drop --remove-source=<IPアドレス>
ICMP(Ping)の遮断
pingコマンドへの応答を遮断したいときは、以下のようにコマンドを実行します。
# firewall-cmd --set-target=DROP --permanent
success
# firewall-cmd --reload
success
設定を戻したいときは、以下のようにコマンドを実行します。
# firewall-cmd --set-target=default --permanent
success
# firewall-cmd --reload
success
なお、Pingコマンドへの応答を遮断する方法としては、上のようにファイアウォールで設定する方法以外に、カーネルパラメータで遮断することもできます。
カーネルパラメータで遮断するときは、テキストエディタで「/etc/sysctl.conf」ファイルを開き、パラメータとして「net.ipv4.icmp_echo_ignore_all = 1」を追記します。
# vi /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 1
追記が完了したら、以下のコマンドで設定を適用します。
# sysctl -p
あとがき
上に紹介したコマンドで、firewaldの基本的な設定は問題なくできるでしょう。ご活用あれ。