Firewalldの設定方法



●Firewalldの起動

 Firewalldを利用するには、サービスを起動しておく必要があります。
# systemctl start firewalld
# systemctl enable firewalld 

●ファイアーウォールゾーンの設定

 firewalldは内部的にiptablesを利用しているのですが、firewalldとiptablesを併用することはできません。iptablesを利用する場合はfirewalldを停止しておく必要があり、firewalldを利用する場合はiptablesを停止しておく必要があります。
 firewalldは事前にゾーンというものを定義し、そのゾーンに対して許可するサービスを定義していきます。そして定義したゾーンをLinuxサーバ上のNICと紐付けを行います。このゾーンに関してデフォルトで以下のものが定義されています。

ゾーン 説明
block(変更不可) 全てのパケットを破棄しますが、内部から外部への戻りパケットは許可されます。
dmz デフォルトで「ssh」のみ許可されています。
drop(変更不可) 全てのパケットを破棄します。現実的に使用されることはありません。
external デフォルトで「ssh」のみ許可されています。IPマスカレードが有効になっています。
home デフォルトで「dhcpv6-client」、「ipp-client」、「mdns」、「samba-client」、「ssh」が許可されています。
internal デフォルトで「dhcpv6-client」、「ipp-client」、「mdns」、「samba-client」、「ssh」が許可されています。
public デフォルトゾーンです。デフォルトで「ssh」と「dhcpv6-client」のみ許可されています。
trusted(変更不可) 全てのパケットが許可されます。
work デフォルトで「dhcpv6-client」、「ipp-client」、「 ssh」が許可されています。


 デフォルトでは以下のように「public」ゾーンがデフォルトゾーンとしてネットワークインターフェースに適用され、dhcpv6-client、ssh サービスが許可されています。「firewall-cmd」コマンドで様々な操作を行う際に、適用先のゾーン指定(--zone=***)を省略した場合は、このデフォルトゾーンに対して設定が適用されます。
デフォルトゾーンを表示
# firewall-cmd --get-default-zone
public
現在の設定を表示
# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s25
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
定義されている全てのゾーンを表示
# firewall-cmd --list-all-zones
block
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
  .....
  .....
ゾーンを指定して許可されているサービスを表示
# firewall-cmd --list-service --zone=external
ssh
デフォルトゾーンを変更
# firewall-cmd --set-default-zone=external
success

●iptables停止・無効化

 FirewallDとiptables は(サービスとしては)併用できないので、起動している場合は停止します。。そして、起動できないように無効化します(自動起動しないdisableにより起動自体できないようにするmaskを使用)。
# systemctl stop iptables
# systemctl stop ip6tables
# systemctl stop ebtables
# systemctl mask iptables
Created symlink from /etc/systemd/system/iptables.service to /dev/null.
# systemctl mask ip6tables
Created symlink from /etc/systemd/system/ip6tables.service to /dev/null.
# systemctl mask ebtables
Created symlink from /etc/systemd/system/ebtables.service to /dev/null.
# systemctl list-unit-files -t service | grep iptables
iptables.service                            masked  ← masked であることを確認
# systemctl list-unit-files -t service | grep ip6tables
ip6tables.service                           masked  ← masked であることを確認
# systemctl list-unit-files -t service | grep ebtables
ebtables.service                            masked  ← masked であることを確認

●定義されているサービスの一覧

 定義されているサービスの一覧を表示させます。
# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability
http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd
ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius
rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
定義されているサービスの定義ファイルは以下のフォルダ内に保管されています
独自に定義を追加する場合は、該当フォルダ内にXMLファイルを追する必要があります
# ls /usr/lib/firewalld/services
RH-Satellite-6.xml     http.xml        libvirt-tls.xml  pmproxy.xml       samba.xml
amanda-client.xml      https.xml       libvirt.xml      pmwebapi.xml      smtp.xml
bacula-client.xml      imaps.xml       mdns.xml         pmwebapis.xml     ssh.xml
bacula.xml             ipp-client.xml  mountd.xml       pop3s.xml         telnet.xml
dhcp.xml               ipp.xml         ms-wbt.xml       postgresql.xml    tftp-client.xml
dhcpv6-client.xml      ipsec.xml       mysql.xml        proxy-dhcp.xml    tftp.xml
dhcpv6.xml             kerberos.xml    nfs.xml          radius.xml        transmission-client.xml
dns.xml                kpasswd.xml     ntp.xml          rpc-bind.xml      vnc-server.xml
ftp.xml                ldap.xml        openvpn.xml      wbem-https.xml    high-availability.xml
ldaps.xml              pmcd.xml        samba-client.xml

●サービスの追加・削除

 恒久的に変更する場合は「--permanent」オプションを指定します。「--permanent」を指定しない場合、システムを再起動すると設定は元に戻ってしまいます。下記では、上記でデフォルトのゾーンをexternalにしていることに注意してください。
httpを追加する場合の例(設定はすぐに有効となります)
# firewall-cmd --add-service=http
success
# firewall-cmd --list-service
dhcpv6-client http ssh
httpを削除する場合の例
# firewall-cmd --remove-service=http
success
# firewall-cmd --list-service
dhcpv6-client ssh
httpを恒久的に追加する (設定を反映させるためにリロードが必要)
# firewall-cmd --add-service=http --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-service
dhcpv6-client http ssh

●ポートの追加・削除

TCP 465を追加する場合の例
# firewall-cmd --add-port=465/tcp
success
# firewall-cmd --list-port
465/tcp
TCP 465を削除する場合の例
# firewall-cmd --remove-port=22/tcp
success
# firewall-cmd --list-port
 
TCP 465を恒久的に追加する場合の例 (設定を反映させるためにリロードが必要)
# firewall-cmd --add-port=465/tcp --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-port
465/tcp 

●ICMPパケットのタイプ指定

 サービスのみならず許可・拒否するICMPパケットのタイプを指定することもできます。こちらも同様にゾーンを指定しておりますが、デフォルトゾーンの場合は省略可能です。下記の場合、指定するソーンはpublicとなります。
ICMPタイプの一覧表示
# firewall-cmd --get-icmptypes
destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded 
禁止されているICMPタイプを表示
# firewall-cmd --list-icmp-blocks --zone=public
禁止されているICMPタイプに追加
# firewall-cmd --add-icmp-block=echo-request --zone=public
恒久的に禁止されているICMPタイプに追加 
# firewall-cmd --add-icmp-block=echo-request --zone=public --permanent
禁止されるICMPタイプから削除
# firewall-cmd --remove-icmp-block=echo-request
恒久的に禁止されるICMPタイプから削除 
# firewall-cmd --remove-icmp-block=echo-request --permanent

●IPマスカレードの設定

 恒久的に設定するには--permanentオプションを使用する。ゾーンを明示的に指定しなければデフォルトゾーンとなります。
publicゾーンでのIPマスカレードの設定を確認する場合
# firewall-cmd --zone=public --list-icmp-blocks
publicゾーンでIPマスカレードを有効にする場合
# firewall-cmd --zone=public --add-masquerade
publicゾーンでIPマスカレードを無効にする場合
# firewall-cmd --zone=public --remove-masquerade

●ポートフォワードの設定

 恒久的に設定するには--permanentオプションを使用する。ゾーンを明示的に指定しなければデフォルトゾーンとなります。
publicゾーンでのポートフォワードの設定を確認する場合
# firewall-cmd --zone=public --list-forward-ports
publicゾーンでTCP:80宛のパケットをTCP:8080宛に変更する設定を追加する場合
# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
publicゾーンにTCP:80宛のパケットをTCP:8080宛に変更する設定が適用されているか確認する場合
# firewall-cmd --zone=public --query-forward-port=port=80:proto=tcp:toport=8080
publicゾーンでTCP:80宛のパケットをTCP:8080宛に変更する設定を削除する場合
# firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
 toport=8080の部分はtoaddr=AAA.BBB.CCC.DDDのようにIPアドレスで指定することも可能です。

●特定サービスに接続できるネットワークの設定

 FTP及びSSHに接続できるネットワークを設定します。
# firewall-cmd --remove-service=ssh --permanent
# firewall-cmd --remove-service=ssh --reload

# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.0.0.0/8" service name="ftp" accept"
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="172.16.0.0/12 " service name="ftp" accept"
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" service name="ftp" accept"

# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.0.0.0/8" service name="ssh" accept"
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="172.16.0.0/12 " service name="ssh" accept"
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" service name="ssh" accept"

# firewall-cmd --reload
 FTP及びSSHは設定したネットワーク以外からアクセスできなくなります。

●その他

 参照URL:ダイレクトルールを使ったFirewallの強化

 起動時の設定を再読み込みする場合は以下のようにする。
コネクショントラッキングのステート情報は初期化しない場合
# firewall-cmd --reload
コネクショントラッキングのステート情報も初期化する場合
# firewall-cmd --complete-reload
 Firewallの設定を一定時間だけ適用させる場合は以下のようなオプションを使用する。
--timeout=
 全てのネットワーク通信を遮断するパニックモードの有効・無効化は以下のようにする。
パニックモード有効化
# firewall-cmd --panic-on
パニックモード無効化
# firewall-cmd --panic-off


 「SSHへのアクセスを国内に限定する方法」を有効化したことにより、インターネット側からhttp及びhttpsでアクセスできない現象が発生しました。
 原因は、「Rocky 9における、インターネット側からhttp及びhttpsでアクセスできない現象への対応」を参照してください。