CentOS Stream9のファイアウォール設定についてまとめています。
※目次をクリックすると目次の下部にコンテンツが表示されます。
- 1.firewalldの概要
- 2.firewalldのルール定義
- 3.firewalldの起動、停止、確認
- 4.制御設定の方法
- 5.事前定義されたサービスを使って設定
- 6.ポートを使って定義
- 7.ソースに応じた着信トラフィックの管理
- 8.ソースIPとポート番号で制御する例
・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 つだけを実行し、他のサービスを無効にする。
(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 ファイルを変更することもできる。
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
●サービスを使って制御設定
イ)事前定義されたサービスファイルをそのまま利用
ロ)事前定義されたサービスファイルをカスタマイズして利用
ハ)自らサービスファイルを作成して設定
・事前定義されたサービスファイルの使用によって、サービスが使用するプロトコルとポート番号を知らなくても、サービスのポートを開いたり閉じたりできる。
●ポートを使って制御設定
・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 と似ているが、特定のシナリオで特別な意味を持つ。
・これにより、必要なすべてのポートが開き、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
…
・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: