■ スーパーサーバ
スーパーサーバとはひとことで言ってサーバの起動と停止を制御するサーバである。サーバの中にはXサーバのように常時起動してリクエストを待っているものがあるかと思えば、telnetのようにめったにリクエストされないものやpopのように1リクエスト当たりの稼働時間が短いものもある。
このようなサーバアプリの性格の違いを考えると、すべてのサーバを起動したままシステムに常駐させておくのは、あきらかにリソースの無駄遣いとなってしまう。 システムにとって望ましいのは、必要なサーバが必要なときにだけ動いていることである。そこで、別の常駐プログラムに入ってくるリクエストを監視させ、リクエストされたときだけそのサーバを起動すれば、リソースの節約に役立つ。このような役目でシステムに常駐するプログラムのことをスーパーサーバと呼ぶ。スーパーサーバはその「リクエストを仲介する」という動作原理から、登録されたサーバへのアクセスを制御することができる。
fig1
xinetd によるサーバの起動と停止

なお、サーバの起動モードについてはそれぞれのmanページを参照すること。たとえば
Apache を xinetd 経由で起動することも httpd の起動モードを指定することによって可能である。
■ xinetdとinetd
カーネル2.4(Redhat
Linux ではver.7 から)におけるスーパーサーバとして採用された
xinetd
は inetd の拡張版だが、その設定に関してはかなりの相違がある。たとえば、アクセス制限の設定について
inetd では TCP_Wrappers を使い /etc/hosts.allow および/etc/hosts.deny
に設定を書くが、xinetd ではその必要がない。そのかわりに
xinetd ではアクセス制御用ファイルとして /etc/xinetd.d
以下にデーモンそれぞれの名前のついたファイルが用意されている。たとえば
xinetdによって制御されるtelnet や ftp などでは/etc/xinetd.d
以下 /etc/xinetd.d/swat のようにそれぞれの名前のファイルがある。以下に
TeraTerm からアクセスした RedHat
8 の初期ファイルを例示する。

一方、xinetd
自身の設定ファイルは /etc/xinetd.conf である。以下に初期設定を示す。
# #
Simple configuration file for xinetd # # Some
defaults, and include /etc/xinetd.d/
defaults { instances
=
60 # 同時接続数の最大値。unlimited
(無制限)にしないこと。 log_type
=
SYSLOG authpriv #
syslog のファシリティを authpriv に設定 log_on_success
= HOST PID log_on_failure
=
HOST cps
=
25 30 # 一秒間に接続できるコネクション数と再アクセスまでの秒数を引数に指定 }
includedir
/etc/xinetd.d
|
各種デーモン設定ファイルについては、別項を参照のこと。なお、inetd
から xinetd へ移行する場合は inetdconvert というコマンドでinetd.conf
から xinetd.conf を作成することが可能である。
■ xinetd.conf
先に述べたとおり、xinetd
ではドメイン名や IP アドレスでのアクセス制御やアクセス時間の制限、接続回数の制限などができる。/etc/xinetd.conf
の各行の意味を簡単に示す。
defaults
#
管理するデーモンのデフォルト設定 { instance =
60 #
起動できるデーモンの最大数 log_type = SYSLOG authpriv #
syslogへの出力方法の指定(ファシリティにauthprivを指定)
log_on_success
= HOST PID #
ログインに成功した場合、ホスト名とプロセスIDをlogに記述
log_on_failure
= HOST RECORD #
ログインに失敗した場合、ホスト名と起動失敗のメッセージをlogに記述 } includedir
/etc/xinetd.d
#
設定ファイルのディレクトリパスの定義
|
■ 各種デーモン設定ファイル
xinetd
をインストールすると、各種デーモンの設定ファイルのサンプルが自動的に
/etc/xinetd.d 以下に置かれる。各デーモンを動作させたい場合は、このファイルの中の
disable 行を no にしておけばよい。( disable が no という意味です。disable
が yes では動かないこと、おわかりですね?)以下に fingerd
の初期設定ファイルを例示する。
[root@server
xinetd.d]# less finger
#
default: on # description: The finger server answers
finger requests. Finger is \ # a
protocol that allows remote users to see information
such \ # as login
name and last login time for local users.
service
finger { socket_type
= stream # サービスタイプがTCP wait
=
no # TCPならnoでUDPならyes user
=
nobody #
nobodyのユーザ権限で起動 server
=
/usr/sbin/in.fingerd # サーバのデーモンルートの指定 disable
= yes
# 起動は不可 }
|
その他の重要な設定項目として以下のようなものがある。
server_args
= # サーバへのコマンドラインオプションを指定
log_on_success += DURATION USERID
# 成功時はデフォルトの指定に加えて接続時間・ユーザIDを記録 log_on_failure
+= USERID # 失敗時はデフォルトの指定に加えてユーザIDを記録 nice
= 7
# ナイスレベルの設定
|
なお、設定を変更した場合は必ずxinetdを再起動する必要がある。通常は以下のように起動スクリプトによって再起動する。
/etc/rc.d/init.d/xinetd
restart
これは service xinetd restart でもよい。さらに次のコマンドでサーバプロセスにシグナルを送ることによっても再起動できる。
killall
-HUP xinetd
■ 基本的なアクセス制御
これらの設定ファイルでは
TCP_Wrappers のようなアクセス制限ができる。各種デーモンごとにアクセス制限をかける場合はデーモン用の設定ファイルに設定を書き、xinetd
全体にアクセス制限をかけたい場合は
xinetd.conf に以下の2種類のリードによる記述を施せばよい。
no_access
only_from
no_access
は拒否するホストを指定し、 only_from は許可するホストを指定する。指定の様式はIPアドレスとドメイン名によるものが主だが、他にもいくつかあるので以下の例を参照のこと。
IPアドレスによるアクセス制御
|
only_from
= 192.168.1.0 192.168.1.0/255.255.255.0
の範囲に対してアクセスを許可 only_from = 192.168.1.0/24 192.168.1.0/255.255.255.0
の範囲に対してアクセスを許可 only_from = 192.168.1.1
192.168.1.2 192.168.1.1
と 192.168.1.2 だけアクセスを許可
|
ホスト名またはドメイン名によるアクセス制御
|
only_from =
localhost
xinetd
が動作しているホスト(自分自身)だけアクセスを許可 only_from
= user.domain.ne.jp ホスト
user.domain.ne.jp に対してだけアクセスを許可 only_from
= .domain.ne.jp .domain.ne.jp
に属するすべてのホストに対してアクセスを許可 only_from
= hostname ホスト名で定義されたホストにだけアクセスを許可
|
アクセスを拒否したい場合は上記の
"only_from = " を "no_access = " に変えればよい。
コラム
: xinetd における hosts.allow および hosts.deny
ファイル
xinetd
経由で起動するデーモンが複数あるとき、他のサービスとの兼ね合いで簡単には
xinetd に再起動をかけられないケースがしばしばある。このような場合、hosts.allow
および hosts.deny にアクセス制限を追加して、サービスを動かしたまま一時的に設定を変更することができる。このようなことができるのは
xinetd がサービスを起動するとき、最初に
hosts.allow および hosts.deny を参照するからである。両ファイルの設定変更はアクセス制御に即時反映するので、継続稼動が前提となっているユーザ数の多いFTPサイトのように、うかつな再起動ができない環境ではアクセス制御の変更に必須技術となる。
一般に、hosts.allow
および hosts.deny ファイルは inetd
の遺物と誤解されている感があるが、実際にはこのファイルを使うデーモンは
inetd だけではなく、他にも sshd やポートマッパ(portmap)などがある。さらにもうひとつ付け加えると
inetd 時代、しばしば併用された TCP_Wrappers
(tcpd) は xinetd とも併用が可能である。なお、TCP_Wrappwes
の基本となるライブラリは libwrap.a によって供給されており、RedHat
では tcp_wrappers のRPMパッケージにバンドルされているので、通常は特に併用を意識する必要はない。 以下に参考として
telnet における tcpd 併用時の明示的な設定例を示す。ここではサーバとして
tcpd を指定し、サーバ起動時の引数として
/usr/sbin/in.telnetd を与えている。
service telnet
{
flags = REUSE NAMEINARGS
protocol = tcp
socket_type = stream
wait = no
user = telnetd
server = /usr/sbin/tcpd
server_args = /usr/sbin/in.telnetd
}
(筆者注:この項目はM.田邊氏のご指摘をもとに加筆しました。謹んでご協力に感謝申し上げます。)
|
■ アクセス時間帯の設定
次にアクセスを許可する時間帯を指定する方法を紹介する。
access_times
= 17:30-22:00
この設定例では 17:30-22:00 の間だけアクセス許可する。ただし、
0:00 をはさんだ時間設定はできないので、0時をはさんで両日にわたる設定を施したい場合は次のように表記する。xinetd
の時間制限は分単位であるため、これで動作するはずである。
access_times
= 17:30-23:59 0:00-9:00
■ アクセスログ
syslogd
に渡さずに特定のファイルでアクセスログを取りたい場合は、次のように
/etc/xinetd.conf の log_type 行を書き換えてパスとファイル名を指定する。
log_type
= FILE /var/log/xinetdlog # ログを/var/log以下の
xinetdlog というファイルに掃き出す
この場合は
touch
/var/log/xinetdlog で前もって空ファイルを作っておくこと。
|