magic-smtpdのインストール

存在しないユーザ宛で届くメールがとんでもなく送られ、必要なメールの遅配が目立ってきたため
qmail-smtpdからmagic-smtpdに移行したときのインストールメモです

環境としてはqmail-smtpdにvpopmail,simscan,spamassassin,clamavという環境だったのですが、qmail-smtpdは
存在しないユーザ宛のメールも、すべて受け取りsimscanを通したあと削除されるため、spamassassinの処理時間が
ムダに消費されていました。
そこで、宛先のチェック、存在しなければ削除できればと思いmagic-smtpdを導入しました。

1.インストール

http://www.linuxmagic.com/opensource/magicmail.dep から最新版をダウンロード
(2010.10.7時点では version 0.8.4-2 が最新)

解凍
#tar xvfz magic-smtpd-0.8.4-2.tar.gz

そのままmakeするとエラーが出たためソースの修正

common/ip2country.c に追加
#include <linux/limits.h> ← 追加

magic-smtpd/magic-smtpd.h の42行目をコメントアウト

#ifndef _MSD_H
#define _MSD_H

/* Global readonly variables */
//extern lm_string_t smtp_from_addr;    ← コメントアウト

void msd_error_out_of_memory(void);
int msd_timeout_read_line(int fd, char ** line, int *linelen);
int msd_timeout_read(int fd, char *buf, int len, int *timeout);
int msd_write(int fd, lm_string_t line);
int config_check_morercpthosts(int cdb_file, char *domain
);

ディレクトリを作成
#
mkdir -p /etc/magic-mail/control

ビルド
#make

qmail/binにコピー
#cp magic-mail/magic-smtpd /var/qmail/bin/

2.設定

/etc/magic-smtpd/control/ にファイルを作成する

ファイル 設定値
check_valid_users true
ext_check_user_prog /home/vpopmail/bin/vchkpw
ext_check_user_prog /usr/local/bin/vpopmail-check-user.sh
max_invalid_rcpt 1 (不正中継チェックでは途中で切断されるためテストの時は0にする)
auth_enable true

/usr/local/bin/vpopmail-check-user.sh の作成

#!/bin/sh

EMAIL=$1
ALIASRET=`/home/vpopmail/bin/valias.magic $EMAIL >/dev/null 2>&1 ; echo $?`
ALIASNUM=`/home/vpopmail/bin/valias.magic $EMAIL | wc -l`
USER=`/home/vpopmail/bin/vuserinfo.magic $EMAIL >/dev/null 2>&1; echo $? | grep "0" >/dev/null 2>&1 ; echo $?`

if [ $ALIASNUM -ge 1 ] && [ $ALIASRET -eq 0 ]; then
    exit 0
else
    if [ $USER -eq 0 ]; then
        exit 0
    else
        exit 1
    fi
fi

vpopmail/valias、vpopmail/vuserinfoの変更
(現状の環境のままテストするためコピーしておく)

valias → valias-magic
vuserinfo → vuserinfo-magic

#cp /home/vpopmail/bin/valias /home/vpopmail/bin/valias-magic
#cp /home/
vpopmail/bin/vuserinfo /home/vpopmail/bin/vuserinfo-magic
#
chmod 4755 /home/vpopmail/bin/valias-magic
#chmod 6755 /home/vpopmail/bin/vuserinfo-magic
#ls -l

-rwx--x--x 1 vpopmail vchkpw 99448 2010-09-30 15:39 valias
-rwsr-xr-x 1 vpopmail vchkpw 99448 2010-10-06 11:05 valias.magic
-rwx--x--x 1 vpopmail vchkpw 101848 2010-09-30 15:39 vuserinfo
-rwsr-sr-x 1 vpopmail vchkpw 101848 2010-10-06 11:05 vuserinfo.magic

設定内容の確認

#./magic-smtpd -s

DEBUG: loading controls from environment
where | option | value
------------------------------------------------------------
environ | tcpremoteip | (null)
environ | tcplocalip | (null)
environ | tcpremotehost | (null)
environ | tcpremoteinfo | (null)
environ | tcprelayclient | (null)

DEBUG: loading controls from directory: /etc/magic-mail/control
where | option | value
------------------------------------------------------------
loaded | auth_enable | 1
default | check_valid_from | 0
loaded | check_valid_users | 1
loaded | dump_core | 0
default | dynamic_dns_regex_filename | /etc/magic-mail/control/dynamic_dns_regexes
loaded | ext_check_passwd_prog | /home/vpopmail/bin/vchkpw
loaded | ext_check_user_prog | /usr/local/bin/vpopmail-check-user.sh
default | ext_spam_rule_prog | (null)
default | ip2country_datadir | /usr/local/share/perl/5.6.1/IP/Country/Fast
default | max_hops | 100
loaded | max_invalid_rcpt | 1
default | max_line_length | 1024
default | max_rcpt | 0
loaded | max_smtp_cmds | 101
default | qmail_queue | /var/qmail/bin/qmail-queue
default | rcpt_delay_at | 0
default | rcpt_delay_inc | 0
default | rcpt_delay_max | 0
default | rfc_addr_only | 0
default | stray_newline_detection | 1
default | spam_check_enable | 0
default | spam_log_file | (null)
default | spam_rule_dbfile | /etc/magic-mail/dbfiles/spam.db
default | tls_cadir | /etc/ssl/certs
default | tls_cafile | (null)
default | tls_certificate | /etc/magic-mail/control/cert.pem
default | tls_dhparams | /etc/magic-mail/control/dh.pem
loaded | tls_enable | 1
default | tls_keyfile | /etc/magic-mail/control/cert.pem
default | tls_password | (null)
default | use_dbfile | 0
default | user_info_dbfile | /etc/magic-mail/dbfiles/user.db

DEBUG: loading controls from directory: /var/qmail/control
where | option | value
------------------------------------------------------------
loaded | defaultdomain | mail.xxxx.jp
loaded | me | mail.xxxx.jp
default | smtpgreeting | MagicMail Daemon with Built-In Anti-Spam\See http://www.linuxmagic.com for info
default | databytes | 2147483646
loaded | timeoutsmtpd | 60
default | badmailfrom | (null)

タイムアウトも設定

ファイル 設定値
/var/qmail/control/timeoutsmtpd 60

起動スクリプト
(とりあえずポート11000でテスト)

 #FOR SMTP 11000
echo "Starting qmail. port 11000"
tcpserver -H -R -v \
-u $QMAILDUID -g $QMAILDGID \
-x /etc/tcp.smtp.cdb \
0 11000 \
/var/qmail/bin/magic-smtpd \  ← magic-smtpdを指定
2>&1 | /var/qmail/bin/splogger magic-smtp 2 &

動作確認

# telnet localhost 11000 Trying ::1...
telnet: connect to address ::1: Connection refused Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220-mail.xxxx.jp ESMTP
220-MagicMail Daemon with Built-In Anti-Spam
220 See
http://www.linuxmagic.com for info
mail from zzzz@xxxx.jp
250 ok
rcpt to:validuser@xxxx.jp         ← 存在するアドレス
250 ok
rcpt to:invaliduser@xxxx.jp        ← 存在しないアドレス
550 Too many invalid user RCPT's sent. Exiting.
Connection closed by foreign host.

mailログの確認

Oct 7 08:32:20 mail smtpd: 1286407940.137946 tcpserver: pid 27371 from 69.49.43.201
Oct 7 08:32:20 mail smtpd: 1286407940.137961 tcpserver: ok 27371 0:192.168.200.12:25 :69.49.43.201::4532
Oct 7 08:32:20 mail msd[27371]: Initializing for connection from 69.49.43.201
Oct 7 08:32:20 mail msd[27371]: EHLO command received, args: on.ca
Oct 7 08:32:20 mail msd[27371]: HELO host does not match TCPREMOTEHOST
Oct 7 08:32:21 mail msd[27371]: MAIL command received, args: FROM:<aipabo5684@on.ca>
Oct 7 08:32:21 mail msd[27371]: Allowed to relay: no
Oct 7 08:32:21 mail msd[27371]: rcpthost [xxxx.jp] matched [xxxx.jp]
Oct 7 08:32:21 mail msd[27372]: running external check user program: [/usr/local/bin/vpopmail-check-user.sh] [oqaeran9914@xxxx.jp]
Oct 7 08:32:21 mail msd[27371]: RCPT command received (69.49.43.201), args: oqaeran9914@xxxx.jp (local/noexist)
Oct 7 08:32:21 mail msd[27371]: too many invalid rcpts: 1
Oct 7 08:32:21 mail msd[27371]: Exiting
Oct 7 08:32:21 mail smtpd: 1286407941.912760 tcpserver: end 27371 status 256
Oct 7 08:32:21 mail smtpd: 1286407941.912793 tcpserver: status: 6/40

以上で完了、ポートをsmtpに変更する