CentOS

2006/8/10 04:37 PM 更新

qmail

自宅から外部へメールを送信するのとkajukaju.netドメイン宛のメールを受信するためにSMTPサーバを導入する。
KAJUKAJU.netが接続しているISPではOutbound 25 blockが導入されているため外部へのメール送信は全てISPのSMTPサーバ経由で配送させる。

qmailを起動する専用ユーザを作成する。
# /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)]

  /var/qmail/control/me
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
# echo "&username" > /var/qmail/alias/.qmail-mailer-daemon
# echo "&username" > /var/qmail/alias/.qmail-postmaster
各ユーザアカウントに対してメールボックスを作成する。 qmailはmailbox形式、Maildir形式どちらでも対応可能だがMaildir形式にする。
# 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/Maildir
qmailの起動スクリプトを編集し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

  /var/qmail/control/smtp.rules.txt
127.0.0.1:allow,RELAYCLIENT=""
192.168.1.:allow,RELAYCLIENT=""
ucspi-tcpが理解できるファイル形式に変換する。
# /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 from qp 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
}