inetd(アイネットディー)とは
inetdは、多くの
UNIX系システムで採用されている、
インターネットサービスを管理するためのスーパーサーバ型のデーモンです。正式名称はInternet Daemonで、4.3BSDで初めて導入されました。通常、`/usr/sbin/inetd`に配置されています。
inetd登場の背景
inetdが登場する以前は、
FTPサーバーやTELNETサーバーなど、複数のサービスを1台のサーバーで稼働させる場合、それぞれのサービスに対応するデーモン(`ftpd`や`tftpd`など)を個別に起動し、各デーモンが自身の待ち受けポートを監視する必要がありました。この方式では、監視対象のポート数だけデーモンが起動するため、サービスが利用されていない時でもメモリが消費されるという問題がありました。
そこで、待ち受けポートを監視する専用の中継デーモンを用意し、ポートに要求があった際に、対応するデーモンを起動させる方式が考案されました。これがinetdの基本的な役割です。
メリットとデメリット
メリット
メモリの浪費解消: サービスが要求された時のみデーモンが起動するため、メモリ使用量を効率化できます。
デメリット
動作レスポンスの遅延: inetdが中継処理を行うため、直接デーモンがリクエストを処理する場合と比較して、レスポンスが遅くなる場合があります。そのため、HTTPサーバーなど、頻繁にアクセスされるサービスではinetdを経由せず、常時起動させておくことが一般的です。
inetdの機能
inetdは、FTP、POP3、telnetなどの
インターネットサービスで使用されるポート番号を監視します。指定されたポートにTCP/UDPパケットが届くと、inetdは対応するサーバープログラムを起動し、接続を制御します。この方式では、必要時のみサービスが起動されるため、メモリ利用効率が向上します。
また、個々のサーバーデーモンは、ソケットが標準入出力および標準エラー出力に接続された状態で起動するため、ネットワーク関連の複雑なコードを実装する必要がありません。
ただし、トラフィックの多いHTTPやPOP3などのプロトコルでは、inetdを介さずに専用のサーバーを直接起動する方が効率的です。頻繁なサーバープロセスの起動を避けることができるからです。
設定方法
ポート番号とサービス名の対応は`/etc/services`ファイルで、サービス名とサーバープログラムの対応は`/etc/inetd.conf`ファイルで設定します。
例として、23番ポートにTCPリクエストが来た場合、`/etc/services`には以下のように記述します。
telnet 23/tcp
`/etc/inetd.conf`には、以下のような行を記述します。
telnet stream tcp6 nowait root /usr/sbin/telnetd telnetd -a
この設定により、inetdは`/usr/sbin/telnetd`プログラムを`telnetd -a`という引数で起動します。inetdは、標準入出力と標準エラー出力をソケットに接続した状態でサーバープログラムを起動します。
一般的に、TCPソケットは接続ごとに個別のサーバープロセスを起動して並行処理を行います。一方、UDPソケットは単一のサーバーインスタンスがポート番号に対する全てのパケットを処理します。
echoのような単純なサービスは、inetd自身が処理し、別のサーバープロセスを起動する必要はありません。
inetdサービス生成例
以下は
C言語で記述された、inetdサービスの一例です。この例では、ファイル名を引数として受け取り、そのファイルをログファイルとして、ソケット経由で送られてきた文字列を全て記録します。
c
// サンプルコードは省略
このサービスは、異なるマシン上の複数のプロセスからのメッセージを受け付け、
分散コンピューティング環境におけるロギングサービスを実現するために使用できます。全てのメッセージを単一のファイルに記録するため、サービスは単一のインスタンスで全ての要求を処理する必要があります。このため、UDPプロトコルを使用するのが適切です。
例えば、未使用のポート番号9999を使う場合、`/etc/services`に以下の行を追加します。
errorLogger 9999/udp
そして、`/etc/inetd.conf`には以下のように記述します。
errorLogger dgram udp wait root /usr/local/bin/errlogd errlogd /tmp/logfile.txt
これにより、inetdは`/usr/local/bin/errlogd`プログラムを`errlogd /tmp/logfile.txt`という引数で起動します。inetdは必要に応じてサービスを起動し、入出力ストリームをポート番号9999に接続し、ポートに送られた文字列はログファイルに記録されます。`wait`を指定することで、単一のサーバーインスタンスが全ての要求を処理することをinetdに伝えます。
この例で示した機能は、通常syslogを使って実装されます。syslogdはinetdサービスではなく、inetdとは独立して起動されます。
代替実装
セキュリティ上の懸念から、inetdの代替実装として、xinetd、rlinetd、ucspi-tcp、systemdなどが使用されています。
Linuxでは、ディストリビューションによって対応が異なります。macOSでは、
Mac OS X v10.2以降でxinetdが使用されていましたが、
Mac OS X v10.4では、inetdの機能はlaunchdに統合されました。
inetdが提供するサービスは、完全に切り捨てることが可能です。これにより、マシンを単機能サーバーとして利用する場合、例えばHTTPサーバーのみを起動し、他のポートを閉じることができます。
ファイアウォール専用マシンでは、全てのサービスを停止することも可能です。
セキュリティ上の注意点
inetd自体が本質的にセキュアでないわけではありませんが、inetdが提供するサービスのリストを維持することは、セキュリティ専門家でも難しい場合があります。サービスに潜在的なセキュリティ問題が含まれている可能性も考慮する必要があるため、不要なサービスはデフォルトで無効化するのが一般的です。多くのディストリビューションでは、`/etc/inetd.conf`内のほとんどのサービスがコメントアウトされています。
関連項目
TCP Wrapper
脚注
inetd(8) FreeBSD版マニュアル
inetd(8)
Linux版マニュアル (JM Project)
inetd(1M) man page (Solaris 10 Reference Manual)
* inetd(1M) man page(HP-UX リファレンス)