初めに #
アプリケーションで使用する特定のポートを開放したいが、firewalld のサービス一覧に見当たらないと困ったことはありませんか?
firewalld には、HTTP や SSH などの主要なサービスがあらかじめ定義されています。
しかし、自作アプリケーションや特定のソフトウェアなど、デフォルトに含まれていない カスタムポート を使用する場合は、自分で設定を追加する必要があります。
本記事では、Red Hat系Linux(CentOSやAlmaLinuxなど)で採用されているfirewalldにおいて、独自のサービス(ユーザー定義サービス)を追加する方法を初心者向けに解説します。
firewalldとは? #
firewalld(ファイアウォールディー)は、Red Hat系のLinuxで標準採用されているファイアウォール管理ツールです。
iptables や nftables をバックエンドに持ち、ユーザーが設定したルールに基づいてネットワーク通信を制御することができます。
従来の iptables ではルールを直接記述する必要があり、設定が複雑になりやすいという課題がありました。
一方、firewalld ではゾーン(zone) と サービス(service) という概念を導入することで、環境や用途に応じた柔軟な設定が可能になっています。
以下はfirewalldの公式リポジトリとなっております。
Stateful zone based firewall daemon with D-Bus interface
サービス一覧の確認 #
firewalld ではデフォルトで多数のサービスが事前定義されています。
サービスとは、特定のプロトコルとポート番号の組み合わせに名前を付けたものです。
サービスを利用することにより複数のポート設定をグループ単位でまとめて管理できます。
例えば「http」サービスはTCP 80番ポート、「ssh」サービスはTCP 22番ポートというように、よく使われる通信を名前で扱えるようになっています。
そのため、個別にポート番号を指定するよりも、サービスを利用する方が管理コストを削減し設定ミスを防ぐことできます。
環境の firewalld に定義されているサービス一覧は、次のコマンドで確認することできます。
firewall-cmd --get-services
以下は AlmaLinux8 環境にてコマンドを実施した例となります。
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming submission svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server
このように有名なサービスは一通り定義されていますが、自作アプリケーションでカスタムポートを利用する場合は独自に作成する必要があります。
サービスの追加 #
それでは実際に独自サービスの追加を行う方法をご紹介します。
サービスを追加するには、XML形式の定義ファイルを所定のディレクトリに作成する必要があります。
ユーザー自身がサービスを追加する場合は以下のディレクトリに作成する必要があります。
/etc/firewalld/services
ここでは例として「 custom 」というサービスを追加してみます。
初めにエディタコマンドを利用し以下のファイルを作成します。
vi /etc/firewalld/services/custom.xml
ファイルを作成したら、その中にサービスの定義をXML形式で記述します。
以下は定義に必要な項目となります。
| タグ名 | 説明 | 設定例 |
|---|---|---|
<short> |
サービス名を指定します。 | <short>myapp</short> |
<description> |
サービスの説明文を自由に記載します。 | <description>My custom application service</description> |
<port> |
開放するポート番号と使用プロトコル(TCP/UDP)を指定します。 | <port protocol="tcp" port="7777"/> |
以下は custom.xml の記述例となります。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>custom</short>
<description>custom service</description>
<port protocol="tcp" port="12345"/>
<port protocol="udp" port="54321"/>
</service>
今回の例では TCPの 12345 番ポートとUDPの 54321 番ポートを指定しています。
作成した custom サービスを指定することで上記2つのポートを同時に開放することができます。
以上で独自サービスの定義ファイルの作成は完了です。
firewalldのリロード #
新しいサービス定義を追加した後は、firewalld に変更内容を読み込ませるためリロードを行う必要があります。
リロードは以下のコマンドで実行可能です。
firewall-cmd --reload
また、systemctl コマンドでもリロードは可能となっております。
systemctl reload firewalld
上記のいずれかのコマンドを実行すると、firewalld が設定を再読み込みし、新しく追加したサービス定義がシステムに反映されます。
追加したサービスの確認 #
設定が完了したら先ほどと同じサービス一覧表示コマンドで custom サービスが含まれているかをチェックしてください。
firewall-cmd --get-services
実行結果の一覧に、新しく custom というサービス名が含まれていれば成功です。
出力を一部抜粋すると次のように表示されます。
condor-collector ctdb custom dhcp dhcpv6 dhcpv6-client distcc dns ...
無事に独自サービスの定義を firewalld に登録することできました!!
作成したサービスは他のサービスと同様に、必要に応じてファイアウォールルールに適用することができます。
ぜひ独自サービスの作成を活用してみてください!