Linuxのfirewall-cmdでのファイアウォールの設定方法

Linuxのfirewall-cmdでのファイアウォールの設定方法

ここでは、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の基本的な設定は問題なくできるでしょう。ご活用あれ。