inetd (インターネットサービスデーモン) は、多くの Unix システムでインターネット サービスを提供するスーパー サーバー デーモンです。設定された各サービスについて、接続するクライアントからの要求を待ちます。要求は、適切な実行ファイルを実行するプロセスを生成することによって処理されますが、echoなどの単純なサービスは inetd 自体によって処理されます。要求に応じて実行される外部実行ファイルは、シングル スレッドまたはマルチ スレッドです。4.3BSD [ 1]で初めて登場し、通常は にあります。inetd は (サービス) アクティベータ パターン[2]に基づいています。 /usr/sbin/inetd
関数
スーパーサーバーと呼ばれることも多いinetd は、 FTP、POP3、telnetなどのインターネットサービスで使用される指定ポートを listen します。TCPパケットまたはUDPパケットが特定の宛先ポート番号で到着すると、 inetd は接続を処理するために適切なサーバープログラムを起動します。 高い負荷で実行されることが想定されていないサービスの場合、特定のサーバーが必要なときだけ実行されるため、この方法の方がメモリをより効率的に使用できます。 さらに、 inetd のサービス管理の「nowait」モードでは、 inetd がネットワークストリームを生成プロセスのstdinとstdoutに直接フックするため、サービス固有のプログラムにネットワークコードは必要ありません。 HTTPや POP3などのトラフィックが頻繁に発生するプロトコルの場合、 inetd の「wait」モードの動作、またはトラフィックを直接傍受する専用サーバーのどちらかが適している場合があります。
設定
サービスされるサービスのリストは、通常、構成ファイルで指定されます/etc/inetd.conf。構成ファイルを管理するためのGUIはオプションのアクセサリです。デーモンは、構成を再読み込みするためにシグナルを必要とする場合があります。たとえば、telnet は次のように構成できます (行はAIXバージョン 5.1を実行しているマシンから取得)。
telnet ストリーム tcp6 nowait ルート /usr/sbin/telnetd telnetd -a
最初の単語 はtelnet、サービスの正式名称です。これは、ポート番号とプロトコルをサービス名にマッピングするシステム データベースを使用して解決されます。この場合、 には次の内容/etc/servicesが含まれている必要があります。
テルネット 23/tcp
2 番目と 3 番目の単語はそれぞれソケットのタイプと基礎となるプロトコルを表します。/etc/protocolsデータベースが参照されます。
4 番目の単語は wait/nowait スイッチです。シングル スレッド サーバーは、すべてのデータの読み取りが完了するまで inetd が待機することを想定しています。それ以外の場合、inetd はサーバーの実行を許可し、新しい要求に対して新しい同時プロセスを生成します。
/etc/passwd5 番目の単語は、サービス プログラムを実行するデータベース
からのユーザー名です。
最後に、外部プログラムのパスと引数を指定します。通常どおり、最初の引数はプログラム名です。この例では、inetd は/usr/sbin/telnetdコマンドライン引数を使用してプログラムを起動するように指示されますtelnetd -a。inetd は、サーバー プログラムの stdin、stdout、および stderr にソケットを自動的にフックします。
通常、TCP ソケットは、各接続を同時に処理するために個別のサーバーを生成することによって処理されます。UDP ソケットは通常、そのポート上のすべてのパケットを処理する単一のサーバー インスタンスによって処理されます。
echoなどの一部の単純なサービスは、外部サーバーを生成せずに inetd によって直接処理されます。
inetd サービスの作成
これはCで書かれたシンプルな inetd サービスです。ログ ファイルのファイル名を含むコマンド ライン引数を受け取り、ソケット経由で送信されたすべての文字列をログ ファイルに記録します。これは非常に安全性の低いサンプル プログラムであることに注意してください。
#include <stdio.h> #include <stdlib.h>
int main ( int argc , char ** argv ) { const char * fn = argv [ 1 ]; FILE * fp = fopen ( fn , "a+" ); if ( fp == NULL ) exit ( EXIT_FAILURE );
char str [ 4096 ]; /* inetd は情報を stdin に渡します。 */ while ( fgets ( str , sizeof str , stdin )) { fputs ( str , fp ); fflush ( fp ); } fclose ( fp ); return 0 ; }
この例では、 stdio関数を使用して、stdin から入ってくるネットワーク トラフィックに応答します。この場合、すべてのメッセージを 1 つのファイルに記録する必要があるため、すべての要求を処理するために 1 つのサービス インスタンスのみを実行する必要があります。つまり、UDP が適切なプロトコルです。まず、未使用のポート番号を選択する必要があります。このサンプルでは、9999 が使用されます。エントリ/etc/servicesは次のようになります。
エラーロガー 9999/udp
エントリは/etc/inetd.conf次のようになります。
errorLogger dgram udp wait root /usr/local/bin/errlogd errlogd /tmp/logfile.txt
/usr/local/bin/errlogdこれは、inetd に、コマンドラインを使用してプログラムを実行するように指示します(他の引数については、errlogd /tmp/logfile.txtinetd.conf のマニュアル ページを参照してください)。最初の引数には、ログ ファイルに使用するファイル名が含まれます。inetd は、必要に応じてサービスを実行し、ポート 9999 を入力ストリームと出力ストリーム/tmp/logfile.txtに接続し、そのポートに送信されたすべての文字列をファイルに記録します。wait を指定すると、inetd は、サーバーの 1 つのインスタンスのみを使用してすべての要求を処理するように指示します。
注: 上記の例の機能は通常、syslogと syslogd のようなプロセスを使用して実装されます。syslogd は通常、inetd サービスとしてではなく、inetd と並行して起動されます。
inetd の代替
近年、 inetd の元の設計にはセキュリティ上の制限があったため、多くのシステムでxinetd、 rlinetd 、ucspi-tcpなどに置き換えられました。特にLinuxディストリビューションには多くのオプションがあり、Mac OS X ( Mac OS X v10.2以降)ではxinetdが使用されています。Mac OS X v10.4バージョン以降、Apple は inetd の機能をlaunchdに統合しました。
inetd によって提供されるサービスは完全に省略できます。マシンが単一の機能専用である場合、これはより一般的になりつつあります。たとえば、HTTP サーバーはhttpdのみを実行し、他のポートは開かないように構成できます。専用のファイアウォールでは、サービスを開始しないようにできます。
systemdはinetdサービスをサポートし、ソケットアクティベーションをIPメッセージング(AF INET +6)を超えてAF UNIX、AF NETLINKなどに拡張します。 [3] [4]
安全
サービスディスパッチャとしての inetd の概念は、本質的に安全ではありませんが、inetd が従来提供してきたサービスの長いリストは、コンピュータセキュリティの専門家を躊躇させました。サービスに悪用可能な欠陥がある可能性や、サービスが悪用される可能性を考慮する必要がありました。不要なサービスは無効にし、「デフォルトでオフ」にすることがマントラになりました。最近の Unix ディストリビューションでは、
/etc/inetd.confほとんどすべてのサービスがコメントアウトされているを見つけることは珍しくありません。
