2014年02月02日

Postfix で POP before SMTP

POP before SMTP を実現するにはどうすればいいのか、調べてみた。
意外と簡単。

手元の環境は:
OS: CentOS release 6.4 (Final)
MTA: Postfix 2.6.6
POP/IMAP: Dovecot 2.0.9

Pop-before-smtp パッケージは yum ではインストールできないようなので、Pop-before-smtp プロジェクトのサイト (http://popbsmtp.sourceforge.net/) からダウンロードしてインストールする。
Quickstart Guide が用意されているので、基本的にはそれを元に作業すればOK。

1. Pop-before-smtp のインストールと起動

まずは、必要なパッケージのインストール:
# yum install perl-TimeDate perl-Net-Netmask perl-DB_File

Pop-before-smtp のファイル一式をダウンロードして展開したら、ファイルをコピーする (なんと手作業インストール!)。
# cp pop-before-smtp.init /etc/rc.d/init.d/pop-before-smtp # cp pop-before-smtp /usr/sbin/ # cp pop-before-smtp-conf.pl /etc

設定ファイル /etc/pop-before-smtp-conf.pl を編集する。
  1. 以下の行を探し、必要に応じて設定:
    # Set the log file we will watch for pop3d/imapd records. #$file_tail{'name'} = '/var/log/maillog';
  2. $patを定義していると箇所を探し出し、システムの設定に合ったものをコメントアウト。
    今回は Dovecot + syslog なので、以下の部分をコメントアウトした:
    # For Dovecot POP3/IMAP when using syslog. $pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' . 'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]'; $out_pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' . 'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
設定は、とりあえずこれで完了。
$pat の設定が正しいかどうかは、以下のコマンドでテストできる。
# pop-before-smtp --debug --nowrite --reproces Feb 2 17:21:32 starting up (v1.42) Feb 2 17:21:32 Using 2 values for pre-authorized networks: `XX.XX.XX.XX/32', `127.0.0.0/8' Feb 2 03:14:02 startup log-scan complete Feb 2 03:14:02 ignoring local-net ip=XX.XX.XX.XX : Feb 2 15:34:02 ignoring local-net ip=XX.XX.XX.XX Feb 2 15:44:05 ignoring local-net ip=XX.XX.XX.XX Feb 2 15:44:41 found ip=XX.XX.XX.XX (-1) Feb 2 15:54:09 ignoring local-net ip=XX.XX.XX.XX :
こんな感じに表示されれば問題無し。

デーモンをスタートしてみる:
# chkconfig --add pop-before-smtp # chkconfig --list | grep -i pop pop-before-smtp 0:off 1:off 2:on 3:on 4:on 5:on 6:off # service pop-before-smtp start Starting pop-before-smtp: done

正常に動作すれば、データベースファイルが作られる:
# ls -l /etc/postfix/pop-before-smtp* -rw-r--r-- 1 root root 12288 Feb 2 18:00 /etc/postfix/pop-before-smtp.db

2. Postfix の設定

設定ファイル /etc/postfix/main.cf を開き、どこかに:
check_client_access = hash:/etc/postfix/pop-before-smtp
の1行を追記する。
ついでに、説明書のアドバイスに従って以下の設定も追加:
smtpd_recipient_restrictions = permit_mynetworks,reject_non_fqdn_recipient, check_client_access hash:/etc/postfix/pop-before-smtp, reject_unauth_destination
Postfix の設定再読み込み。
# service postfix reload

3. 動作の確認

まず、Pop-before-smtp に登録されている IP アドレスのリストを確認してみる。
# pop-before-smtp --list The database holds 0 IPs.
となっていれば、まだ登録されていない状態。
この状態で、メール送信を試してみると、メールーサーバのログに:
Feb 2 19:25:58 localhost postfix/smtpd[3537]: connect from xxx.yyy.zzz[XX.XX.XX.XX]
Feb 2 19:25:58 localhost postfix/smtpd[3537]: NOQUEUE: reject: RCPT from xxx.yyy.zzz[XX.XX.XX.XX]: 554 5.7.1 <aaa@bbb.ccc.ddd>: Relay access denied; from=<k-ishik@ll.mm.nn> to=<aaa@bbb.ccc.ddd> proto=ESMTP helo=<[192.168.0.10]>
Feb 2 19:25:58 localhost postfix/smtpd[3537]: disconnect from xxx.yyy.zzz[XX.XX.XX.XX]
といったエラーが出力される。
(メール転送が許可されない)

次に、POP 受信した後に試してみる。
# pop-before-smtp --list The database holds 1 IP: XX.XX.XX.XX
と表示されれば、Pop-before-smtp は正常に動作している。
メール送信も正常に行われる (はず)。
posted by K/I at 18:47 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする