FreeBSD ハンドブック
前のページ | 第 22章高度なネットワーク | 次のページ

# 22.14. inetd “スーパサーバ”

寄稿: Chern Lee.

## 22.14.1. 概観

inetd(8) は複数のデーモンに対する接続を制御するので、 “インターネットスーパサーバ” と呼ばれます。 ネットワークサービスを提供するプログラムは、 一般的にデーモン呼ばれます。inetd は他のデーモンを管理するサーバを努めます。 接続が inetd によって受け付けられると、 inetd は接続がどのデーモンに対するものか判断して、 そのデーモンを起動し、ソケットを渡します。 inetd を 1 つ実行することにより、 それぞれのデーモンをスタンドアロンモードで実行することに比べ、 全体としてのシステム負荷を減らします。

基本的に、inetd は他のデーモンを起動するために使用されます。しかし、 chargen, auth および daytime のようなささいなプロトコルは直接扱われます。

この節ではコマンドラインオプションおよび設定ファイル `/etc/inetd.conf` による inetd の設定の基本を説明します。

## 22.14.2. 設定

inetd は `/etc/rc.conf` の仕組によって初期化されます。 デフォルトでは `inetd_enable` オプションは “NO” に設定されています。 しかし多くの場合、sysinstall でセキュリティプロファイルを medium に設定することにより、有効化されます。

    inetd_enable="YES"

または

    inetd_enable="NO"

を `/etc/rc.conf` に置くことで、起動時に inetd を有効または無効にできます。

さらに `inetd_flags` オプションによって、 いろいろなコマンドラインオプションを inetd に渡すことができます。

## 22.14.3. コマンドラインオプション

inetd 書式

`inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address | hostname] [-p filename] [-R rate] [configuration file]`

-d

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

-l

  成功した接続のログをとります。

-w

  外部サービスに対して TCP Wrapper を有効にします (デフォルト)。

-W

  inetd 組み込みの内部サービスに対して TCP Wrapper を有効にします (デフォルト)。

-c maximum

  サービス毎に同時に起動可能な最大値のデフォルトを指定します。 デフォルトでは無制限です。サービスごとに指定する `max-child` パラメータで上書きできます。

-C rate

  1 分間にひとつの IP アドレスから起動されるサービスの、 最大値のデフォルトを指定します。デフォルトは無制限です。 サービスごとに指定する `max-connections-per-ip-per-minute` パラメータで上書きできます。

-R rate

  あるサービスを 1 分間に起動できる最大の数を指定します。 デフォルトは 256 です。rate に 0 を指定すると、 起動可能な数は無制限になります。

-a

  バインドする IP アドレスを一つ指定します。 代わりにホスト名も指定できます。この場合、ホスト名に対応する IPv4 または IPv6 アドレスが使用されます。通常 inetd が jail(8) 内で起動される時点で、ホスト名が指定されます。この場合、 ホスト名は jail(8) 環境に対応するものです。

  ホスト名指定が使用され、 IPv4 および IPv6 両方にバインドしたい場合、 `/etc/inetd.conf` の各サービスに対して、 各バインドに対する適切なプロトコルのエントリが必要です。 たとえば TCP ベースのサービスは、 ひとつはプロトコルに “tcp4” を使用し、 もう一つは “tcp6” を使用する、 2 つのエントリが必要です。

-p

  デフォルトとは異なる PID を保持するファイルを指定します。

`/etc/rc.conf` 内の `inetd_flags` オプションを用いて、これらのオプションを inetd に渡すことができます。デフォルトでは `inetd_flags` は “-wW” に設定されており、 これは inetd の内部および外部サービスに対して TCP wrapper を有効にします。 初心者ユーザはこれらのパラメータを変更する必要は通常ありませんし、 `/etc/rc.conf` に入力する必要もありません。

> 注意: 外部サービスは、接続を受け取ったときに起動される inetd の外部にあるデーモンで、 それに対して、内部サービスは inetd 自身が提供する内部のデーモンです。

## 22.14.4. `inetd.conf`

inetd の設定は `/etc/inetd.conf` ファイルによって制御されます。

`/etc/inetd.conf` が変更されたときは、 以下のように inetd プロセスに HangUP シグナルを送ることにより、inetd に設定ファイルを再読み込みさせられます。

例 22-4. inetd への HangUP シグナル送付

    # kill -HUP `cat /var/run/inetd.pid`

設定ファイルのそれぞれの行は、 個々のデーモンについての指示になります。 ファイル内のコメントは “#” が先頭につきます。 `/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

service-name

  これは特定のデーモンのサービス名です。 これは `/etc/services` 内のサービスリストに対応していなければなりません。 これは inetd がどのポートで受け付けなければならないかを決定します。 新しいサービスが作成された場合、まずはじめに `/etc/services` 内に記載しなければなりません。

socket-type

  `stream`, `dgram`, `raw` または `seqpacket` のどれかを指定します。 `stream` はコネクションに基づいた TCP デーモンに使用しなければならず、 一方で `dgram` は UDP 転送プロトコルを利用したデーモンに対して使用されます。

protocol

  次のうちのどれか 1 つを指定します。

  プロトコル | 説明
  --- | ---
  tcp, tcp4 | TCP IPv4
  udp, udp4 | UDP IPv4
  tcp6 | TCP IPv6
  udp6 | UDP IPv6
  tcp46 | TCP IPv4 および v6 の両方
  udp46 | UDP IPv4 および v6 の両方

{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]

  `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

  user はあるデーモンが実行するときのユーザ名を指定します。 一般的にデーモンは `root` ユーザとして実行します。セキュリティを考慮して、 いくつかのサーバは `daemon` ユーザ、 または最低の権限が与えられている `nobody` ユーザとして実行することも多く見られます。

server-program

  接続を受け取ったときに実行するデーモンのフルパスです。 デーモンが inetd によって内部的に提供されるサービスの場合 `internal` を使用します。

server-program-arguments

  ここには、起動するときにデーモンに渡される、 argv[0] から始まる引数を指定して、 `server-program` と協調して動作します。 mydaemon -d がコマンドラインの場合、 `server program arguments` の値に `mydaemon -d` を指定します。 また、デーモンが内部サービスの場合、ここに `internal` を指定します。

## 22.14.5. セキュリティ

インストールの時に選択したセキュリティプロファイルによっては、 多くの inetd のデーモンがデフォルトで有効になっているかもしれません。 あるデーモンが特に必要でない場合には、それを無効にしてください! 問題となっているデーモンが記述されている行の先頭に “#” をおいて inetd にハングアップシグナルを送ってください。 fingerd のようないくつかのデーモンは、 動かそうとすべきではないかもしれません。なぜなら、 それらは攻撃者に対してあまりにも多くの情報を与えるからです。

セキュリティをあまり考慮せず、 接続試行に対してタイムアウトまでの時間が長いか、 タイムアウトしないデーモンもあります。 これは、特定のデーモンに攻撃者がゆっくり接続要求を送ることによって、 利用可能なリソースを飽和させることを可能にします。ある種のデーモンに `ip-per-minute` および `max-child` 制限を設けることはよい考えかもしれません。

TCP wrapper はデフォルトで有効です。 inetd から起動されるさまざまなデーモンに対して TCP 制限を設けることの詳細については hosts_access(5) マニュアルページを参照してください。

## 22.14.6. その他

daytime, time, echo, discard, chargen および auth はすべて inetd が内部的に提供するサービスです。

auth サービスは identity (ident, identd) ネットワークサービスを提供し、 ある程度設定可能です。

詳細については inetd(8) マニュアルを参照してください。

前のページ | ホーム | 次のページ
ネットワークアドレス変換 (NAT) | 上に戻る | パラレルライン IP (PLIP)

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。