CentOS Stream9のファイアウォール設定(firewalld)

CentOS Stream9のファイアウォール設定についてまとめています。

※目次をクリックすると目次の下部にコンテンツが表示されます。

firewalldの概要
1)概要
 
・firewalldは、D-Busインターフェイスを使用して、動的にカスタマイズできるホストベースのファイアウォールを提供するファイアウォールサービスデーモン。
・ルールが変更するたびに、ファイアウォールデーモンを再起動しなくても、ルールの作成、変更、および削除を動的に可能にする。
 
2)firewalld、nftables、iptablesの違い
 
〇firewalld
・簡単なファイアウォールのユースケースに使用。
・使いやすく、このようなシナリオの一般的な使用例に対応している。
 
〇nftables
・nftables ユーティリティーを使用して、ネットワーク全体など、複雑なパフォーマンスに関する重要なファイアウォールを設定。
 
〇iptables
・legacy バックエンドの代わりに nf_tables カーネル API を使用。
・nf_tables API は、iptables コマンドを使用するスクリプトが、RHELで引き続き動作するように、後方互換性を提供。
・新しいファイアウォールスクリプトの場合には、Red Hat は nftables を使用することを推奨。
 
※ファイアウォールサービスがそれぞれに影響し合うことを回避するためには、RHEL ホストでそのうちの 1 つだけを実行し、他のサービスを無効にする。

firewalldのルール定義
firewalld は、ゾーンおよびサービスの概念を使用して、トラフィック管理を簡素化する。
 
(1)ゾーン
 
・前定義したルールセット。
・ネットワークインターフェイス、ソースをゾーンに割り当てることができる。
・trusted などのゾーンでは、デフォルトですべてのトラフィックを許可する。
 
●事前定義したゾーン
・/usr/lib/firewalld/zones/ ディレクトリーに保存。
・修正すると/etc/firewalld/zones/ ディレクトリーにコピーされる。
・利用可能なネットワークインターフェイスに即座に適用される。
 
●事前定義したゾーンのデフォルト設定
〇block
・IPv4 の場合は icmp-host-prohibited メッセージ、IPv6 の場合は icmp6-adm-prohibited メッセージで、すべての着信ネットワーク接続が拒否される。
・システムで開始したネットワーク接続のみが可能。
〇dmz
・公開アクセスは可能だが、内部ネットワークへのアクセスに制限がある非武装地帯にあるコンピューター向け。
・選択した着信接続のみが許可される。
〇drop
・着信ネットワークパケットは、通知なしで遮断。
・発信ネットワーク接続だけが可能。
〇external
・マスカレードをルーター用に特別に有効にした外部ネットワークでの使用向け。
・自分のコンピューターを保護するため、ネットワーク上の他のコンピューターを信頼しない。
・選択した着信接続のみが許可されます。
〇home
・そのネットワークでその他のコンピューターをほぼ信頼できる自宅での使用向け。
・選択した着信接続のみが許可。
〇internal
・そのネットワークでその他のコンピューターをほぼ信頼できる内部ネットワーク向け。
・選択した着信接続のみが許可されます。
〇public
・そのネットワークでその他のコンピューターを信頼できないパブリックエリーア向け。
・選択した着信接続のみが許可。
〇trusted
・すべてのネットワーク接続が許可。
〇work
・そのネットワークで、その他のコンピューターをほぼ信頼できる職場での使用向け。
・選択した着信接続のみが許可。
 
(2)サービス
 
・ネットワーク接続に 1 つ以上のポートまたはアドレスを使用。
・ポートに基づいて接続のフィルターを設定。
・サービスを使用すると、ポートのオープン、プロトコルの定義、パケット転送の有効化などを 1 つ 1 つ行うのではなく、1 回のステップで定義できる。
・firewalld は、明示的に開いていないポートのトラフィックをすべてブロックする。
 
●サービスの定義方法
サービスは、個々の XML 設定ファイルを使用して指定。
・ファイル名:service-name.xmlの形式
・指定するオプションの情報:man ページの firewalld.service(5) で説明
 
●サービスの定義ファイルの保管先
・/etc/firewalld/services/ ディレクトリー(ユーザーがサービスを追加または変更しないと存在しない)
・テンプレートファイル:/usr/lib/firewalld/services/ ディレクトリー
 
●サービスの追加、削除
・グラフィカルな firewall-config ツール
・firewall-cmd、firewall-offline-cmd
※/etc/firewalld/services/ ディレクトリーの XML ファイルを変更することもできる。

firewalldの起動、停止、確認
(1)firewalldの起動、停止
 
1)firewalld の停止
 
〇停止
# systemctl stop firewalld
 
〇システム起動時に自動起動させない設定
# systemctl disable firewalld
 
〇完全に無効化
# systemctl mask firewalld
 
・システム起動時の自動起動だけでなく、手動でのサービス起動も不可。
・firewalld D-Bus インターフェイスにアクセスして firewalldを起動していないこと、そしてその他のサービスが firewalld を求めているかどうかを確認する際にも使用する。
 
2)firewalld の起動
 
〇開始
# systemctl unmask firewalld
# systemctl start firewalld
 
〇システム起動時に自動起動
# systemctl enable firewalld
 
3)永続的な firewalld 設定の確認
 
設定ファイルを手動で編集した後など、firewall-cmd ユーティリティーを使用して変更が正しいことを確認することができる。
 
# firewall-cmd –check-config
success
 
# firewall-cmd –check-config
Error: INVALID_PROTOCOL: ‘public.xml’: ‘tcpx’ not from {‘tcp’|’udp’|’sctp’|’dccp’}
 
(2)firewalld のステータス確認、設定の表示
 
1)ステータス確認
 
〇サービスの状況を表示
# firewall-cmd –state
running
 
〇サービスの状況の詳細表示

# systemctl status firewalld
 firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset>
     Active: active (running) since Wed 2023-11-29 16:00:13 JST; 1 week 0 days >
       Docs: man:firewalld(1)
   Main PID: 589 (firewalld)
      Tasks: 2 (limit: 4634)
     Memory: 35.9M
        CPU: 800ms
     CGroup: /system.slice/firewalld.service
             mq589 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

 
2)設定内容の表示例
 
〇デフォルトゾーンに関連する情報をすべて表示

# firewall-cmd --list-all
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services:
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

 
〇指定したゾーンの設定内容を表示

# firewall-cmd --list-all --zone=public
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

 
〇指定したゾーンで許可されているサービス
# firewall-cmd –list-services –zone=public
cockpit dhcpv6-client ssh

制御設定の方法
(1)サービス、ポートを使って制御設定
 
●サービスを使って制御設定
イ)事前定義されたサービスファイルをそのまま利用
ロ)事前定義されたサービスファイルをカスタマイズして利用
ハ)自らサービスファイルを作成して設定
 
・事前定義されたサービスファイルの使用によって、サービスが使用するプロトコルとポート番号を知らなくても、サービスのポートを開いたり閉じたりできる。
 
●ポートを使って制御設定
・HTTP/HTTPS、SSH、FTPなどのサービスは、サービスに予約されている標準ポートを利用しており、このような場合はサービスとして定義することが推奨されるが、自分で作成したアプリやテスト用・作業用などで利用するポートをポート単位で定義することもできる。
 
●事前定義されたサービスのリストを表示
# 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 bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb 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-tcp llmnr-udp managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd netbios-ns netdata-dashboard nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus prometheus-node-exporter proxy-dhcp 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 synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server 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
 
(2)ゾーン、デフォルトゾーン、アクティブゾーン
 
1)ゾーン
 
・ゾーンは、着信トラフィックをより透過的に管理する概念を表している。
・ゾーンはネットワークインターフェイスに接続されているか、ソースアドレスの範囲に割り当てられる。
・各ゾーンは個別にファイアウォールルールを管理するが、これにより複雑なファイアウォール設定を定義してトラフィックに割り当てることができる。
 
〇すべてのゾーンのリスト(名前のみ)を表示
# firewall-cmd –get-zones
block dmz drop external home internal nm-shared public trusted work
 
〇すべてのゾーンの詳細情報を表示
# firewall-cmd –list-all-zones
 
2)デフォルトゾーンとインターフェイス
 
・システム管理者は、設定ファイルのネットワークインターフェイスにゾーンを割り当てる。
・特定のゾーンに割り当てられないインターフェイスは、デフォルトゾーンに割り当てられる。
 
3)アクティブゾーン
 
・ネットワークインターフェイスに接続されているか、ソースアドレスの範囲に割り当てられているゾーン。
 
〇アクティブゾーン、およびそのゾーンに割り当てられているインターフェイスをリスト表示
# firewall-cmd –get-active-zones
trusted
interfaces: eth0
 
〇別のゾーンにインターフェイスを割り当て
# firewall-cmd –zone=<ゾーン名> –change-interface=<インタフェース名> –permanent
 
※ターゲットとは:着信トラフィックに対するデフォルト動作
〇ACCEPT
・指定したルールで許可されていないパケットを除いた、すべての着信パケットを許可。
〇REJECT
・指定したルールで許可されているパケット以外の着信パケットをすべて拒否。
・firewalld がパケットを拒否すると、送信元マシンに拒否について通知される。
〇DROP
・指定したルールで許可されているパケット以外の着信パケットをすべて破棄。
・firewalld がパケットを破棄すると、ソースマシンにパケット破棄の通知がされない。
〇default
・REJECT と似ているが、特定のシナリオで特別な意味を持つ。

事前定義されたサービスを使って設定
・トラフィックを制御する最も簡単な方法で、事前定義したサービスを firewalld に追加する。
・これにより、必要なすべてのポートが開き、service definition file に従ってその他の設定が変更される。
 
●設定手順例(publicゾーンにhttp、httpsサービスを追加)
①デフォルトゾーンを確認
# firewall-cmd –get-default-zone
public
 
②サービスがすでに許可されていないことを確認
# firewall-cmd –list-services –zone=public
※”public”ゾーンはデフォルトゾーンなので、–zoneオプションは省略可。
 
③http,httpsサービスをpublicゾーンに追加
# firewall-cmd –zone=public –add-service=http –add-service=https
success
# firewall-cmd –list-services –zone=public
http https
 
④新しい設定を永続化
# firewall-cmd –runtime-to-permanent
success
 
⑤ファイアウォールルールをリロード
# firewall-cmd –reload
success

ポートを使って定義
●許可されているポートのリストを表示
例)
# firewall-cmd –list-port –zone=<ゾーン名>
 
※ポートとして開かれているポートのみが表示され、サービスとして開いているポートは表示されない。
 どちらも表示したい場合は、–list-ports ではなく –list-all オプションを使用する。
 
●許可するポートをゾーンに追加
# firewall-cmd –zone=<ゾーン名> –add-port=<ポートナンバー>/<tcp,udp>
新しい設定を永続化
# firewall-cmd –runtime-to-permanent
 
●ポートを閉じる(ゾーンからポートを削除)
・ポートが必要なくなった場合は、ポートをそのままにするとセキュリティーリスクとなるため、使用されなくなったらすぐに不要なポートを閉じることが強く推奨される。
 
# firewall-cmd –zone=<ゾーン名> –remove-port=<ポートナンバー>/<tcp,udp>
新しい設定を永続化
# firewall-cmd –runtime-to-permanent

ソースに応じた着信トラフィックの管理
・ゾーンを使用して、そのソースに基づいて着信トラフィックを管理するゾーンを使用できる。
・これにより、着信トラフィックを分類し、複数のゾーンに向け、トラフィックにより到達できるサービスを許可または拒否できる。
・ソースをゾーンに追加する場合は、ゾーンがアクティブになり、そのソースからの着信トラフィックは、それを介して行われる。

●ゾーンにソースIPアドレスを設定
# firewall-cmd –zone=<ゾーン名> –add-source=<ソースIPアドレス>
新しい設定を永続化
# firewall-cmd –runtime-to-permanent

●ゾーンからソースIPアドレスを削除
〇ゾーンに対して許可されているソースのリストを表示
# firewall-cmd –zone=<ゾーン名> –list-sources

〇ゾーンからソースを削除
# firewall-cmd –zone=<ゾーン名> –remove-source=<ソースIPアドレス>
新しい設定を永続化
# firewall-cmd –runtime-to-permanent

●ソースとサービスを使用して定義する例
・制御する着信トラフィック:192.0.2.0/24 ネットワークからの HTTP トラフィック

①利用可能なすべてのゾーンをリスト
# firewall-cmd –list-all-zones
 ↓
この例では、”default”のターゲットを持つゾーンを選択する

②ソースIP範囲を internal ゾーンに追加し、ソースから発信されるトラフィックをゾーン経由でルーティング
# firewall-cmd –zone=internal –add-source=192.0.2.0/24

③http サービスを internal ゾーンに追加
# firewall-cmd –zone=internal –add-service=http

④新しい設定を永続化
# firewall-cmd –runtime-to-permanent

⑤internal ゾーンがアクティブで、サービスが許可されていることを確認
# firewall-cmd –zone=internal –list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 192.0.2.0/24
services: cockpit dhcpv6-client mdns samba-client ssh http

ソースIPとポート番号で制御する例
1)設定内容
 
・SSH接続(デフォルトの22以外のポート番号:1234)は自端末からのみ許可
・自端末からの接続を”internal”ゾーンに定義
 
2)現状の設定内容確認

①すべてのゾーンのリスト(名前のみ)を表示
# firewall-cmd –get-zones
block dmz drop external home internal nm-shared public trusted work

②現状の設定内容確認

# firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports: 
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

# firewall-cmd --list-all --zone=internal
internal
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

 
3)自端末のIPからのSSHのみ許可する設定をinternalゾーンに追加
 
・既存のinternalゾーンにはhttp、httpsが設定されていないため、これも追加。
・SSHのポート番号は、デフォルトの22ではなく、1234として動作(OpenSSHで設定済み)
 
①ソースIPをinternalゾーンに追加
# firewall-cmd –zone=internal –add-source=12.34.56.78/24
 
②http,httpサービス、SSHのポート番号を internal ゾーンに追加
# firewall-cmd –zone=internal –add-service=http
# firewall-cmd –zone=internal –add-service=https
# firewall-cmd –zone=internal –add-port 1234/tcp
 
③新しい設定を永続化
# firewall-cmd –runtime-to-permanent
 
④設定後の定義内容確認
・internal ゾーンがアクティブで、サービス、ポート番号が許可されていることを確認

# firewall-cmd --list-all --zone=internal
internal (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 12.34.56.78/24
  services: cockpit dhcpv6-client http https mdns samba-client ssh
  ports: 1234/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

 
3)publicゾーンの設定変更
 
・現状は、publicゾーンにもsshが定義されているため、publicゾーンからSSHサービスを削除
 
①SSHサービス、別に定義したポート番号を削除
# firewall-cmd –zone=public –remove-port 1234/tcp
# firewall-cmd –zone=public –remove-service=ssh
 
②新しい設定を永続化
# firewall-cmd –runtime-to-permanent
 
③設定後の定義内容確認

# firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client http https
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください