読者です 読者をやめる 読者になる 読者になる

Goldstine研究所

mosuke5's tech blog

ブログ移転しました。5秒後にリダイレクトします。

スーパーサーバってなに? xinetdでサービスを常駐起動せずに利用する

使用頻度の低いサービスのデーモンをメモリに常駐させておくのは効率が悪い。
そこでスーパーサーバという使用頻度の低いサービスの窓口のサービスのみ起動しておき、要求があったときだけ特定のサービスを起動させることが可能らしい。

ということで、そのスーパーサーバとやらを実際に触ってみた。

スーパーサーバというとinetdとxinetdがあるらしいが、
xinetdはinetdの拡張版で、アクセス制御などの機能を搭載しているとのこと。

今回はxinetdを設定してみる。

1. 事前準備

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

まずはスーパーサーバで管理するサービスを考えなければならない。
SSHとかhttpはどう考えてもスーパーサーバの管理するようなものではないだろうし…
FTPtelnetPOP3なんかのサービスに利用されることが多いそう?(このへんよくわかない)

今回はFTPをスーパーサーバの管理対象とした。
※本来は複数のサービスを管理対象とするからこそ意味がある。

まずは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を確認してみると。

$ 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)

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

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経由で起動できるんですね。
これはこれで使い道あるかもしれぬ。