inetd経由でSMTPを立ち上げる時には、tcpwrapperをかけて制限を行います。
まず/etc/inetd.confの中のsmtpに関する部分のコメントアウトを外します。
[修正前]
#smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
tcp-env /var/qmail/bin/qmail-smtpd
[修正後]
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
tcp-env /var/qmail/bin/qmail-smtpd
のように最初の#を外してみてください。
上記のように編集したら、
# ps aux |grep inet
root 135 0.0 0.4 1040 560 ?? Is 21Sep01 0:00.16
inetd -wW
として、inetdのプロセス番号を確認し
kill -HUP 135
として、そのプロセスをHUPしましょう。
基本的には、hosts.denyファイルで全てのサービスへの接続を拒絶していますので
hosts.allowに
tcp-env: 127. : setenv = RELAYCLIENT
tcp-env: ALL
という二行を追加することで外部からの受付が可能になります。
実際のサーバーではこちらを使用しています。
inetdは同時に大量のアクセス要求を受けると
著しくパフォーマンスが低下することがあるためです。
tcpserverはqmailの作者であるD. J. Bernstein氏が作ったサーバ制御ツールで、
ucspi-tcpというパッケージに入っています。tcpserverの特徴としては
ローカルホスト・リモートホストのホスト名、IPアドレス、ポート番号、ユーザー名を環境変数で参照できる
同時接続数を制限できる そのホストが複数のIPアドレスを持つ場合、特定のIPアドレス/ホストへの接続に対して制御できる
ユーザー名、IPアドレス、ドメイン名を基にアクセス制御できる
アクセス制御ルールにはハッシュ化されたデータベース(cdb)を用いているため、大規模・複雑になっても高速に処理できる
参考:http://www.jp.qmail.org/ml/tcpserver.html
などが挙げられます。
それでは、tcpserverを使用するために必要なツールをインストールしましょう。
/usr/local/srcに
ucspi_tcp-***.tar.gz
cdb-***.tar.gz
がダウンロードされているものとします。(***にはバージョン名が入ります。)
# cd /usr/local/src/
# tar zxvf ucspi_tcp-***.tar.gz
# cd ucspi_tcp-***
# make
# make setup check
# cd /usr/local/src/
# tar zxvf cdb-***.tar.gz
# cd cdb-***
# make
# make setup check
以上でインストールは完了です。
[Redhat Linux 9の場合](※必要ない人は読み飛ばしてください)
Redhat Linux 9では、glibcのアップグレードに伴い、そのままではコンパイルできなくなっています。
解凍したucspi_tcp-***、cdb-***ディレクトリ内のerror.hを開き、ファイル先頭の次の部分を表示してください。
/*---
#ifndef ERROR_H
#define ERROR_H
extern int errno;
(以下省略)
---*/
上記ファイル中
extern int errno
の部分のせいでエラーが起きています。
そこで、上記ファイルextern int errno;の部分を次のように書き換えてください
/*---
#ifndef ERROR_H
#define ERROR_H
#include <errno.h>
(以下省略)
---*/
以上の作業をすることにより、Redhat Linux9でもインストールが可能になります。
それでは、tcpserverの設定をしましょう。
例えばhogehoge.co.jpドメインのネットワークが、192.168.1だとします。
この場合、例えば、以下のような内容のファイルを
/var/qmail/control/tcprules.txtとして作成します。
127.0.0.1:allow,RELAYCLIENT=""
192.168.1.:allow,RELAYCLIENT=""
#
:allow
上記のように書くと、192.168.1.*という自ネットワークとlocalからのリレーが許可されます。
上記以外のIPについては、最後の行 allowが該当し、
接続は許可しますが、リレーするかどうかはrcphostsの設定に
記述があるかどうかによって決まります。
今回説明しているサーバーではSMTPの開放を基本的に行いませんので
127.0.0.1:allow,RELAYCLIENT=""
#
:allow
とし、自ドメイン名に対する接続のみを許すものとします。(上記 # はコメントです。)
上記、設定をしたらcdb形式のデータベースを作成する必要があります。
tcpserverはcdb形式のデータベースからルールの読み込みを行うからです。
cdb形式のデータベースを作成するには次のようにします。
# cd /var/qmail/control
# /usr/local/bin/tcprules tcprules.dat tcprules.tmp
< tcprules.txt
上記コマンドによって/var/qmail/control以下にtcprules.datというファイルが
作成されることと思います。
こうしてできたtcprules.datを用いて、tcpserver経由で
smtpを立ち上げれば上記設定に従ったアクセス制御が可能になります。
tcpserver経由でのsmtpの立ち上げ方は次のようになります。
/usr/local/bin/tcpserver -x /var/qmail/control/tcprules.dat
\
-u qmaildのUID -g nofilesのGID 0 smtp \
/var/qmail/bin/qmail-smtpd&
/var/qmail/control/tcprules.datというファイルに従って
qmaildというユーザ,nofilesというグループによって
/var/qmail/bin/の下にあるqmail-smtpを立ち上げなさいという意味です。
上記のファイルを例えば、linuxでいうrc.localなどに記述して
起動してやってももちろん良いのですが、
上記プロセスを監視するためにdaemontoolsというツールが提供されていますので
自動起動についての説明は、daemontoolsのページに譲る事にして
次のページではAPOPとPOPサービスを立ち上げてみたいと思います。