INETD(8)

名称
inetd - インターネット “スーパサーバ”

書式
inetd [-d] [-l] [-c maximum] [-C rate] [-a address] [-p filename] [-R rate] [configuration file]

解説
inetd は、ブート時に /etc/rc の中で起動されます( rc(8) 参照)。起動されると、 inetd は定められたインターネットソケットを監視し、接続要求を待ちます。 監視しているソケットに対して接続要求が出されると、 inetd はそのソケットに対応したサービスを 判定し、サービスを提供するプログラムを起動します。 サーバプログラムはサービスソケットを標準入力・標準出力・ エラー出力として起動されます。 サービスプログラムが完了すると、 inetd は再びソケットの監視を行ないます(後述するような例外もあります)。 inetd を用いれば 1 つのデーモンで 複数のサービスプログラムを起動することができるので、 システムの負荷を軽減することができます。

inetd は、起動時に以下のオプションを指定できます。

-d  デバッグモードにします。

-l  ログをとります。

-c maximum
    起動可能なサービスのデフォルトにおける最大値を指定します。 サービスごとに指定される "max-child" パラメータによって上書きされ得ます。

-C rate
    1 分間に単一の IP アドレスから起動されるサービスのデフォルトにおける最大値 を指定します。 デフォルトは未設定です。 サービスごとに指定される "max-connections-per-ip-per-minute" パラメータによって上書きされ得ます。

-R rate
    1 分間に起動できる最大のサービス数を指定します。デフォルトは 256 です。

-a  監視する IP アドレスを指定します。

-p  デフォルトとは異なるプロセス ID を保持するファイルを指定します。

inetd は実行時に設定情報を設定ファイルから読み込みます。 デフォルトでは設定ファイルは /etc/inetd.conf です。 設定ファイルの各フィールドにはエントリが 1 つなければなりません。 各フィールドのエントリはタブやスペースで区切ります。 コメントは行頭に ``#'' をつけます。 設定ファイルのフィールドは以下のものからなります:

    サービス名
    ソケットタイプ
    プロトコル
    {wait|nowait}[/最大子プロセス数[/IPあたりの分あたりの最大接続数]]
    ユーザ名[:クループ名][/ログインクラス名]
    サーバプログラム名
    サーバプログラム引数

ONC RPC ベースのサービスを記述する場合には、以下のエントリを記述します。

    サービス名/バージョン
    ソケットタイプ
    RPC/プロトコル
    ユーザ名
    サーバプログラム名
    サーバプログラム引数

inetd が起動することのできるサービスは 2 種類あります。 1 つは標準で、もう 1 つは TCPMUX です。 標準サービスには割り当てられた well-known ポートがあります。 これは公式のインターネット標準を実装したサービスや BSD 特有のサービスです。 RFC 1078 に書かれているように、TCPMUX は非標準サービスであり、 well-known ポートが割り当てられていません。 そういった非標準サービスは、あるプログラムが “tcpmux” well-known ポートに接続してそのサービス名を指定したとき、 inetd によって起動されます。 この機能はローカルに開発されたサーバを追加するときに 便利です。 TCPMUX リクエストが受理されるのは、 TCPMUX ベースのサーバに至るまでにおいて、 マルチプレクササービス自身が有効にされているときのみです。 後述の内部サービスに関する議論を参照してください。

サービス名 のエントリには、 /etc/services ファイルに記述されているサービス名が記述されます。 “内部” サービス (後述) については、 名前としてそのサービスのオフィシャル名 (すなわち /etc/services 内の最初のエントリ)を指定 しなければなりません。 ONC RPC ベースのサービスを指定するためには、このフィールドは /etc/rpc に書かれた有効な RPC サービス名でなければなりません。 “/” の右の部分が RPC のバージョン番号です。バージョン番号は、 数字もしくは、バージョンの幅(レンジ)で指定します。 幅を指定する場合は低い番号から高い番号を指定します。たとえば “rusers/1-3” のように記述します。 TCPMUX サービスでは、 サービス名 のフィールドは、文字列 “tcpmux” 、スラッシュ、そしてローカルに選ばれたサービス名から なります。 /etc/services に書かれたサービス名と “help” は予約済であり、ローカルなサービス名には使用できません。 TCPMUX サービスのためにユニークな名前をつけるには、 頭に組織名をつけ、末尾にバージョン番号をつけるとよいでしょう。

ソケットタイプ のエントリは、 “stream”, “dgram”, “raw”, “rdm”, “seqpacket” のいずれかである必要があります。それぞれ、ソケットが stream, datagram, raw, reliably delivered message, sequenced packet socket である場合に対応しています。 TCPMUX サービスは “stream” を使わなければなりません。

プロトコル のエントリには、 /etc/protocols に記述されている有効なプロトコル名が記述されます。 例えば “tcp” や “udp” などです。 サービスが T/TCP 経由で到達可能とするためには、 “tcp/ttcp” を指定する必要があります。 RPC ベースのサービスの場合、 “rpc/tcp” や “rpc/udp” のような指定になります。 TCPMUX サービスは “tcp” を使わなければなりません。

wait/nowait エントリは、 inetd によって起動されたサーバがサービスアクセスポイントに 関連付けられたソケットを引き継ぐかどうか、すなわちサーバが終了するまで inetd が新しいサービス要求を監視するのを待つ必要があるか否かを 指定します。 datagram サーバは、特定のサービスアドレスと結び付いた datagram ソケットで毎回起動されるため、 “wait” を使わなければなりません。こういったサーバは、終了する前に少なくとも 1 データグラムをソケットから読まなければなりません。 もし datagram サーバが相手に接続したときソケットを 開放するなら、 inetd はソケットに対するメッセージをさらに受けることができます。 このようなサーバは “マルチスレッド” サーバと呼ばれます。 サーバはソケットから datagram を 1 つ読み込み、相手に接続する新しい ソケットをつくります。 サーバは fork() を行い、親プロセス側は終了なければいけません。 これにより inetd は新しいサービス要求をチェックし、新しいサーバを起動することが できるようになります。 入って来る全ての datagram を処理し、 時間切れまで動作する datagram サーバは、 “シングルスレッド” サーバと呼ばれます。 comsat(8), (biff(1)), talkd(8) は後者のタイプの datagram サーバの例です。 tftpd(8) はマルチスレッドで動く datagram サーバの例です。

stream ソケットを使うサーバは一般にマルチスレッドで動き “nowait” エントリを使います。 こういったサーバへの接続要求は inetd で受け付けられ、新たに受理し、クライアントにつながった ソケットのみがサーバに与えられます。 多くの stream ベースのサービスはこのように行われます。 “wait” エントリを使う stream ベースのサーバは、 サービスのソケットを監視し、少なくとも 1 つの接続要求を受け入れてから 終了しなければなりません。 そういったサーバは通常、時間切れとなるまで、入って来る要求を 受け付け処理します。 TCPMUX サービスは “nowait” を使わなければなりません。

``nowait'' サービスの子プロセス(あるいは ``スレッド'')の最大数は、 ``nowait'' キーワードの後に ``/'' と数字を付け加えることで指定できます。 通常(あるいはゼロが指定された場合)、子プロセスの数に制限はありません。 一方、最大数に達すると、それ以降の接続要求は、存在する子プロセスが終了するまで 待ち行列に蓄えられます。これは、``wait'' モードでも同様ですが、通常は 1 (デフォルトの値)以外は意味がありません。 指定した IP アドレスからの 1 分あたりの最大接続数を指定することも可能です。 この場合、``/'' および最大子プロセス数を指定します。 最大値に達っした場合、指定した IP アドレスからの接続は、 この 1 分が経過するまで、落とされます。

ユーザ名 エントリには、サーバを実行するユーザ名を書きます。 これによりサーバを root よりも低い権限で実行できます。 オプションの グループ名 部分は ``:'' で分けられ、 このユーザのデフォルトグループ以外のグループ名を指定可能です。 オプションの ログインクラス名 部分は ``/'' で分けられ、 デフォルトの ``daemon'' 以外のログインクラス名を指定可能です。

サーバプログラム名 のエントリには、ソケットに要求があったとき inetd が起動し、当該エントリのサービスを提供する サーバプログラムのパス名を指定します。 inetd 内にすでに実装されているサービスを提供する場合には、サーバプログラムとして “internal” を指定します。

サーバプログラム引数 のエントリは、サーバを起動する際の引数を、サーバプログラムの起動文字列 である argv[0] を含めて記述します。 inetd 内に実装されているサービスを提供する場合には、サーバプログラム引数 として “internal” を指定します。

inetd は、内蔵ルーチンを用いて簡単なサービスを自身で提供します。 これらのサービスとは “echo”, “discard”, “chargen” (文字生成), “daytime” (人間が読む形式で時間を出力します), “time” (機械可読形式の時間。1900 年 1 月 1 日 0 時からの経過秒数を出力します) です。 これらのサービスは TCP と UDP バージョンのいずれでも利用できます。 UDP バージョンは返事のポートとして内部サービスに相当するポートを 要求されたとき、サービスを拒否します。 (これはループ攻撃に対する防護です。リモート IP アドレスは記録されます。) これらのサービスの詳細については適当な RFC ドキュメントを参照して下さい。

TCPMUX のデマルチプレクスサービスもまた内部サービスとして実装されています。 TCPMUX ベースのサービスを動作させるためには、以下の行を inetd.conf に含む必要があります:

    tcpmux	stream	tcp	nowait	root	internal

-l オプションが指定された場合、 inetd は、 accept(2) が終了した時点で、選択されたサービスと要求を発したリモートの IP 番号を syslog に記録します。

SIGHUP を受けとると、 inetd は、設定ファイルを再度読み込みます。設定ファイルを 再読み込みするとき、サービスを追加、削除、変更できます。 デバッグモードで起動された場合をのぞき、 inetd は再設定を容易にするために、プロセス ID を /var/run/inetd.pid に記録します。

TCPMUX

RFC 1078 は TCPMUX プロトコルについて述べています。 「 TCP クライアントは他のホストに TCP ポート番号 1 で接続します。 クライアントは、サービス名に<CRLF>を付加して送ります。 サービス名は大文字/小文字を区別しません。 サーバは、肯定(+)もしくは否定(-)を表す 1 文字を返します。 + あるいは - のすぐ後にメッセージが続く場合があります。 返答は <CRLF> で終わります。もし返答が肯定で あれば、選択されたプロトコルが開始されます。 そうでなければ接続は切られます。」 プログラムにはファイルディスクプリタ 0 と 1 で TCP コネクションが 渡されます。

TCPMUX サービス名が ``+'' で始まっているとき、 inetd は、プログラムに肯定返答(+)を返します。 これによって、 特別なサーバコードを追加することなく 標準入出力を使うプログラムを起動することができます。

特別なサービス名である “help” により、 inetd は inetd.conf にある TCPMUX サービスの一覧を出力します。

関連ファイル
/etc/inetd.conf
    設定ファイル
/etc/rpc
    サービス名を RPC プログラム番号に変換するテーブル
/etc/services
    サービス名をポート番号に変換するテーブル
/var/run/inetd.pid
    現在実行中の inetd の pid

使用例

次に、いくつかのサービスについて サービスエントリの 例を挙げておきます。

    ftp          stream  tcp   nowait root  /usr/libexec/ftpd        ftpd -l
    ntalk        dgram   udp   wait   root  /usr/libexec/ntalkd      ntalkd
    tcpmux/+date stream  tcp   nowait guest /bin/date                date
    tcpmux/phonebook stream tcp nowait guest /usr/local/bin/phonebook phonebook
    rstatd/1-3   dgram   rpc/udp wait root  /usr/libexec/rpc.rstatd  rpc.rstatd

エラーメッセージ
inetd サーバは、 syslog(3) を使ってエラーメッセージを記録します。 重要なエラーメッセージと その説明は以下の通りです。

service/protocol server failing (looping), service terminated. 直前の 1 分間に、そのサービスについての要求数が制限に達しました。 不完全なプログラムや悪意のあるユーザがシステムを ハングアップさせないために、このような制限が設けられています。 このメッセージが出力される理由はいくつかあります。

1.  短時間の間に多くのホストがこのサービスを要求している。

2.  不完全なクライアントプログラムがサービスを 頻繁に要求しすぎている。

3.  悪意あるユーザがあるプログラムを起動し、 サービスが '拒否' されるように攻撃している。

4.  起動されたサービスプログラムにエラーがあり、 クライアントがすぐにリトライを起こしてしまう。

-R rate オプションを使うと、制限を変えることができます。 制限に達したとき、10 分経つとサービスは自動的に 再許可されます。

service/protocol: such user user, service ignored

service/protocol: getpwnam: user: such user passwd(5) データベースに user のエントリーがありません。 最初のメッセージは inetd が設定ファイルを(再度)読み込むときに出されます。 2 つ目のメッセージは、サービスが呼び出されたときに 出されます。

service: can't set uid uid

service: can't set gid gid user フィールドのユーザ ID もしくは グループ IDが 無効です。

setsockopt(SO_PRIVSTATE): Operation not supported
inetd はそのソケットに設定されている特権状態を放棄しようとしましたが、 失敗しました。

関連項目
login.conf(5), passwd(5), rpc(5), services(5), comsat(8), fingerd(8), ftpd(8), portmap(8), rexecd(8), rlogind(8), rshd(8), telnetd(8), tftpd(8),

歴史
inetd コマンドは 4.3BSD から登場しました。 TCPMUX は Mark Lottor によるコードとドキュメントを元にしています。 ONC RPC ベースのサービスのサポートは、 SunOS 4.1 が供給されてから、 それにならって作られました。