qmailで pop before smtp の実装

tcpserverで構成した場合、SMTPはメールのリレーをIPアドレス制御(/etc/tcp.smtp.cdb)することが可能です。この機能を利用し不特定なIPアドレス からのメールリレーを禁止することが一般的です。
しかし、外出先からメールを送る際に、IPが固定では無いため送信が出来なくなってしまいます。
これでは不便だということで、特定のユーザに対 してはメールのリレーを許可するということを実現するのが「POP before SMTP」です。
POPの認証機能を利用して、POP後指定した時間だけPOPしたIPのリレー許可をするものです。
既に qmailの標準インストール が完了しているものとして説明します。

また、あらかじめDJBのdaemontoolsが必要になります。詳しくは daemontoolsのインストール を参照ください。

ソース入手

以下のURLから最新のソースを入手してください。
http://untroubled.org/relay-ctrl/
今回はrelay-ctrl-3.1.1.tar.gzをダウンロードしました。
http://untroubled.org/relay-ctrl/relay-ctrl-3.1.1.tar.gz

インストール

ここではrelay-ctrl-3.1.1.tar.gzをダウンロードしたものとして説明します。

$ tar xvfz relay-ctrl-3.1.1.tar.gz
$ cd relay-ctrl-3.1.1
$ make
$ su
# ./installer

これでインストールは完了です。
また、 コンフィグファイルを設置するための/etc/relay-ctrlディレクトリと、アクセス用のファイルを保存する/var/spool/relay-ctrl/spoolディレクトリを作成します。

# mkdir /etc/relay-ctrl
# mkdir -p /var/qmail/relay-ctrl/spool
# chmod 700 /var/qmail/relay-ctrl
# chmod 777 /var/qmail/relay-ctrl/spool

アクセスコントロール用ファイル作成

アクセスコントロール用のファイルを用意し環境変数のセットします。

(1) 許可IPをおくディレクトリの指定(RELAY_CTRL_DIR)

# cd /etc/relay-ctrl
# echo /var/qmail/relay-ctrl/spool > RELAY_CTRL_DIR

(2) SMTPの許可時間の指定(RELAY_CTRL_EXPIRY)
秒で指定します。

# cd /etc/relay-ctrl
# echo 600 > RELAY_CTRL_EXPIRY

起動方法の変更

POP Before SMTP を有効にするため、POP,SMTPの起動方法を変更します。

(1) POP起動方法の変更
envdir /etc/relay-ctrl relay-ctrl-chdirとrelay-ctrl-allowの記述の追加

/usr/local/bin/envdir /etc/relay-ctrl \
/usr/local/bin/relay-ctrl-chdir \
/usr/local/bin/tcpserver -v -R -H 0 pop3 \
/var/qmail/bin/qmail-popup hoge.example.com /bin/checkpassword \
/usr/local/bin/relay-ctrl-allow qmail-pop3d Maildir 2>&1 \
| /var/qmail/bin/splogger pop3d 3 &

(2) SMTP起動方法の変更
envdir /etc/relay-ctrl relay-ctrl-chdirとrelay-ctrl-checkの記述の追加

/usr/local/bin/envdir /etc/relay-ctrl \
/usr/local/bin/relay-ctrl-chdir \
/usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb \ 
 -R -H -u 71 -g 70 0 smtp /usr/local/bin/relay-ctrl-check \
/var/qmail/bin/qmail-smtpd 2>&1 \
| /var/qmail/bin/splogger smtp 3 &

これで起動すればPOP Before SMTPが有効になります。
また、PBSのデータベースのクリアをcrontabを利用して定期的に実行しましょう。

# crontab -e

* * * * * /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age

自動スクリプトの作成 (2004/6/9修正)

qmailの自動起動スクリプトを作成しました。よろしければご利用ください。
stopでtcpserver経由のプロセスをkillしていますのでqmail以外でtcpserverを利用している場合は注意が必要です。
qmailの標準インストール を少し編集したものですが。。。。

#!/bin/sh
# chkconfig: 345 85 15
# description: Dynamic Relay Authorization Control
# processname: qmail
#
# 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."

        # qmail
        csh -cf '/var/qmail/rc &'

        # POP3
        envdir /etc/relay-ctrl relay-ctrl-chdir \
        tcpserver -v -R -H 0 pop3 qmail-popup \
        `/bin/cat /var/qmail/control/me` /bin/checkpassword \
        relay-ctrl-allow qmail-pop3d Maildir 2>&1 \
        | splogger pop3d 3 &

        # SMTP
        envdir /etc/relay-ctrl relay-ctrl-chdir \
        tcpserver -v -x /etc/tcp.smtp.cdb -R -H \
        -u `/usr/bin/id -u qmaild` -g `/usr/bin/id -g qmaild` \
        0 smtp relay-ctrl-check qmail-smtpd 2>&1 \
        | splogger smtp 3 &

        echo
        touch /var/lock/subsys/qmail
        ;;
  stop)
        # Stop daemons.
        echo "Shutting down qmail."
        kill $(/sbin/pidof tcpserver)
        kill $(/sbin/pidof qmail-send)
        echo
        rm -f /var/lock/subsys/qmail
        ;;
   *)
        echo "Usage: S99qmail {start|stop}"
        exit 1
esac

exit 0

これで、POP認証されたユーザは/etc/tcp.smtp.cdbにIPが記録され認証後600秒はメールを送信することが可能となります。
有効時間を長くしたければ、 /etc/relay-ctrl/RELAY_CTRL_EXPIRYを修正して時間を調整しましょう。

marronおすすめの参考書 by Amazon
Q-Mail Q-Mail
Oreilly & Associates Inc / John R. Levine, Russell Nelson
¥ 3,965
The Qmail Handbook The Qmail Handbook
Apress / Dave Sill
¥ 5,021
Running Qmail (Sams White Book Series) Running Qmail (Sams White Book Series)
Sams / Richard Blum

Copyright(C) 2004-2006 マロンくん.NET ~サーバ管理者への道~ All Rights. Reserved.