qmail-vida

qmail は、djb 氏が作成された堅牢でシンプルなメールサーバーです。qmail-vida はSMTP-AUTH を実現する拡張機能です。
更新日 2016-02-13

qmail セットアップ

ダウンロードとインストール

daemontoolsを使いますのでインストールを先にやっておいてください。
qmail とcheckpassword とucspi-tcp とqmail-vida のソ−スとパッチを準備します。
cd /package
wget "http://cr.yp.to/software/qmail-1.03.tar.gz"
wget "http://osdn.dl.sourceforge.jp/qmail-vida/2100/qmail-vida-0.53.tar.gz"
wget "http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz"

// wget "http://cyberam.dip.jp/linux_server/mail/qmail-date-localtime.patch"
//wget "http://www.ckdhr.com/ckd/qmail-103.patch"
//wget "http://www.qmail.org/qmail-smtpd-relay-reject"
//wget "http://www.suspectclass.com/~sgifford/qmail/qmail-0.0.0.0.patch"
//wget "http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.errno.patch"
//wget "http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.qmail_local.patch"

//wget "http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/checkpassword-0.90.errno.patch"

//wget "http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch"
//wget "http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.a_record.patch"
//wget "http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.nobase.patch"

tar zxvf qmail-1.03.tar.gz
tar zxvf qmail-vida-0.53.tar.gz
tar zxvf checkpassword-0.90.tar.gz
tar zxvf ucspi-tcp-0.88.tar.gz

mkdir /var/qmail

groupadd nofiles
useradd -g nofiles -d /var/qmail/alias -s /bin/true alias
useradd -g nofiles -d /var/qmail -s /bin/true qmaild
useradd -g nofiles -d /var/qmail -s /bin/true qmaill
useradd -g nofiles -d /var/qmail -s /bin/true qmailp

groupadd qmail
useradd -g qmail -d /var/qmail -s /bin/true qmailq
useradd -g qmail -d /var/qmail -s /bin/true qmailr
useradd -g qmail -d /var/qmail -s /bin/true qmails

groupadd vida
useradd -g vida -d /home/pop -s /bin/bash pop
useradd -g vida -d /var/qmail/authdb -s /bin/true authdb
useradd -g vida -d /var/qmail/users -s /bin/true qmailu


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


//cd ../checkpassword-0.90
//patch -s -p1 < ../checkpassword-0.90.errno.patch

//cd ../ucspi-tcp-0.88
//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

cd /package/qmail-vida-0.53
make patch
make copy

cd /package/qmail-1.03
echo gcc -O2 -include /usr/include/errno.h > conf-cc
make
make setup check

cd /package/checkpassword-0.90
echo gcc -O2 -include /usr/include/errno.h > conf-cc
make
make setup check

cd /package/qmail-vida-0.53/src/vida
echo gcc -O2 -include /usr/include/errno.h > conf-cc
make
make setup check

初期化

cd /package/qmail-1.03
./config-fast mail.???.comcd /var/qmail/alias
echo "test@qt-space.com" > .qmail-postmaster
echo "test@qt-space.com" > .qmail-mailer-daemon
echo "test@qt-space.com" > .qmail-root
chmod 644 .qmail-postmaster .qmail-mailer-daemon .qmail-root

// メールを転送したい場合
echo "" > .qmail-other
chmod 644 .qmail-other

// sendmail をqmail で置き換える
// 既存のsendmail やpostfix は停止させる事
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail


cd /var/qmail/control
vi rcpthosts
 ???.com		// メールを受け取りを許可するドメイン hoge@????.com
				// このドメイン以外は受け取らない(つまり中継しない)

vi locals
 ???.com		// メールを受け取りを許可するドメイン hoge@????.com

パスワードデータベースの初期化

最初の一回やっておきます。root 権限です。
/var/qmail/bin/vida-pwdbinit

起動スクリプトの準備

DJB 氏のdeamontools を使って永続的な起動を促します。

tcpserver のアクセス制御ハッシュ値を設定

RELAYCLIENT を設定すると、rcpthosts に書いたドメイン以外のメール、つまり他者向けの メールも受け付けてくれます。SMTP から見るとこれは中継(外部送信)です。第三者から踏み台に されない為のqmail ですが、それでは自分からも送信できない。
今回はローカルドメインからのメール送信は許可したいので以下の設定を行います。
vi /etc/tcp.smtp
 192.168.:allow,RELAYCLIENT=""
 127.:allow,RELAYCLIENT=""
 :allow

/usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
またPOP3 にもパスワード認証を使っていても、ローカルからの場合はそれがなくても良いとしたい場合 同じくRELAYCLIENTを設定します。
// LAN 内からは認証無くても可
vi /etc/tcp.pop3
 192.168.:allow,RELAYCLIENT=""
 127.:allow,RELAYCLIENT=""
 :allow

// バイナリデータベースに更新
/usr/local/bin/tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp < /etc/tcp.pop3

qmail 起動スクリプトを作成

supervise/qmail というフォルダを作って、そこに起動スクリプトを書いたrun ファイルを作成します。 /service 以下にこのフォルダのリンクを張ると起動対象となります。
mkdir /var/qmail/supervise

mkdir -p /var/qmail/supervise/qmail

vi /var/qmail/supervise/qmail/run

 #!/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 ./Maildir/


chmod 755 /var/qmail/supervise/qmail/run
// ログを取る
mkdir -p /var/qmail/supervise/qmail/log
mkdir /var/qmail/supervise/qmail/log/main

vi /var/qmail/supervise/qmail/log/run

 #!/bin/sh

 exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin:/usr/bin: \
 /usr/local/sbin:/usr/local/bin" \
 setuidgid qmails multilog t ./main


chmod 755 /var/qmail/supervise/qmail/log/run
chown -R qmails:qmail /var/qmail/supervise/qmail/log
// リンクを張るとさっそく起動します。
ln -s /var/qmail/supervise/qmail /service/qmail

// 起動時間が2秒以上なら成功!
svstat /service/qmail

smtpd 起動スクリプトを作成

supervise/smtpd というフォルダを作って、そこに起動スクリプトを書いたrun ファイルを作成します。 /service 以下にこのフォルダのリンクを張ると起動対象となります。
mkdir -p /var/qmail/supervise/smtpd

vi /var/qmail/supervise/smtpd/run

 #!/bin/sh
 # smtpd/run

 exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin: \
 /usr/bin:/usr/local/sbin:/usr/local/bin" \
 envdir ./env tcpserver -v -x /etc/tcp.smtp.cdb -R -H -l0 \
 -u qmaild -g nofiles 0 smtp \
 qmail-smtpup FQDN /var/qmail/bin/checkpassword \
 qmail-smtpd 2>&1

chmod 755 /var/qmail/supervise/smtpd/run

// 平文認証の為の環境変数を設定
mkdir /var/qmail/supervise/smtpd/env
echo "" > /var/qmail/supervise/smtpd/env/ALLOWPLAIN
// ログの設定
mkdir -p /var/qmail/supervise/smtpd/log
mkdir /var/qmail/supervise/smtpd/log/main
chown -R qmails:qmail /var/qmail/supervise/smtpd/log

vi /var/qmail/supervise/smtpd/log/run

 #!/bin/sh

 exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin:/usr/bin: \
 /usr/local/sbin:/usr/local/bin" \
 setuidgid qmails multilog t ./main

chmod 755 /var/qmail/supervise/smtpd/log/run
// リンクを張るとさっそく起動します。
ln -s /var/qmail/supervise/smtpd /service/smtpd

// 起動時間が2秒以上なら成功!
svstat /service/smtpd

pop3d 起動スクリプトを作成

supervise/pop3d というフォルダを作って、そこに起動スクリプトを書いたrun ファイルを作成します。 /service 以下にこのフォルダのリンクを張ると起動対象となります。
mkdir -p /var/qmail/supervise/pop3d

vi /var/qmail/supervise/pop3d/run

 #!/bin/sh
 # pop3d/run

 exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin: \
 /usr/bin:/usr/local/sbin:/usr/local/bin" \
 envdir ./env tcpserver -v -x /etc/tcp.pop3.cdb -R -H -l0 0 pop3 \
 qmail-popup FQDN /var/qmail/bin/checkpassword \
 qmail-pop3d Maildir 2>&1

chmod 755 /var/qmail/supervise/pop3d/run

// 平文認証の為の環境変数を設定
// 環境変数は設定ファイルよりも優先される。
mkdir /var/qmail/supervise/pop3d/env
echo "" > /var/qmail/supervise/pop3d/env/ALLOWPLAIN
// ログを取る
mkdir -p /var/qmail/supervise/pop3d/log
mkdir /var/qmail/supervise/pop3d/log/main
chown -R qmails:qmail /var/qmail/supervise/pop3d/log

vi /var/qmail/supervise/pop3d/log/run

 #!/bin/sh

 exec env - PATH="/var/qmail/bin:/sbin:/bin:/usr/sbin:/usr/bin: \
 /usr/local/sbin:/usr/local/bin" \
 setuidgid qmails multilog t ./main

chmod 755 /var/qmail/supervise/pop3d/log/run
// リンクを張るとさっそく起動します。
ln -s /var/qmail/supervise/pop3d /service/pop3d

// 起動時間が2秒以上なら成功!
svstat /service/pop3d

メールユーザーの追加(通常)

ユーザーといってもlinux にそれが無くても構いません。あくまでqmail に登録するユーザーです。

ドメイン管理用ユーザーの追加

最初に必ず準備します。通常はpopです。このpop ユーザーのホームフォルダの下に、今後このドメインに属するユーザーの フォルダを作り管理してゆきます。なおpop は最初のインストールの段階で作成していますので、ここで再度作る必要はありません。

仮想ドメインの場合

仮想ドメイン毎に別のユーザ(vpop 等)を作り、そのユーザ環境からvida-passwd 等を呼びます。またcontrol 下にvirtualdomains ファイルを 作り、仮想ドメインとユーザの対応を記載しておきます。
useradd -g vida -d /home/vpop -s /bin/bash vpop

vi /var/qmail/control/virtualdomains
 other-domain.com:/vpop
// virtual domain の場合。
/var/qmail/bin/vida-pwdbinit vpop

メールアカウントの追加

作りたいアカウントの属するドメインを管理するユーザー(この場合pop)になってから、追加コマンドを使う。
su - pop
// メールアカウント の追加
/var/qmail/bin/vida-passwd -a -u USERNAME
/var/qmail/bin/vida-assign -a -u USERNAME
/var/qmail/bin/vida-maildirmake USERNAME Maildir

メールアカウントの削除

作りたいアカウントの属するドメインを管理するユーザー(この場合pop)になってから、削除コマンドを使う。
su - pop
// メールアカウント の削除
/var/qmail/bin/vida-passwd -d -u USERNAME
/var/qmail/bin/vida-assign -d -u USERNAME

メールアカウント管理用スクリプト

ドメインに対応するユーザ(pop 等)になってから呼び出します。
#!/usr/bin/perl

if ($ARGV[0] = '-a' and $#ARGV >= 2)
{
        $ret = `/var/qmail/bin/vida-passwd -a -u $ARGV[1] -p $ARGV[2]`;
        $ret = `/var/qmail/bin/vida-assign -a -u $ARGV[1]`;
        $ret = `/var/qmail/bin/vida-maildirmake $ARGV[1] Maildir`;
        $ret = `/var/qmail/bin/pwdbmake`;
}
elsif ($ARGV[0] = '-d' and $#ARGV >= 1)
{
        $ret = `/var/qmail/bin/vida-passwd -d -u $ARGV[1]`;
        $ret = `/var/qmail/bin/vida-assign -d -u $ARGV[1]`;
        $ret = `/var/qmail/bin/pwdbmake`;
}

セカンダリサーバを立てる

メールサーバーを複数運用すれば冗長性を高められます。セカンダリサーバーに届いたメールはプライマリサーバーに転送される為、メールのPOP 受信は常にプライマリサーバに対してのみとなります。 まずはプライマリサーバと同じように設定しておきます。

smtproutes を編集する

セカンダリサーバにおいて受信したいメールドメインと転送先のアドレスを記述します。複数のメールドメインを持っている場合は改行して書き足します。
vi /var/qmail/control/smtproutes
 qt-space.com:mail.qt-space.com
locals とvirtualdomains の設定はsmtproutes より優先して処理されるので、今回のようにセカンダリとしてのみ使う場合は不要という事で削除しておきます。
cd /var/qmail/control
mv locals .locals
mv virtualdomains .virtualdomains

メール転送の待ち時間を設定する

プライマリサーバへの転送に失敗し続けてもデフォルトで7日間まで保持されます。通常そこまでプライマリがダウンするとは考えられませんが、一応設定ファイルに秒数で指定する事もできます。
vi /var/qmail/control/queuelifetime

 2678400
60 x 60 x 24 x 31 = 2678400 (秒)

再起動して完了

再起動すれば完了です。セカンダリサーバーを使ってメール送信をしようとすると、外部ドメインの時は失敗します。セカンダリサーバーの問題ではなく、 それがプライマリサーバーに転送される事が問題のようです。
従ってセカンダリサーバーで外部宛てのメールを出す事は出来ません。

メール送受信に異常に時間がかかる。

これはtcpserver のIDENT 認証に関する問題です。接続を受け付ける際に 自分自身や相手を逆引きするらしく、この認証を諦めるのに26 秒ほどのウェイトがあるようです。 解決法としてはpop3d やsmtpd の起動スクリプトに -l0 や-H といったオプションをつけて 逆引きをさせないように指示します。もしくはtcpserver -t 5 のようにタイムアウト秒数を 縮める方法があります。

特定のドメインのメールを弾く

badmaildomain というファイルを作成します。
vi /var/qmail/control/badmaildomain

 xxxx.com