連載
» 2001年09月04日 00時00分 公開

実用qmailサーバ運用・管理術(1):qmailによるSMTPサーバの構築 (3/3)

[鶴長鎮一,@IT]
前のページへ 1|2|3       

tcpserverによる起動の設定

 これまでに紹介していた起動方法は、qmailの動作を確認するための便宜上のものです。実際のメールサーバ運用でinetdを使うのは、サービスに求められる堅牢さとセキュリティを考えるとお勧めできません。TCP_Wrapperを併用したり、xinetdを使うのも1つの方法ですが、ここではqmailの作者であるD. J. Bernstein氏が提供しているtcpserverを使う方法を紹介します。

tcpserverとは

 tcpserverはucspi-tcpパッケージの一部として提供されているもので、qmailの特徴を紹介する際にはtcpserverが提供する機能を含めていることがほとんどです。そうした点からも、qmailをtcpserverと切り離して動作させることは極めてまれと考えた方がいいでしょう。tcpserverには、inetdなどの従来のサービス起動プロセスと比べて次のようなメリットがあります。

  • DoS攻撃にも対応できるように、同時接続に対する制限がかけられる
  • ユーザー名・IPアドレス・ドメイン名を基に接続制限がかけられる
  • qmailが動作しているホストに複数のIPアドレスを割り振っている場合(複数のLANインターフェイスを持っているなど)、特定のIPアドレスでのみサービスを受け付けるように設定できる。「アドレスAはSMTP用、アドレスBはPOPサーバ用」などの使い分けが可能
  • 上記の要求を制御する設定ファイルはハッシュを用いた独自のデータベースファイル(cdb)を使用しているため、設定がきめ細かくなったり、数百行に及んでも高速な処理が可能。また設定の変更にサービスの再起動は必要ない

tcpserverのインストールとcdbの作成

 tcpserverのインストールは、qmail同様極めて簡単です。

をダウンロードして、

# tar xvfz ../ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88/
# make setup check

を実行すれば/usr/local/binにtcpserverをはじめとするucspi-tcpパッケージがインストールされます。

 次に設定ですが、まずcdbの基になるファイルを準備します。ここでは/etcディレクトリにtcp.smtpファイルとして作成します。

# vi /etc/tcp.smtp
192.168.0.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT="" 

 tcpserverは、動作に必要なホスト名やIPアドレスなどの情報を環境変数から取り出します。例えば、1行目の設定は「192.168.0.*からの接続は環境変数RELAYCLIENTに設定し、接続を許可する」となります。大きなサブネットで許可したくないという場合は、

192.168.0.0-31:allow,RELAYCLIENT=""

などのようにしてアドレスの範囲を指定します。これで192.168.0.0から192.168.0.31までが対象になります。逆に、接続を拒否したい場合は次のようになります。

192.168.0.:deny

 では、cdbファイルを作成します。cdbファイルは以下のコマンドを実行することで作成できます。

# /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

tcpserverによるqmailの起動

 準備が整ったところで、tcpserver経由でqmailを起動します。前半で記述したinetd.confの記述を削除するかコメントアウトし、inetdを再起動します。

 次に下記のコマンドを実行します(qmaildのUIDやnofilesのGIDはid qmaildコマンドで確認できます)。

# tcpserver -v -u[qmaildのUID] -g[nofilesのGID]-x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &

 tcpserverの代表的なオプションには次のようなものがあります。

-v すべてのメッセージを出す
-u uid ユーザーIDをuidに切り替える
-g gid グループIDをgidに切り替える
-H 逆引きをしない(リモートホスト名を調べない)
-R ident(接続したサーバのユーザー情報について、付加的な情報を返す)しない
-x /etc/tcp.cdb cdbデータベース(/etc/tcp.cdb)で制御する
-c limit 最大同時接続数をlimitに設定する(デフォルトは40)
-P 逆引き、正引きで相手の正当性を調査する

 これで完了です。前半で行った送信テストに加えて、tcp.smtpで加えた接続が許可されているクライアントからも送信のテストを行ってみましょう(メールクライアントの設定でsmtpサーバの項目があれば、今回インストールしたqmailサーバに変更します)。

 サーバ起動のたびに上記のコマンドを打ち込むのは面倒なので、起動スクリプトを用意します。下記の内容で/etc/rc.d/init.dディレクトリに「qmail」として保存します。また、ダウンロード用のファイルも用意しました。

#!/bin/sh
#
# qmail: /var/qmail
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
[ -f /var/qmail/rc ] || exit 0
case "$1" in
  start)
        # Start daemons.
        echo "Starting qmail."
        csh -cf '/var/qmail/rc &'
        tcpserver -v -u [qmaildのUID] -g [nofilesのGID]-x /etc/tcp.smtp.cdb \
       0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
        echo
        touch /var/lock/qmail
        ;;
  stop)
        # Stop daemons.
        echo "Shutting down qmail."
        PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
        if [ ! -z "$PID" ] ;  then
            /bin/kill ${PID} 1> /dev/null 2>&1
        fi
        echo
        rm -f /var/lock/qmail
        ;;
   *)
        echo "Usage: S99qmail {start|stop}"
        exit 1
esac
exit 0

 それぞれのランレベルで起動されるように、起動スクリプトとリンクを張ります。

# ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc2.d/S99qmail
# ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc3.d/S99qmail
# ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc5.d/S99qmail

 以上でqmailをメールサーバとして動作させることが可能となりました。実際の運用に移るためには、まだまだ種々の制限やユーザーが使いやすいような拡張を施す必要があります。先立ってはPOPの実装が最低限必要だと思います。シェルでメールの読み書きをしているというユーザーはいまや少なくなり、UNIXをデスクトップマシンとして使っている方でさえ、POP3やIMAPでメールを取り込むことが多くなってきていると思います。次回はPOP3をはじめ、POP before SMTPやAPOP、IMAPなどのメール受信機能の実装を紹介します。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。