systemd VS xinetd

こんにちは。サイオステクノロジー OSS サポート担当何敏欽です。

systemd のソケットアクティベーション実装

systemd は、Linux の init システムを置き換えることを第一の目標としています。現在主要な Linux ディストリビューションのほとんどは systemd をデフォルトの init システムとして採用しており、もはや systemd は Linux の init システムであると言えます。

systemd の中核的な機能の 1つ、ソケットアクティベーション実装は xinetd を置換える実装になります。xinetd がサービスのかわりに socket を待つように、systemd が {socket, device, path, dbus} を待つことができます。ソケットアクティベーションは initd に似た動きをしますが、initd よりもっと多くの働きをし、多くの利点があります。以下にいくつか利点を挙げます。

  • サービスの設定と開発を単純化する
  • 例えば、依存関係を明示的に設定する必要がなくなり、ユーザスペースでのサービスのスタートアップを順序化する必要がなくなります。

  • サービスがダウンしても、ソケットはそのまま残り、メッセージをロストすることはない。
  • クラッシュしたサービスが再起動したら、サービスが残してしまったものを引き継ぐことができます。

xinetd を systemd に変換するには?

systemd のソケットアクティベーションの実装はこんなに利点があるから、システム要件で RHEL5、RHEL6 を RHEL7 に移行する必要がある場合、RHEL5、RHEL6 における xinetd 上のサービスを RHEL7 の systemd 配下のサービスとして動作させたいと思いますよね。では xinetd を systemd に変換したい場合はどうしますか。例えば、xinetd の設定ファイルは下記とします。

systemd に変換する場合は、以下のように hoge.socket、hoge.service ユニットファイルを作成する必要があります。

その後、以下のコマンドを実行して、ソケットの状態を有効にし、start させます。

これで xinetd を systemd に変換しました。

systemd は xinetd を完全に置き換えられる?

systemd は xinetd を完全に置き換えられるのでしょうか。残念ながら、systemd は xinetd を完全に置き換えることができません。systemd において、xinetd の機能 instances に相当する設定項目は LimitNPROC で、port に相当する設定項目は ListenStream など、xinetd で設定したいものは systemd においても設定は可能です。しかしながら、xinetd の一部機能は xinetd で使用することしかできません。ここで一例として、xinetd の設定項目 only_from を説明していきます。

man xinetd.conf を確認すると、only_from はアクセス可能なリモートホストを指定する設定です。

man xinetd.conf より抜粋

systemd における only_from に相当する設定項目はありません。そのため、RHEL7 でアクセスを制限したい場合は、firewalld、iptables を使用する必要があります。今回は、firewalld を用いて RHEL7.5 で自作サービス hoge を特定の IP (192.100.0.0/16) に対してのみ許可したい設定をやってみたいと思います。

まず、自作サービス hoge をサービス化します。

次に firewalld を設定します。

これで hoge サービスを 192.100.0.0/16 に対してのみ許可したい設定ができました。
firewall-cmd はたくさんのオプションがありますので、詳細は man 1 firewall-cmd でご参照ください。

以上で xinetd を systemd に変換する方法、only_from の代わりに firewall を用いてアクセスを制限する方法を説明しました。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*