02 Jan 2015, 01:36

xinetdを使ってLinux上のサービスを常時起動せずに利用する

使用頻度は低いが、常に可動させておきたいサービスをどう管理するか。使用頻度の低いサービスのデーモンをメモリに常駐させておくのはサーバのリソース効率が悪いというのは言うまでもないだろう。
そこでスーパーサーバ(代表的なものにxinted)というたぐいのものを使うことで、使用頻度の低いサービスの窓口のサービスのみ起動しておき、要求があったときだけ特定のサービスを起動させることが可能だ。

スーパーサーバを実際に触ってみたのでメモする。

スーパーサーバというと代表的なものにinetdとxinetdがあるが、
xinetdはinetdの拡張版で、アクセス制御などの機能を搭載しているとのことだったので、今回はxinetdを設定してみることにした。

1. 事前準備

試した環境

Vagrantで構築したCentOS 6.5
(仮想環境のIPアドレスは192.168.33.10)

まずはスーパーサーバで管理するサービスを考えなければならない。
SSHとかhttpdは利用される頻度が非常に高いので、今回はFTPdにしてみることにした。
その他の候補だと、telnetPOP3などのサービスも検討していた。

※本来論でいうと複数のサービスをxinetdで管理対象とするからこそ意味があるので注意。

まずはxinetdとvsftpをインストール

``` $ sudo yum install xinetd vsftpd ```


xinetdどうこうの前に、ftp接続がきちんとできるか確認するのでサービスを起動。

``` $ sudo service vsftpd start ```


ローカルPCから接続できることを確認。

``` $ ftp 192.168.33.10 Connected to 192.168.33.10. 220 (vsFTPd 2.2.2) Name (192.168.33.10:username): ```

2. xinetdの設定

xinetdの基本設定は/etc/xinetd.confにかかれており、
xinetdで管理する各サービスの設定は/etc/xinetd.d/配下に書く。

ftpの設定を以下の通りにした。
"service"のあとに書くサービス名称は/etc/servicesに定義されているものを記載する。
vsftpとか書いても動かないので注意。

$ sudo vim /etc/xinetd.d/ftp
service ftp
{
        disable         = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/vsftpd
        log_on_failure  += USERID
}
 

設定項目については以下参照。
xinetd の設定

これでxinetdを起動

$ sudo service xinetd start 

(補足) /etc/servicesってなにもの?

/etc/servicesがなにか気になったので一応調べると。

サービス名とそこで使われるポート番号、プロトコル(tcp/udp)との 対応関係を記述したファイルが /etc/services です。 このファイルは 単なるサービス名のデータベースで、それ自体では何の働きもありませ んが、netstat コマンドや次の inetd などで参照されます。 (http://www.wakhok.ac.jp/~kanayama/summer/02/site/node43.html)

3. xinetdを使ってFTPで接続してみる

xinetdが"起動している"ことと、vsftpdが"起動していない"ことを確認しておく。

$ sudo service xinetd status
xinetd (pid  3521) is running...

$ sudo service vsftpd status
vsftpd is stopped 


ローカルPCからFTP接続をしてみるが、すぐにコネクションが切られた。

$ ftp 192.168.33.10
Connected to 192.168.33.10.
421 Service not available, remote server has closed connection. 

syslogを確認してみると接続できているようだがその後すぐに切断されているようにみえる。vsftpd側の設定を疑ってみることにした。

$ sudo tail /var/log/message
Jan  1 15:07:25 server xinetd[3335]: START: ftp pid=3337 from=::ffff:192.168.33.1
Jan  1 15:07:28 server xinetd[3335]: EXIT: ftp status=1 pid=3337 duration=3(sec) 

4. vsftpdの設定

vsftpd側で以下の設定をいじる必要があった。

$ sudo vim /etc/vsftpd/vsftpd.conf
listen=NO
 

vsftpdのlistenの設定は以下のとおり。

FTP コントロールポート (21) への接続要求を vsftpd 自身で見張るか。 YES の状態を「スタンドアローンモード」と呼ぶ。 inetd や後述の tcpserver を経由する場合は NO にする。 (http://www.asahi-net.or.jp/~aa4t-nngk/ftpd.html)

5. FTP接続の再チャレンジ

ローカルPCから再度FTP接続を試みる。

$ ftp 192.168.33.10
Connected to 192.168.33.10.
220 (vsFTPd 2.2.2)
Name (192.168.33.10:username): 

無事につながった!
vsftpdサービスを停止しているのにftp接続ができる!

ftp接続前と接続中、接続後でプロセスを確認してみる。

> 接続前
$ ps -ef | grep ftp
vagrant   3552  2742  0 16:17 pts/0    00:00:00 grep ftp

> 接続中
> 接続中のみvsftpdのプロセスが立ち上がっている。
$ ps -ef | grep ftp
nobody    3555  3521  0 16:18 ?        00:00:00 vsftpd
vagrant   3557  3555  0 16:18 ?        00:00:00 vsftpd
vagrant   3559  2742  0 16:18 pts/0    00:00:00 grep ftp

> 接続終了後
$ ps -ef | grep ftp
vagrant   3552  2742  0 16:17 pts/0    00:00:00 grep ftp 


プロセスツリーを見てみると、xinetdプロセスがvsftpdを起動していることがわかる。

> 接続前
$ pstree -p
init(1)-+-VBoxService(1003)-+-{VBoxService}(1004)
        |
        | (略)
        |
        `-xinetd(3521)

> 接続中
$ pstree -p
init(1)-+-VBoxService(1003)-+-{VBoxService}(1004)
        |
        | (略)
        |
        `-xinetd(3521)---vsftpd(3562)---vsftpd(3563) 


サービスを起動しておかなくてもxinetd経由で起動できることが確認できた。
クラウド時代で言うサーバレスの概念の大本とも言える。

関連する記事はこちら
  • Packerやる前にKickstartはじめよう (2015/07/31)
  • Ansibleで最新のMySQLをインストールする。MySQL-shared-compatの役割。 (2015/04/15)
  • SSHエージェントフォワード後に他のユーザでgit cloneする(鍵を使う)ことに関する考察 (2015/04/05)
  • Ruby, thin(bundler利用)を使った環境でのアプリの自動起動設定 (2015/02/22)
  • Ansible、コマンド実行結果をokにする(冪等性を保つ方法) (2015/02/02)
  • comments powered by Disqus
    このエントリーをはてなブックマークに追加