server-memo.net

firewalldにユーザ定義サービスを追加

   

firewalldにユーザが定義したサービスを追加する方法です。

fierwalld初期定義サービス

「firewalld」には最初から、ある程度サービスが定義されていて、サービスの定義ファイルは「/usr/lib/firewalld/services」フォルダに格納されています。

# ls /usr/lib/firewalld/services/
RH-Satellite-6.xml       ipsec.xml         pmwebapis.xml
amanda-client.xml        iscsi-target.xml  pop3s.xml
bacula-client.xml        kerberos.xml      postgresql.xml
bacula.xml               kpasswd.xml       proxy-dhcp.xml
dhcp.xml                 ldap.xml          radius.xml
dhcpv6-client.xml        ldaps.xml         rpc-bind.xml
dhcpv6.xml               libvirt-tls.xml   rsyncd.xml
dns.xml                  libvirt.xml       samba-client.xml
freeipa-ldap.xml         mdns.xml          samba.xml
freeipa-ldaps.xml        mountd.xml        smtp.xml
freeipa-replication.xml  ms-wbt.xml        ssh.xml
ftp.xml                  mysql.xml         telnet.xml
high-availability.xml    nfs.xml           tftp-client.xml
http.xml                 ntp.xml           tftp.xml
https.xml                openvpn.xml       transmission-client.xml
imaps.xml                pmcd.xml          vdsm.xml
ipp-client.xml           pmproxy.xml       vnc-server.xml
ipp.xml                  pmwebapi.xml      wbem-https.xml

この中にないサービスの通信を「firewalld」のゾーンに定義するためには、ポートとプロトコルを指定してゾーンに適用させるか、独自にサービスを定義してからサービスをゾーンに適用させる必要があります。

ユーザがサービスを独自に定義するメリットとしては、一目で何のサービスの通信を制御するためのルールなのかがわかるということが挙げられます。

ポートとプロトコルを指定しゾーンに定義する場合、サービスの定義を追加する手間は省けますが、他の人にはそれがなんのアプリケーションで使用されているかが分かりにくくなってしまうというデメリットがあります。

サービスの定義

「firewalld」に独自のサービスを定義するためには、「/etc/firewalld/services」フォルダにサービスの内容を定義したファイルを作成する必要があります。

定義ファイルを作成する際は、「/usr/lib/firewalld/services/」フォルダにある、最初から定義されてるサービスの設定ファイルをコピーして流用すると簡単に作成することができます。

ファイル書式

参考として「/usr/lib/firewalld/services/dns.xml」ファイルを見てみます。

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>DNS</short>
  <description>The Domain Name System (DNS) is used to provide and request host and domain names. 
Enable this option, if you plan to provide a domain name service (e.g. with bind).</description>
  <port protocol="tcp" port="53"/>
  <port protocol="udp" port="53"/>
</service>

設定内容

サービス定義ファイルの設定項目は下記の用になっています。

short サービスの説明
description サービスの詳細説明
port protocol tcpやudp等のプトロコル設定
port ポート番号設定
port ポート番号を指定

サービスの定義ファイル作成

最初から定義されている「dnx.xml」ひな型として、「Maincraftマルチサーバ」用のサービスを作成していきます。

# cp -p /usr/lib/firewalld/services/dns.xml /etc/firewalld/services/minecraft.xml
# vi /etc/firewalld/services/minecraft.xml

設定内容

「short」と「description」にはMinecraft用のサービスであることを記述して、使用するプロトコルには「TCP」を指定して、ポート番号は「25565」番を指定しています。

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Minecraft</short>
  <description>Minecraft Multi Server</description>
  <port protocol="tcp" port="25565"/>
</service>

設定反映

サービ定義ファイルを作成しただけでは「firewalld」から認識されないため、作成したサービスを「firewalld」に反映させる作業行います。

# firewall-cmd --reload
success

サービス追加の確認

「firewall-cmd --get-services」コマンドを実行すると、「firewalld」に登録されているサービスを表示させることが出来るので、作成したサービスが登録されていること確認してください。

# firewall-cmd  --get-services
RH-Satellite-6 amanda-client bacula bacula-client 
dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps 
freeipa-replication ftp high-availability http https 
imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd 
ldap ldaps libvirt libvirt-tls mdns minecraft mountd 
ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi 
pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind 
rsyncd samba samba-client smtp ssh telnet tftp tftp-client 
transmission-client vdsm vnc-server wbem-https

※表示結果は適当なところで改行しています。

ゾーンへのサービス追加

新しく追加したサービスが追加されたことの確認がとれたら、次に作成したサービスをゾーンに登録します。

今回は「public」ゾーンに、サービスを登録していきます。

# firewall-cmd --permanent --zone=public --add-service=minecraft
success

ゾーンにサービスを登録しましたら、「firewall-cmd --reload」コマンドで設定を反映させます。

# firewall-cmd --reload
success

登録確認

サービス登録が完了しましたら、「public」ゾーンの情報を確認してサービスが登録されているか確認をします。

# firewall-cmd --list-all --zone=public
public (default, active)
  interfaces: eno33554984
  sources:
  services: dhcpv6-client minecraft ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

「services: dhcpv6-client minecraft ssh」と表示され、作成した「minecraft」サービスが「public」ゾーンに登録されていることが確認できました。

以上で、作業は完了となります。

 - firewalld