inetdとは

前へ << RSA で暗号化してみよう (2) inetdを利用してechoサーバを作ってみよう >> 次へ

サーバについてのおさらい

ここまでで必要な用語は説明しましたので、もう少ししっかりとしたクライアントと サーバの動作を書きます。ちょっと UNIX ユーザ向けの説明なので、 わかる人だけ読んで下さい。いまいち理解できなかった人は読み飛ばして 結構です。クライアントを作る際にはこれらの知識は不要です。

サーバとは特定のポートを見張っているプログラムのことです。 クライアントはサーバの動いているホストの(サーバが見張っているはずの) ポートに connect し、データのやりとりをします。 もしサーバがポートを見張っていない場合はクライアントは connect することはできません。

ですから、1つのコンピュータに WWW サーバ、FTP サーバ、SMTP サーバ、POP3 サーバを上げておく場合、 それぞれポート80、ポート21、ポート25、ポート110を見張っておく プロセスを実行しておかなければなりません (UNIX では現在実行中のプログラムのことをプロセスといいます)。

例えば FreeBSD だと標準設定では SMTP サーバ、FTP サーバなどが 自動的にインストールされています。では ps コマンドを使って ポート25(SMTP) を見張っているプロセスはどれなのか調べてみましょう。

% ps axww (Solarisなど、SystemV系UNIXなら ps -ef)
   0 ?? DLs  0:00.14  (swapper)
   1 ?? Is   0:00.03 /sbin/init --
   2 ?? DL   0:06.41  (pagedaemon)
   3 ?? DL   0:00.00  (vmdaemon)
   4 ?? DL   0:18.71  (update)
  27 ?? Is   0:00.01 adjkerntz -i
  55 ?? Is   0:00.82 routed -q
  72 ?? Ss   0:00.58 syslogd
  80 ?? Is   0:00.02 portmap
 104 ?? Is   0:00.13 inetd
 107 ?? Ss   0:00.73 cron
 111 ?? Is   0:00.13 sendmail: accepting connections on port 25 (sendmail)
最後の行のプロセス番号111番の sendmail がそうです (プロセス番号が111なのはたまたまそうだっただけです)。 ご丁寧にも「ポート25番へのアクセスを受け入れます」と書いてありますね。

ではポート21を見張っているはずの FTP サーバはどこにあるんでしょう。 psで見る限りではどこにもありませんね。実は inetd というものが FTP サーバの代わりをしているのです。

inetdの利点 1

いろんなサーバがポートを見張るためだけに起動されていると、 メモリは喰うし CPU パワーも必要だし、いいことはありません。 これを避けるために、一つのプロセスでいろんなポートを見張っていて、 クライアントからの通信が来た場合に初めてサーバを実行してくれる 便利な仕組みがあります。

この役割を担っているのが inetd です。上の ps の例では、プロセス番号104となっています。 inetd の設定ファイルは /etc/inetd.conf です。以下に ftp の部分を引用します。

ftp  stream  tcp  nowait root /usr/libexec/ftpd   ftpd -l
このように inetd がポート25を見張っていて (ポート25だけではありませんが)、 ポート25にクライアントからの接続要求があると、/usr/libexec/ftpd を実行します。あとは ftpd が FTP クライアントと通信するわけです。

では実際に確かめてみましょう。まず ftpd が起動していないことを 確認します。

% ps axww | grep ftpd
何も出力されませんね? ということは現在 ftpd のプロセスは実行されていない ということです。では ftp を使って localhost の FTP サーバに アクセスしてください。次に、Ctrl-z を押してサスペンド(中断)して、 ps axww | grep ftpd とタイプしてください (あるいは別ウィンドウで ps axww|grep ftpd をタイプしてもいいです)。
% ftp localhost
Connected to hoge.fuga.com
220 hoge.fuga.com FTP server (Version 6.00) ready.
Name (localhost:user): ^Z
Suspend

% ps ax | grep ftpd
 456  ??  Ss     0:00.05 ftpd: hoge.fuga.com: connected (ftpd)
FTP クライアントがポート21に接続したら ftpd が出現しました。 では ftp を終了させましょう。fg でフォアグラウンドで再実行させて、 Ctrl-C で終了させてください。
% fg
ftp localhost
^C
再度ftpdを確認してみましょう。
% ps ax | grep ftpd
何も表示されません。ということは FTP クライアントが 接続要求を出したときだけ ftpd が実行され、コネクションが 切断されると ftpd は終了してしまったということです。

ポートの監視を行い、接続要求があったときだけサーバ本体を起動すること。 これが inetd の役割です。これにより、たくさんのポートを監視するためだけに、 多くのプロセスを起動しなくてもすむわけです。

inetd は、その役割からスーパーサーバとも言われます。

inetdの利点 2

さらに inetd の便利な点として、プログラムが簡単に書けることがあげられます。 bind・listen・accept などめんどうな接続作業は全て inetd がやってくれるからです。 さらにクライアントからのデータは標準入力に送られてきますし、 標準出力に書き出したデータは、クライアントに送られます。 次節で、inetd を使った echo サーバを作ってみます。

また、簡単なサーバ、例えば後からサンプルとしてでてくる echo サーバなどは inetd の内部に組み込まれています。 /etc/inetd.conf に internal と書いてあるものは inetd の内部のサーバが起動されることを表しています。

inetdの欠点

何かと便利な inetd を利用せずに、自前でポートの監視をしているサーバソフトウェアも 存在します。sendmail・httpd などがそうです。

inetd を使った場合はコネクションが終了すると、サーバプロセスも終了してしまいます。 上の例でも、ftpd はコネクションを切ると終了していましたよね?

ところが頻繁にアクセスがあるサーバの場合、inetd によるサーバの実行/終了に 時間がかかり、反応速度が遅くなってしまいます。「メモリを取るか、実行速度を取るか」 と考えた場合、sendmail や httpd は実行速度を重要視して、 素早く反応できるようにしてあるのです。

まとめ

  • サーバは必ず特定のポートを見張っていなければならない。
  • httpd や sendmail のように、常にサーバプロセス自身がポートを見張っていてもいいし、 ftpd のようにポートの見張りは inetd にまかせておいてもいい。 どちらを取るかは、サーバの形態によって決まる。
前へ << RSA で暗号化してみよう (2) inetdを利用してechoサーバを作ってみよう >> 次へ

ご意見・ご指摘は Twitter: @68user までお願いします。