inetd(8) は複数のデーモンに対する接続を制御するので、 “インターネットスーパサーバ” と呼ばれます。 ネットワークサービスを提供するプログラムは、 一般的にデーモン呼ばれます。inetd は他のデーモンを管理するサーバを努めます。 接続が inetd によって受け付けられると、 inetd は接続がどのデーモンに対するものか判断して、 そのデーモンを起動し、ソケットを渡します。 inetd を 1 つ実行することにより、 それぞれのデーモンをスタンドアロンモードで実行することに比べ、 全体としてのシステム負荷を減らします。
基本的に、inetd は他のデーモンを起動するために使用されます。しかし、 chargen, auth および daytime のようなささいなプロトコルは直接扱われます。
この節ではコマンドラインオプションおよび設定ファイル /etc/inetd.conf による inetd の設定の基本を説明します。
inetd は /etc/rc.conf の仕組によって初期化されます。 デフォルトでは inetd_enable オプションは “NO” に設定されています。 しかし多くの場合、sysinstall でセキュリティプロファイルを medium に設定することにより、有効化されます。
inetd_enable="YES"または
inetd_enable="NO"を /etc/rc.conf に置くことで、起動時に inetd を有効または無効にできます。
さらに inetd_flags オプションによって、 いろいろなコマンドラインオプションを inetd に渡すことができます。
inetd 書式
inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address |
hostname] [-p filename] [-R rate] [configuration file]
デバッグモードにします。
成功した接続のログをとります。
外部サービスに対して TCP Wrapper を有効にします (デフォルト)。
inetd 組み込みの内部サービスに対して TCP Wrapper を有効にします (デフォルト)。
サービス毎に同時に起動可能な最大値のデフォルトを指定します。
デフォルトでは無制限です。サービスごとに指定する max-child
パラメータで上書きできます。
1 分間にひとつの IP アドレスから起動されるサービスの、
最大値のデフォルトを指定します。デフォルトは無制限です。 サービスごとに指定する
max-connections-per-ip-per-minute
パラメータで上書きできます。
あるサービスを 1 分間に起動できる最大の数を指定します。 デフォルトは 256 です。rate に 0 を指定すると、 起動可能な数は無制限になります。
バインドする IP アドレスを一つ指定します。 代わりにホスト名も指定できます。この場合、ホスト名に対応する IPv4 または IPv6 アドレスが使用されます。通常 inetd が jail(8) 内で起動される時点で、ホスト名が指定されます。この場合、 ホスト名は jail(8) 環境に対応するものです。
ホスト名指定が使用され、 IPv4 および IPv6 両方にバインドしたい場合、 /etc/inetd.conf の各サービスに対して、 各バインドに対する適切なプロトコルのエントリが必要です。 たとえば TCP ベースのサービスは、 ひとつはプロトコルに “tcp4” を使用し、 もう一つは “tcp6” を使用する、 2 つのエントリが必要です。
デフォルトとは異なる PID を保持するファイルを指定します。
/etc/rc.conf 内の inetd_flags オプションを用いて、これらのオプションを inetd に渡すことができます。デフォルトでは inetd_flags は “-wW” に設定されており、 これは inetd の内部および外部サービスに対して TCP wrapper を有効にします。 初心者ユーザはこれらのパラメータを変更する必要は通常ありませんし、 /etc/rc.conf に入力する必要もありません。
注意: 外部サービスは、接続を受け取ったときに起動される inetd の外部にあるデーモンで、 それに対して、内部サービスは inetd 自身が提供する内部のデーモンです。
inetd の設定は /etc/inetd.conf ファイルによって制御されます。
/etc/inetd.conf が変更されたときは、 以下のように inetd プロセスに HangUP シグナルを送ることにより、inetd に設定ファイルを再読み込みさせられます。
設定ファイルのそれぞれの行は、 個々のデーモンについての指示になります。 ファイル内のコメントは “#” が先頭につきます。 /etc/inetd.conf の書式は以下のとおりです。
service-name socket-type protocol {wait|nowait}[/max-child[/max-connections-per-ip-per-minute]] user[:group][/login-class] server-program server-program-arguments
IPv4 を利用する ftpd デーモンのエントリの例です。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
これは特定のデーモンのサービス名です。 これは /etc/services 内のサービスリストに対応していなければなりません。 これは inetd がどのポートで受け付けなければならないかを決定します。 新しいサービスが作成された場合、まずはじめに /etc/services 内に記載しなければなりません。
stream, dgram, raw または seqpacket のどれかを指定します。 stream はコネクションに基づいた TCP デーモンに使用しなければならず、 一方で dgram は UDP 転送プロトコルを利用したデーモンに対して使用されます。
次のうちのどれか 1 つを指定します。
wait|nowait
は inetd
から起動したデーモンが、 自分のソケットを管理できるかどうかを示します。
通常マルチスレッド化されている stream ソケットデーモンは nowait
を使用するべきである一方、 dgram
ソケットタイプは wait
オプションを使用しなければなりません。 nowait
は新しいソケット毎に子のデーモンを起動する一方で、 wait
は通常複数のソケットを 1 つのデーモンに渡します。
inetd が起動できる子のデーモンの最大数は max-child
オプションで設定できます。
特定のデーモンに対して、起動する数が 10 までという制限が必要な場合、 nowait
の後に /10 を置きます。
max-child
に加えて、他にある 1
つの場所から特定のデーモンへの最大接続数を制限するオプションが利用できます。 max-connections-per-ip-per-minute
がそれです。ここに 10
を指定すると、特定の IP アドレスからの特定のサービスへの接続を 1 分間につき
10 回に制限します。 これは故意または故意でない資源の浪費および、
マシンへのサービス不能 (DoS) 攻撃を防ぐのに有用です。
wait
または nowait
はこの欄に必ず必要です。 max-child
および max-connections-per-ip-per-minute
は任意です。
max-child
または max-connections-per-ip-per-minute
制限をかけない stream
タイプのマルチスレッドデーモンの設定は nowait
になります。
作成できる子プロセスの上限が 10 である同じデーモンの設定は nowait/10 になります。
さらに、 1 分間に IP アドレスあたりの接続制限が 20、 子プロセスの上限が 10 である同じデーモンの設定は nowait/10/20 になります。
以下のように、これらのオプションはすべて fingerd デーモンのデフォルト設定に使われています。
finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
user はあるデーモンが実行するときのユーザ名を指定します。 一般的にデーモンは root ユーザとして実行します。セキュリティを考慮して、 いくつかのサーバは daemon ユーザ、 または最低の権限が与えられている nobody ユーザとして実行することも多く見られます。
接続を受け取ったときに実行するデーモンのフルパスです。 デーモンが inetd によって内部的に提供されるサービスの場合 internal
を使用します。
ここには、起動するときにデーモンに渡される、 argv[0] から始まる引数を指定して、
server-program
と協調して動作します。 mydaemon -d がコマンドラインの場合、 server program arguments
の値に mydaemon
-d を指定します。 また、デーモンが内部サービスの場合、ここに internal
を指定します。
インストールの時に選択したセキュリティプロファイルによっては、 多くの inetd のデーモンがデフォルトで有効になっているかもしれません。 あるデーモンが特に必要でない場合には、それを無効にしてください! 問題となっているデーモンが記述されている行の先頭に “#” をおいて inetd にハングアップシグナルを送ってください。 fingerd のようないくつかのデーモンは、 動かそうとすべきではないかもしれません。なぜなら、 それらは攻撃者に対してあまりにも多くの情報を与えるからです。
セキュリティをあまり考慮せず、 接続試行に対してタイムアウトまでの時間が長いか、
タイムアウトしないデーモンもあります。
これは、特定のデーモンに攻撃者がゆっくり接続要求を送ることによって、
利用可能なリソースを飽和させることを可能にします。ある種のデーモンに ip-per-minute
および max-child
制限を設けることはよい考えかもしれません。
TCP wrapper はデフォルトで有効です。 inetd から起動されるさまざまなデーモンに対して TCP 制限を設けることの詳細については hosts_access(5) マニュアルページを参照してください。
daytime, time, echo, discard, chargen および auth はすべて inetd が内部的に提供するサービスです。
auth サービスは identity (ident, identd) ネットワークサービスを提供し、 ある程度設定可能です。
詳細については inetd(8) マニュアルを参照してください。
本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。
FreeBSD に関する質問がある場合には、ドキュメント を読んだ上で <[email protected]> まで (英語で)
連絡してください。
本文書に関する質問については、<[email protected]> まで電子メールを (英語で)
送ってください。