[ TOP ]
2004/3/24

qmail + vpopmail

qmail + vpopmail

上へ
  qmail + vpopmail

MTA(Mail Transfer Agent)には、最初から入っているsendmailではなくqmailを利用します。
インストールはsendmailの方が楽なんですが、セキュリティホールなどを考えるとqmailの方が安定してるということでこちらにしました。

ちなみに、思ったとおりではまりました。(T-T)
2日間ほどインストールと設定を繰り返しました。。。。
#複数のドメインを利用するということがなければ、意外なほど簡単に動きましたが。。。。(--;;

そんな中、kuri3.net XOOPS実験室さんのコンテンツの第6章 スーパー&セキュアなMailサーバー構築(インストール編)が大変参考になりました。
他のコンテンツも大変参考になります。一度訪れることをお薦めします。

ちなみに、バーチャルドメインは使わねぇ〜!って人はここを参考にすると良いかもです。
http://uworld.ddo.jp/uBlog/archives/000176.html

    前置き.

      コンパイルの途中でエラーが出た場合に

    makeでエラーになって止まる場合は、まずerror.hというファイルがあるかを探し、あった場合は
    error.h 内の
    extern int errno;
    という行を探し、
    #include <errno.h>
    と修正するとOKになることが多いです。

  1.   sendmailが入っていたら削除

    まずは、sendmailが入っていたら削除します。
    # rpm -qa | grep sendmail
    # rpm -e sendmail-<Version>

  2.   必要なファイルをダウンロード

    インストールするファイルはRed Hat社には無いので各所から取得する必要があります。

    単純にダウンロードしまくるというのもありなんですが、この2カ所のサイトは最低限、目を通しておくと良いです。

    qmailの作者 Dan Bernstein氏
    vpopmailやqmailadminなどの、inter 7

    作業はとりあえず、/usr/src/qmail というディレクトリを用意してここを基本として作業することにします。
    ダウンロードしたファイルはとりあえず総てここに置きます。
    このディレクトリでwgetコマンドで取得するのも良いでしょう。
    # wget http://cr.yp.to/software/qmail-1.03.tar.gz
    # wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
    # wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
    # wget http://www.qmail.org/ucspi-rss.diff
    # wget http://www.qmail.org/qmailqueue-patch
    # wget http://www.ckdhr.com/ckd/qmail-103.patch
    # wget http://www.shupp.org/patches/qmail-maildir++.patch
    # wget ftp://ftp.pipeline.com.au/PipeInt/Sources/Linux/WebMail/qmail-date-localtime.patch.txt
    # wget ftp://ftp.pipeline.com.au/pipeint/sources/linux/WebMail/qmail-limit-bounce-size.patch.txt
    # wget ftp://ftp.pipeline.com.au/PipeInt/Sources/Linux/WebMail/qregex.patch-20020129.txt
    # wget ftp://ftp.pipeline.com.au/PipeInt/Sources/Linux/WebMail/qmail-smtpd-esmtp-size_qregex-compat.diff.txt
    # wget http://www.lifewithqmail.org/qmailctl-script-dt70

  3.   ユーザーとインストール用ディレクトリを作成

    qmailとvpopmailのユーザーとインストール用ディレクトリは最初に全部作ってしまいます。

    qmail
    # mkdir /var/qmail
    # groupadd nofiles
    # useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
    # useradd -g nofiles -d /var/qmail -s /bin/false qmaild
    # useradd -g nofiles -d /var/qmail -s /bin/false qmaill
    # useradd -g nofiles -d /var/qmail -s /bin/false qmailp
    # groupadd qmail
    # useradd -g qmail -d /var/qmail -s /bin/false qmailq
    # useradd -g qmail -d /var/qmail -s /bin/false qmailr
    # useradd -g qmail -d /var/qmail -s /bin/false qmails

    vpopmail
    # groupadd -g 89 vchkpw
    # useradd -g vchkpw -u 89 vpopmail
    # mkdir /home/vpopmail/etc

  4.   tcpserver をインストール

    まずは、qmailやvpopmailを動かす前提条件ということで tcpserver からインストールします。
    解凍して、ディレクトリを移動します
    # tar zxvf ucspi-tcp-0.88.tar.gz
    # cd ucspi-tcp-0.88

    RBL対応パッチをあてます
    # patch -p0 rblsmtpd.c < ../ucspi-rss.diff

    rblsmtpd.cを編集します
    # vi rblsmtpd.c
    166行目を修正
    if (text.len > 200) text.len = 200;

    if (text.len > 500) text.len = 500;

    インストールします
    # make
    # make setup check

  5.   daemontools をインストール

    次に daemonools をインストールします。
    daemontools のインストールは /package でやる必要があります
    # mkdir -p /package
    # chmod 1755 /package
    # cd /package

    解凍して、ディレクトリを移動します
    # tar zxvf /usr/src/qmail/daemontools-0.76.tar.gz
    # cd admin/daemontools-0.76

    インストールします
    # ./package/install

    この2つのディレクトリが出来ているか確認します
    # ls /
    /command
    /service

    inittab内の最後に1行登録されているか確認します
    # tail /etc/inittab
    SV:123456:respawn:/command/svscanboot

    動作テスト
    # /command
    # date | ./tai64n | ./tai64nlocal
    # date | sh -c './multilog t e 2>&1' | ./tai64nlocal

    それぞれ日時が2つ並んで表示されるので、その時間が同じか確認します
    同じならばOKです

  6.   qmail をインストール

    いよいよ qmail をインストールします。
    解凍して、ディレクトリを移動します
    # tar zxvf qmail-1.03.tar.gz
    # cd qmail-1.03

    パッチをあてます
    # patch -p1 < ../qmail-103.patch
    # patch -p1 < ../qmailqueue-patch
    # patch < ../qmail-maildir++.patch
    # patch -p1 < ../qmail-date-localtime.patch.txt
    # patch < ../qmail-limit-bounce-size.patch.txt
    # patch < ../qregex.patch-20020129.txt
    # patch < ../qmail-smtpd-esmtp-size_qregex-compat.diff.txt

    ソースファイルを修正します
    # vi qmail-smtpd.c
    54行目あたりのstraynewline function内を修正します
    451 → 553

    インストールします
    # make setup check
    # ./config-fast umekawa.info ← 一応メインにするドメインでOKです

    インストールしたら、設定を確認します。

    ディレクトリ /var/qmail/control 内にあるファイルを確認・修正します。
    locals受信するドメイン
    me自分のFQDN
    defaultdomainドメイン名省略時の補完ドメイン
    plusdomain+で終わっている場合の補完
    rcpthosts受信するホスト名・ドメイン名
    localsとrcpthostsにはlocalhostを追加しておきます。
    localsには、localhostのみを。
    rcpthostsには受信するバーチャルドメインを総て列記しておきます。

    meには、メインとなるドメインを入力しておく必要があります。
    入れておかないと、送信先のプロバイダによってはエラーとなります。

    sendmailのシンボリックリンクを作成します。
    これを作っておかないと、/bin/mailやcgiからのsendmail呼び出しでエラーになります。
    # ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
    # ln -s /var/qmail/bin/sendmail /usr/lib/sendmail

    qmailctl を使えるようにします。
    # cd /usr/src/qmail
    # vi qmailctl-script-dt70

    cdb) 項のパスをすべて修正します
    /etc → /home/vpopmail/etc

    同じく cdb) 項に下記の2行を追加します
    tcprules /home/vpopmail/etc/tcp.pop3.cdb /home/vpopmail/etc/tcp.pop3.tmp < /home/vpopmail/etc/tcp.pop3
    chmod 644 /home/vpopmail/etc/tcp.pop3.cdb

    bin ディレクトリにコピーして、実行権を付与します
    # cp qmailctl-script-dt70 /var/qmail/bin/qmailctl
    # chmod 755 /var/qmail/bin/qmailctl

    シンボリックリンクを作成しておきます
    # ln -s /var/qmail/bin/qmailctl /usr/bin

    次は、pop3, smtp のリレー設定を行います。

    smtpリレー
    # vi /home/vpopmail/etc/tcp.smtp
    # 明らかなspam
    216.242.75.100-116:allow,RBLSMTPD="-Connections from this IP have been banned."
    64.228.127.:allow,RBLSMTPD="-Connections refused due to spam from freeamateurhotties.com"
    154.20.94.:allow,RBLSMTPD="-Connections refused due to spam from freeamateurhotties.com"
    209.151.132.:allow,RBLSMTPD="-Connections refused due to spam from freeamateurhotties.com"
    216.18.85.:allow,RBLSMTPD="-Connections refused due to spam from freeamateurhotties.com"
    # 無条件に許可するアドレス
    # 内部LANの例
    192.168.1.:allow,RELAYCLIENT="",RBLSMTPD=""
    # サーバー自身(必須)
    127.0.0.1:allow,RELAYCLIENT="",RBLSMTPD=""
    # 上記以外はpopアカウントとRBLチェックを行う(必須)
    :allow

    pop3リレー
    # vi /home/vpopmail/etc/tcp.pop3
    # 全部受け付ける
    :allow

    暗号化DB (CDB) を作成します。
    # qmailctl cdb

    aliasの配送先を設定します。
    # cd /var/qmail/alias
    # echo "&hoge@umekawa.info" > .qmail-root
    # echo "&hoge@umekawa.info" > .qmail-postmaster
    # echo "&hoge@umekawa.info" > .qmail-mailer-daemon
    # chmod 644 .qmail-*
    # chown root.qmail .qmail-*

    メッセージ長とキュー生存時間を設定します。
    メッセージ長は20MBに
    # echo '20000000' > /var/qmail/control/databytes
    キュー生存時間は4日間に
    # echo '345600' > /var/qmail/control/queuelifetime

    不正なアドレスフォーマットを拒否するようにします。
    # echo '# reject containing invalid characters, brackets or multiple @' > /var/qmail/control/badmailto
    # echo '[!%#:\*\^]' >> /var/qmail/control/badmailto
    # echo '[\(\)]' >> /var/qmail/control/badmailto
    # echo '[\{\}]' >> /var/qmail/control/badmailto
    # echo '@.*@' >> /var/qmail/control/badmailto

    バウンスメッセージの処理も設定しておきます。
    差し出し人をpostmasterに変更します
    # echo 'postmaster' > /var/qmail/control/bouncefrom

    ダブルバウンスメールを受け取るようにします
    # echo 'postmaster' > /var/qmail/control/doublebounceto
    # echo 'umekawa.info' > /var/qmail/control/doublebouncehost


  7.   qmail の起動スクリプト

    サーバー起動時に立ち上がるようにします。
    # ln -s /var/qmail/bin/qmailctl /etc/rc.d/init.d/qmail
    # ln -s ../init.d/qmail /etc/rc.d/rc0.d/K30qmail
    # ln -s ../init.d/qmail /etc/rc.d/rc1.d/K30qmail
    # ln -s ../init.d/qmail /etc/rc.d/rc2.d/S80qmail
    # ln -s ../init.d/qmail /etc/rc.d/rc3.d/S80qmail
    # ln -s ../init.d/qmail /etc/rc.d/rc4.d/S80qmail
    # ln -s ../init.d/qmail /etc/rc.d/rc5.d/S80qmail
    # ln -s ../init.d/qmail /etc/rc.d/rc6.d/K30qmail

    runスクリプトを作成します。
    # mkdir -p /var/qmail/supervise/qmail-send/log
    # mkdir -p /var/qmail/supervise/qmail-smtpd/log
    # mkdir -p /var/qmail/supervise/qmail-pop3d/log
    # chmod +t /var/qmail/supervise/qmail-send
    # chmod +t /var/qmail/supervise/qmail-smtpd
    # chmod +t /var/qmail/supervise/qmail-pop3d

    以下、スクリプトファイルを作成しまくります。

    qmail-send
    # vi /var/qmail/supervise/qmail-send/run
    #!/bin/sh
    exec env - PATH="/var/qmail/bin:$PATH" qmail-start ./Maildir/

    qmail-send log
    # vi /var/qmail/supervise/qmail-send/log/run
    #!/bin/sh
    # ログは30個まで。1個は10MB。
    #
    # 10MBになったらローテートさせる。
    # または午前0時にcrontabでローテート。先に達した方が優先される。
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
    s10000000 n30 /var/log/qmail/send

    qmail-smtpd
    # vi /var/qmail/supervise/qmail-smtpd/run
    #!/bin/sh
    QMAILDUID=`id -u qmaild`
    NOFILESGID=`id -g qmaild`
    exec /usr/local/bin/softlimit -m 3000000 \
    /usr/local/bin/tcpserver \
    -H -l umekawa.info \
    -v -x /home/vpopmail/etc/tcp.smtp.cdb \
    -c 20 -R -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp \
    /usr/local/bin/rblsmtpd -b -C \
    -r 'relays.ordb.org:Your message was rejected because the mail server you use is configured to allow OPEN RELAY - More detailed information regarding this problem is available from http://www.ordb.org/lookup/?%IP% - Please forward this error through to your email server support staff f or easy resolution.' \
    -t 5 \
    /var/qmail/bin/qmail-smtpd 2>&1

    qmail-smtpd log
    # vi /var/qmail/supervise/qmail-smtpd/log/run
    #!/bin/sh
    # ログは各10MBのmax30個までとする。
    # 10MBになったらローテートする。またはcrontabで毎日0時にローテートさせてもよい。
    # その場合先に達したものが優先される
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
    s10000000 n30 /var/log/qmail/smtpd

    qmail-pop3d
    # vi /var/qmail/supervise/qmail-pop3d/run
    #!/bin/sh
    exec /usr/local/bin/softlimit -m 3000000 \
    /usr/local/bin/tcpserver \
    -H -l umekawa.info \
    -v -x /home/vpopmail/etc/tcp.pop3.cdb -c 30 -R 0 pop3 \
    /var/qmail/bin/qmail-popup umekawa.info \
    /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1

    qmail-pop3d log
    # vi /var/qmail/supervise/qmail-pop3d/log/run
    #!/bin/sh
    # Keep 30 logs of max 10Mb each
    # They will get rotated when they reach 10Mb in size,
    # or at midnight when our crontab script fires (whichever event comes 1st)
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
    s10000000 n30 /var/log/qmail/pop3d

    runスクリプトに実行権を付与します。
    # chmod 755 /var/qmail/supervise/qmail-send/run
    # chmod 755 /var/qmail/supervise/qmail-send/log/run
    # chmod 755 /var/qmail/supervise/qmail-smtpd/run
    # chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
    # chmod 755 /var/qmail/supervise/qmail-pop3d/run
    # chmod 755 /var/qmail/supervise/qmail-pop3d/log/run

    ログ用ディレクトリを作成します。
    # mkdir /var/log/qmail
    # mkdir /var/log/qmail/smtpd
    # mkdir /var/log/qmail/send
    # mkdir /var/log/qmail/pop3d
    # chown -R qmaill /var/log/qmail

    qmailの起動設定をします。
    # ln -s /var/qmail/supervise/qmail-send /service
    # ln -s /var/qmail/supervise/qmail-smtpd /service
    # ln -s /var/qmail/supervise/qmail-pop3d /service

    すべて作成し終わったら、サーバーを再起動しておきましょう。

  8.   qmail の起動確認

    qmail が起動されたか確認します。
    # ps axf

    こんなのが表示されればOKです。

     1278 ?        S      0:00 /bin/sh /command/svscanboot
     1280 ?        S      0:00  \_ svscan /service
     1282 ?        S      0:00  |   \_ supervise qmail-send
     1288 ?        S      0:00  |   |   \_ qmail-send
     1294 ?        S      0:00  |   |       \_ qmail-lspawn ./Maildir/
     1295 ?        S      0:00  |   |       \_ qmail-rspawn
     1296 ?        S      0:00  |   |       \_ qmail-clean
     1283 ?        S      0:00  |   \_ supervise log
     1289 ?        S      0:00  |   |   \_ /usr/local/bin/multilog t s10000000 n30 /var/log/qmail/send
     1284 ?        S      0:00  |   \_ supervise qmail-smtpd
     1293 ?        S      0:00  |   |   \_ /usr/local/bin/tcpserver -H -l umekawa.info -v -x /home/vpopmail/etc/tcp.smtp.cdb -c 20 -R -u 502 -g 502 0 smtp /usr/l
     1285 ?        S      0:00  |   \_ supervise log
     1290 ?        S      0:00  |   |   \_ /usr/local/bin/multilog t s10000000 n30 /var/log/qmail/smtpd
     1286 ?        S      0:00  |   \_ supervise qmail-pop3d
     1291 ?        S      0:00  |   |   \_ /usr/local/bin/tcpserver -H -l umekawa.info -v -x /home/vpopmail/etc/tcp.pop3.cdb -c 30 -R 0 pop3 /var/qmail/bin/qmail-po
     1287 ?        S      0:00  |   \_ supervise log
     1292 ?        S      0:00  |       \_ /usr/local/bin/multilog t s10000000 n30 /var/log/qmail/pop3d
     1281 ?        S      0:00  \_ readproctitle service errors: ...................................................................................................
    		

  9.   vpopmail のインストール

    POP before SMTP を有効にし、mysql は使わない設定でインストールします。

    解凍して、ディレクトリを移動します
    # tar zxvf vpopmail-5.4.0.tar.gz
    # cd vpopmail-5.4.0

    POP before SMTP を有効にし、認証情報を30分保持し、/home/vpopmail/etc/tcp.smtpで更新するように設定します。
    # ./configure \
    > --enable-roaming-users=y \
    > --enable-relay-clear-minutes=30 \
    > --enable-tcpserver-file=/home/vpopmail/etc/tcp.smtp

    インストールします。
    # make
    # make install-strip

    デフォルトドメインの設定は、
    /home/vpopmail/etc/defaultdomain
    にドメインを記入すれば良いでしょう。(私はやってません。)

    このままでは、POPの認証情報がたまる一方なので、定期的にクリアするようにします。 clearopensmtp を cron に登録します。
    今回は10分ごとにリフレッシュするように設定するため、./configure で行った30分と合わせて最大40分間 認証情報が保持されることになります。
    # crontab -e
    */10 * * * * /home/vpopmail/bin/clearopensmtp 2>&1 > /dev/null

  10.   運用の基本コマンドとメールクライアントの設定

    vpopmail のコマンドは /home/vpopmail/bin 以下にあります。
    コマンドの名称がそのまま機能になっているので、分かりやすいと思います。

    コマンド例(vpopmailでドメインとユーザーを登録)

    ドメインの追加
    # vadddomain umekawa.info パスワード

    メールボックスの作成
    # vadduser hoge@umekawa.info パスワード

    ユーザー情報の確認
    # vuserinfo hoge@umekawa.info

    メールクライアントの設定
    MTUでは下記のように設定します。
    アカウントではドメインまで含めることに注意してください。
    デフォルトドメインのみ、ドメインを付与しなくても受信が可能です。
    -----------------------------------------
    POP3 : umekawa.info
    SMTP : umekawa.info
    アカウント : ume@umekawa.info
    パスワード : メールボックスの作成時に登録したパスワード
    -----------------------------------------


以上で、qmail + vpopmail の設定は終わりです。
このままコマンドでユーザーを管理しても良いのですが、ブラウザから出来た方が何かと楽なので、vqadmin をインストールすることにしました。
インストール方法は別途まとめるようにします。

qmailadmin もありますが ezmlm が必須のため、メーリングリストは fml にしようと思っている私は断念しました。