Rocky Linux 9(RedHat Enterprise Linux 9のつもりで使っています)では、サーバープログラム(WEBサーバーとか)を立ち上げても、他のPCなどからネットワーク越しにアクセスしても繋がりません。
これは Rocky Linux 9はセキュリティを強化するためのファイアウォール設定がデフォルトで有効になっているからです。
WindowsOSにも「セキュリティが強化された Windows Defender ファイアウォール」ってプログラムがスタートメニューにありますが、あれと同じと考えておけば良いでしょう。
Rocky Linux 9では OSの netfilter(及び nftable)という機能とそれを管理するサービスの firewalld(Dynamic Firewall Manager)が動いています。
firewalld に設定を依頼するのが firewall-cmdコマンド(firewalld command line client)となっていて、関係を図にするとこんな感じです。
やや複雑な構成になっていますが、サーバーに入ってくるネットワークのデータ(パケットといいます)をフィルタリングする機能が提供されていて firewall-cmdコマンドで設定を変えていく、と覚えておけばとりあえず OKだと思います。
前提としてネットワークから入ってくるデータは全て遮断されている所からスタートです。
その上で Rocky Linux 9のインストール直後のフィルタリング設定がどうなっているかを firewall-cmdコマンドで取ってみます。
rootでないと実行できないので sudoを使います。
[subro@RockyLinux ~]$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
サービス名とポート番号(+プロトコル)で開放設定ができるんですが
サービスでは cockpit(RHELのGUI版設定ツール)・dhcpv6-client(IPv6の DHCPクライアント)・ssh(セキュアーシェル) の 3つが開放されています。
ポートでの指定はありませんでした。
サービス設定として予め登録されているものに何があるかというと、--get-servicesオプションで一覧を取れます。
(横に長過ぎるので改行しています)
[subro@RockyLinux ~]$ sudo firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client
amanda-k5-client amqp amqps
apcupsd audit bacula
bacula-client bb bgp
bitcoin bitcoin-rpc bitcoin-testnet
bitcoin-testnet-rpc bittorrent-lsd ceph
ceph-mon cfengine cockpit
collectd condor-collector 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 grafana gre
high-availability http https
imap imaps 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-controller-manager kube-scheduler kubelet-worker
ldap ldaps libvirt
libvirt-tls lightning-network llmnr
managesieve matrix mdns
memcache minidlna mongodb
mosh mountd mqtt
mqtt-tls ms-wbt mssql
murmur mysql nbd
netbios-ns nfs nfs3
nmea-0183 nrpe ntp
nut openvpn ovirt-imageio
ovirt-storageconsole ovirt-vmconsole plex
pmcd pmproxy pmwebapi
pmwebapis pop3 pop3s
postgresql privoxy prometheus
proxy-dhcp 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 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 wsman
wsmans xdmcp xmpp-bosh
xmpp-client xmpp-local xmpp-server
zabbix-agent zabbix-server
どこかで聞いたような聞いてないような有名所は押さえられています。
サービス設定は [/usr/lib/firewalld/services]ディレクトリ以下の xmlファイルです。
例として sshのを見てみましょう。
[subro@RockyLinux ~]$ cat /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
プロトコルが TCPで、ポートが22番を開放するって記述になっています。
これが有効になっているので、sshコマンドで外部からアクセスできるのです。
では例えば、Apacheや NGiNXなどをインストールして WEBサーバーを立ち上げたとします。
プロトコルは http[80/tcp] として、これを新たに開放するようにしてみましょう。
やり方は 2つ、サービス名 [http] で設定するか、ポート番号 [80/tcp] で設定するかのいずれかですので、両方のやり方を書いておきます。
実際やるのは片方で OKです。
サービス名の方
[subro@RockyLinux ~]$ sudo firewall-cmd --permanent --add-service=http
success
ポート番号の方
[subro@RockyLinux ~]$ sudo firewall-cmd --permanent --add-port=80/tcp
success
--permanent というオプションは何か。
netfilterはオンメモリで動いていて、このオプションを指定しない場合は現在のメモリに対して設定を行うことになりますが、それだとシャットダウン時に設定が消えてしまいます。
これを恒久的な設定にするためのオプションです。
設定後の結果を取ってみます。
[subro@RockyLinux ~]$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
何も変わってません…。
--permanent オプションのために、メモリへの設定変更がされていないためです。
設定を再読込させます。
[subro@RockyLinux ~]$ sudo firewall-cmd --reload
success
改めて設定を取ってみます。
[subro@RockyLinux ~]$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client http ssh
ports: 80/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
設定が反映されていますね。
設定項目の削除は add を remove に変えれば基本的には大丈夫でしょう。
netfilterの機能はもっと細かくて、例えばアクセス元の IPをある程度制限することもできます。
firewalldのマニュアルはこちらですので、もっとセキュリティを高めたいという場合はあたって見ると良いでしょう。
Documentation
firewalldと firewall-cmdの組み合わせではなく、nftablesサービスと nftコマンドでの設定をすることもできます。
(但しどちらか片方)
詳しくは nftコマンドから調べてみれば、情報を得られると思います。
==========
セキュリティのお勉強ではなく、単にサーバープログラムを RHEL系の Linuxで動かすだけであれば、ここに書いたレベルで OKかと思います。
この仕組みを詳しくお勉強したい場合は、netfilterのチェーンという概念まで入っていくことになります。
これ、私が受験したときの LPIC2の試験範囲でしたね。
firewalldを謳った書籍は過去にこれだけのようです。
確かに他では見たことがありません。
CentOS 7システム管理ガイド systemd/NetworkManager/Firewalld徹底攻略【電子書籍】[ デージーネット ] 価格:2,574円 |
ただこの辺のセキュリティを扱った本であれば必ず firewalldを扱っていると思います。
CentOS 8で作るネットワークサーバ構築ガイド [ サーバ構築研究会 ] 価格:4,950円 |
価格:3,960円 |
TECHNICAL MASTER はじめてのCentOS 8 Linuxサーバエンジニア入門編 [ デージーネット ] 価格:3,300円 |