qmail
自宅から外部へメールを送信するのとkajukaju.netドメイン宛のメールを受信するためにSMTPサーバを導入する。
KAJUKAJU.netが接続しているISPではOutbound 25 blockが導入されているため外部へのメール送信は全てISPのSMTPサーバ経由で配送させる。
# /usr/sbin/groupadd -g 205 nofiles
# /usr/sbin/groupadd -g 206 qmail
# /usr/sbin/useradd -u 205 -g nofiles -d /var/qmail/alias -s /sbin/nologin alias
# /usr/sbin/useradd -u 206 -g nofiles -d /var/qmail -s /sbin/nologin qmaild
# /usr/sbin/useradd -u 207 -g nofiles -d /var/qmail -s /sbin/nologin qmaill
# /usr/sbin/useradd -u 208 -g nofiles -d /var/qmail -s /sbin/nologin qmailp
# /usr/sbin/useradd -u 209 -g qmail -d /var/qmail -s /sbin/nologin qmailq
# /usr/sbin/useradd -u 210 -g qmail -d /var/qmail -s /sbin/nologin qmailr
# /usr/sbin/useradd -u 211 -g qmail -d /var/qmail -s /sbin/nologin qmails
qmailの公式サイトより最新のソースファイルを入手しインストールする。
また、以下のパッチも適用する。
・qmail-date-localtime.patch --> ヘッダの日付をローカルタイムに変換する
・qmail-103.patch --> 512バイト以上のDNS応答パケットに対応する
・qmail-smtpd-relay-reject --> %,!,@(は2個)がある場合受信を拒否する
・qmail-0.0.0.0.patch --> IPアドレスが0.0.0.0のホストを自ホストとする
・qmail-1.03.errno.patch --> glibc-2.3.1以降対応用
・qmail-1.03.qmail_local.patch --> glibc-2.3.1以降対応用
上記以外でも気になるパッチがある(今回は未適用)。
・qmail-qread-date-localtime.patch --> qmail-date-localtime.patchの不具合修正
・badrcptto.patch --> 指定宛先宛のメールを拒否
・qmail-bouncecontrol-1.03.patch --> qmail標準のバウンスメッセージを変更
$ wget ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz $ tar xvzf qmail-1.03.tar.gz $ cd qmail-1.03 $ patch -s -p1 < ../qmail-date-localtime.patch $ patch -s -p1 < ../qmail-103.patch $ patch -s -p1 < ../qmail-smtpd-relay-reject $ patch -s -p1 < ../qmail-0.0.0.0.patch $ patch -s -p1 < ../qmail-1.03.errno.patch $ patch -s -p1 < ../qmail-1.03.qmail_local.patch ○実際にパッチが当てられたファイルは以下のとおり $ ls -al |grep "6月 26" drwxr-xr-x 3 user group 4096 6月 26 00:43 .. -rw-r--r-- 1 user group 1763 6月 26 00:45 cdb_seek.c -rw-r--r-- 1 user group 1811 6月 26 00:45 date822fmt.c -rw-r--r-- 1 user group 8927 6月 26 00:45 dns.c -rw-r--r-- 1 user group 767 6月 26 00:45 error.3 -rw-r--r-- 1 user group 432 6月 26 00:45 error.h -rw-r--r-- 1 user group 2456 6月 26 00:45 ipme.c -rw-r--r-- 1 user group 17982 6月 26 00:45 qmail-local.c -rw-r--r-- 1 user group 11635 6月 26 00:45 qmail-smtpd.c # make # make setup check
qmailの設定ファイルを編集。
設定のポイント
・ホスト名は [postman.kajukaju.net]
・サーバが受け取るドメイン名は [@kajukaju.net]
・メールの中継を許可するドメイン名は [@kajukaju.net]
・受信メールの最大サイズは [10MB(10485760byte)]
postman.kajukaju.net/var/qmail/control/locals
kajukaju.net/var/qmail/control/rcpthosts
kajukaju.net/var/qmail/control/databytes
10485760バウンスメール受信用、内部エラー発生時受信用の管理者アカウントを作成する。 実際にはこれら管理者アカウント宛のメールは実メールに転送する。
# echo "&username" > /var/qmail/alias/.qmail-root各ユーザアカウントに対してメールボックスを作成する。 qmailはmailbox形式、Maildir形式どちらでも対応可能だがMaildir形式にする。
# echo "&username" > /var/qmail/alias/.qmail-mailer-daemon
# echo "&username" > /var/qmail/alias/.qmail-postmaster
# su - username $ /var/qmail/bin/maildirmake /home/username/Maildir $ ls -al /home/username/Maildir drwx------ 8 user group 4096 6月 26 22:18 . drwx------ 4 user group 4096 6月 16 13:38 .. drwx------ 2 user group 8192 6月 26 21:22 cur drwx------ 2 user group 8192 6月 26 21:40 new drwx------ 2 user group 4096 6月 26 21:40 tmp新規にアカウントを作成したときに自動的にメールボックスが作成されるようにスケルトンディレクトリにも作成しておくとよい。
# /var/qmail/bin/maildirmake /etc/skel/Maildirqmailの起動スクリプトを編集しMaildir形式で起動するようにする。
/var/qmail/boot/home
#!/bin/sh
# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Mailbox by default.
exec env - PATH="/var/qmail/bin:$PATH" \
#qmail-start ./Mailbox splogger qmail
qmail-start ./Maildir/ splogger qmail
このままではqmailは/var/qmail/control/rcpthostsに書いた宛先宛のメールしか受け取らない。
外部宛てにメールを送信するためにucspi-tcpを導入する。
ucspi-tcpの公式サイトより最新のソースファイルを入手しインストールする。
また、以下のパッチも適用する。
・ucspi-tcp-0.88.errno.patch --> glibc-2.3.1以降対応用
・ucspi-tcp-0.88.a_record.patch --> glibc-2.3.1以降対応用
・ucspi-tcp-0.88.nobase.patch --> glibc-2.3.1以降対応用
$ wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz $ tar xvzf ucspi-tcp-0.88.tar.gz $ cd ucspi-tcp-0.88.tar.gz $ patch -s -p1 < ../ucspi-tcp-0.88.errno.patch $ patch -s -p1 < ../ucspi-tcp-0.88.a_record.patch $ patch -s -p1 < ../ucspi-tcp-0.88.nobase.patch ○実際にパッチが当てられたファイルは以下のとおり $ ls -la |grep "6月 26" drwxr-xr-x 2 user group 8192 6月 26 01:44 . drwxr-xr-x 4 user group 4096 6月 26 01:44 .. -rw-r--r-- 1 user group 513 6月 26 01:44 error.h -rw-r--r-- 1 user group 5561 6月 26 01:44 rblsmtpd.c -rw-r--r-- 1 user group 5569 6月 26 01:44 rblsmtpd.c.orig # make # make setup check
メールの中継を許可するホスト、ネットワークを指定する。
今回は以下のホスト、ネットワークを許可した。
・127.0.0.1
・192.168.1.0/24
127.0.0.1:allow,RELAYCLIENT=""ucspi-tcpが理解できるファイル形式に変換する。
192.168.1.:allow,RELAYCLIENT=""
# /usr/local/bin/tcprules /var/qmail/control/smtp.rules.cdb /var/qmail/control/smtp.rules.temp < /var/qmail/control/smtp.rules.txt起動スクリプトを作成する。
/etc/rc.d/init.d/qmail
#!/bin/sh
#
# qmail This shell script takes care of starting and stopping
# qmail on RedHat or other chkconfig-based system.
#
# chkconfig: 345 24 76
#
# processname: qmail
#
# Source Redhat function library.
#
. /etc/rc.d/init.d/functions
# Track on path to qmail if not already in PATH
QMAIL_PATH=":/usr/local/bin:/var/qmail/bin"
PATH=$PATH$QMAIL_PATH
export PATH
# See how we were called.
start() {
# Start daemons.
echo -n "Starting qmail-start: "
qmail-start ./Maildir/ splogger qmail &
touch "/var/lock/subsys/qmail-start"
echo
# Start SMTP
echo -n "Starting qmail-send: "
tcpserver -v -u 206 -g 205 -R -x /var/qmail/control/smtp.rules.cdb 0 smt
p qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
touch "/var/lock/subsys/qmail-smtpd"
echo
}
stop() {
# Stop daemon.
echo -n "Stopping qmail: "
pkill qmail-send
kill `ps -aux | grep qmaild | grep -v grep | awk '{print $2;}'`
rm -rf /var/lock/subsys/qmail-start
rm -rf /var/lock/subsys/qmail-smtpd
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status qmail-smtpd
RETVAL=$?
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit $?
起動スクリプトを登録する。
# /sbin/chkconfig --add qmail # /sbin/chkconfig --list |grep qmail qmail 0:オフ 1:オフ 2:オフ 3:オン 4:オン 5:オン 6:オフqmailを起動する。
# /var/qmail/boot/home & # tcpserver -v -u 206 -g 205 -x /var/qmail/control/smtp.rules.cdb 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 & # ps -aux |grep qmail qmails 32582 1 0 01:39 pts/1 00:00:00 qmail-send qmaill 32583 32582 0 01:39 pts/1 00:00:00 splogger qmail root 32584 32582 0 01:39 pts/1 00:00:00 qmail-lspawn ./Maildir/ qmailr 32585 32582 0 01:39 pts/1 00:00:00 qmail-rspawn qmailq 32586 32582 0 01:39 pts/1 00:00:00 qmail-clean qmaild 922 32650 0 01:54 pts/1 00:00:00 tcpserver -v -u 206 -g 205 -x /var/qmail/control/smtp.rules.cdb 0 smtp /var/qmail/bin/qmail-smtpd root 923 32650 0 01:54 pts/1 00:00:00 /var/qmail/bin/splogger smtpd 3 # netstat -an |grep 25 tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN動作確認をする。
# telnet postman.kajukaju.net 25メールが受信できていることを確認する。
Trying 192.168.1.xx...
Connected to boris (192.168.1.xx).
Escape character is '^]'.
220 postman.kajukaju.net ESMTP
helo localhost
250 postman.kajukaju.net
mail from:<user@domainname>
250 ok
rcpt to:<username@kajukaju.net>
250 ok
data
354 go ahead
This mail is testmail.
.
250 ok 1119718602 qp 931
quit
221 postman.kajukaju.net
Connection closed by foreign host.
# ls -al /home/username/Maildir/new 合計 20 drwx------ 2 user group 8192 7月 21 21:40 . drwx------ 8 user group 4096 7月 21 22:18 .. -rw------- 1 user group 6354 7月 21 21:40 1121949653.M381302P7128V0000000000002107I0009E707_0.boris,S=6354サーバ稼働時のログ。
# tail /var/log/maillogログローテートの設定追加。
Jun 26 01:39:44 boris qmail: 1119717584.852036 status: local 0/10 remote 0/20
Jun 26 01:56:42 boris qmail: 1119718602.072734 new msg 336688
Jun 26 01:56:42 boris qmail: 1119718602.072902 info msg 336688: bytes 167 fromqp 931 uid 206
Jun 26 01:56:42 boris qmail: 1119718602.083708 starting delivery 1: msg 336688 to local username@kajukaju.net
Jun 26 01:56:42 boris qmail: 1119718602.083848 status: local 1/10 remote 0/20
Jun 26 01:56:42 boris qmail: 1119718602.099562 delivery 1: success: did_1+0+0/
Jun 26 01:56:42 boris qmail: 1119718602.099712 status: local 0/10 remote 0/20
Jun 26 01:56:42 boris qmail: 1119718602.099758 end msg 336688
/etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/mail.log /var/log/boot.log /var/log/cron.log /var/log/snmp.log /var/log/named.log {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslog-ng.pid 2> /dev/null` 2> /dev/null || true
endscript
}