Qmail Tips

Menu

qmail, SMTP認証, qmailanalog, アンチウィルス, アンチスパム,

qmail

daemontoolsをインストールしたので、起動をdjb-supervisor系に、ログ収集をsyslogからmultilogに変更する。

まず /etc/rc.d/init.d/qmail の起動スクリプトを元にして、/etc/ 配下に新しくqmail,qmail-smtpd,qmail-pop3dとデーモン個々に起動環境を作成、最後に /service からそれぞれシンボリックを生成すればsvscanによりrunスクリプトが起動される。

またログも /var/log/qmail*/ 配下にそれぞれ別れる。

サービス起動

$ sudo ln -s /etc/qmail /service
$ sudo ln -s /etc/qmail-smtpd /service
$ sudo ln -s /etc/qmail-pop3d /service

サービス停止

$ sudo svc -dx /service/qmail /service/qmail-pop3d /service/qmail-smtpd
$ sudo svc -dx /service/qmail/log /service/qmail-pop3d/log /service/qmail-smtpd/log
$ for pid in `ps -ef | grep qmails | awk '! /grep/{print $2}'`; do sudo kill -9 $pid; done
$ sudo rm -f /service/qmail /service/qmail-pop3d /service/qmail-smtpd
参照
qmailhttp://www.qmail.jp/
qmailsolutions.comhttp://qmailsolutions.com/
実用qmailサーバ運用・管理術http://www.atmarkit.co.jp/flinux/index/indexfiles/qmailindex.html
daemontoolshttp://www.emaillab.org/djb/daemontools/
relay-ctrlhttp://untroubled.org/relay-ctrl/

SMTP認証

qmail-vida-0.53SMTP認証(SMTP-Auth)を導入する。qmail-vidaにはAPOP機能も含んでいるのでqmapopのpatchを当てたものではなくqmail-1.03のオリジナルから適用する事。あとReceived:のtimestampをlocal timeにするpatchと、DNSバッファを大きくするpatchも当てといた方が良いと思う。2002/11/21

build

基本はhttp://www.emaillab.org/djb/qmail-vida/doc/install.html

まずは各パッケージの展開

[yano@nx9030 software]$ tar zxvf ~/archives/ucspi-tcp-0.88.tar.gz
[yano@nx9030 software]$ tar zxvf ~/archives/qmail-1.03.tar.gz
[yano@nx9030 software]$ tar zxvf ~/archives/checkpassword-0.90.tar.gz
[yano@nx9030 software]$ tar zxvf ~/archives/qmail-vida-0.53.tar.gz

localtimeやdnsなqmailパッチの適用。

[yano@nx9030 software]$ cd qmail-1.03
[yano@nx9030 qmail-1.03]$ patch -p1 < ~/archives/qmail-date-localtime.patch
[yano@nx9030 qmail-1.03]$ patch -p1 < ~/archives/qmail-large-dns.patch

glibcのバージョンが2.3.1以降の場合は errno のリンクエラーが発生するので"extern int errno;"を"#include <errno.h>"に変更する必要がある。以下のパッチを適用するのが吉。
qmail のパッチhttp://www.emaillab.org/djb/qmail-patch/patch.html
glibcのバージョンが2.3.1以降の場合http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/
qmail-1.03.errno.patchhttp://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.errno.patch
qmail-1.03.qmail_local.patchhttp://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.qmail_local.patch
checkpassword-0.90.errno.patchhttp://qmail.org/moni.csi.hu/pub/glibc-2.3.1/checkpassword-0.90.errno.patch
ucspi-tcp-0.88.errno.patchhttp://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch

[yano@nx9030 qmail-1.03]$ patch -p1 < ~/archives/djb_glibc2.3/qmail-1.03.qmail_local.patch
[yano@nx9030 qmail-1.03]$ patch -p1 < ~/archives/djb_glibc2.3/qmail-1.03.errno.patch
[yano@nx9030 qmail-1.03]$ cd ../ucspi-tcp-0.88
[yano@nx9030 ucspi-tcp-0.88]$ patch -p1 < ~/archives/djb_glibc2.3/ucspi-tcp-0.88.errno.patch
[yano@nx9030 ucspi-tcp-0.88]$ cd ../checkpassword-0.90
[yano@nx9030 checkpassword-0.90]$ patch -p1 < ~/archives/djb_glibc2.3/checkpassword-0.90.errno.patch
[yano@nx9030 checkpassword-0.90]$ cd ../qmail-vida-0.53/src/vida
[yano@nx9030 vida]$ patch -p1 < ~/archives/djb_glibc2.3/qmail-vida-0.53.errno.patch
qmail-vidaはパッチが見当たらなかったので手直しして、patchをqmail-vida-0.53.errno.patchとして保存。
[yano@nx9030 vida]$ diff --unified=3 error.h.orig error.h
--- error.h.orig        2004-12-27 14:35:04.044439920 +0900
+++ error.h     2004-12-27 15:13:19.141532128 +0900
@@ -1,7 +1,7 @@
#ifndef ERROR_H
#define ERROR_H

-extern int errno;
+#include <errno.h>

extern int error_intr;
extern int error_nomem;

肝心要、vidaパッチの適用はあっさり。

[yano@nx9030 qmail-vida-0.53]$ make patch
[yano@nx9030 qmail-vida-0.53]$ make copy

メールドメインのオーナーアカウント pop を変更する場合は、このタイミングで qmail-vida-0.53/src/vida/conf-realdomainownercheckpassword-0.90/conf-realdomainowner を変更する。

ちゅうわけで pop を "domowner" に変更した後、やっとビルド。

[yano@nx9030 qmail-vida-0.53]$ cd ../qmail-1.03
[yano@nx9030 qmail-1.03]$ make; sudo make setup check;
[yano@nx9030 qmail-1.03]$ cd ../checkpassword-0.90
[yano@nx9030 checkpassword-0.90]$ make; sudo make setup check;
[yano@nx9030 checkpassword-0.90]$ cd ../qmail-vida-0.53/
[yano@nx9030 qmail-vida-0.53/]$ cd src/vida
[yano@nx9030 vida]$ make; sudo make setup check;
[yano@nx9030 vida]$ cd ../../
[yano@nx9030 qmail-vida-0.53/]$ sudo make install-doc

デーモン用アカウントの作成

[yano@nx9030 software]# mkdir /var/qmail
[yano@nx9030 software]# /usr/sbin/groupadd nofiles
[yano@nx9030 software]# /usr/sbin/useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
[yano@nx9030 software]# /usr/sbin/useradd -g nofiles -d /var/qmail -s /bin/false qmaild
[yano@nx9030 software]# /usr/sbin/useradd -g nofiles -d /var/qmail -s /bin/false qmaill
[yano@nx9030 software]# /usr/sbin/useradd -g nofiles -d /var/qmail -s /bin/false qmailp
[yano@nx9030 software]# /usr/sbin/groupadd qmail
[yano@nx9030 software]# /usr/sbin/useradd -g qmail -d /var/qmail -s /bin/false qmailq
[yano@nx9030 software]# /usr/sbin/useradd -g qmail -d /var/qmail -s /bin/false qmailr
[yano@nx9030 software]# /usr/sbin/useradd -g qmail -d /var/qmail -s /bin/false qmails
[yano@nx9030 software]# /usr/sbin/groupadd vida
[yano@nx9030 software]# /usr/sbin/useradd -g vida -d /var/qmail -s /bin/false qmailu
[yano@nx9030 software]# /usr/sbin/useradd -g vida -d /var/qmail -s /bin/false authdb
[yano@nx9030 software]# /usr/sbin/useradd -g vida -d /home/domowner -s /bin/bash domowner

relay-ctrl

POP before SMTPをサポートする為、relay-ctrlを導入する。

Fedora Core 3の man は/usr/local/manでなく/usr/share/manのようなので conf-man の先頭行を以下のように
/usr/share/man

Man pages will be installed in subdirectories of this directory. An
unformatted man page foo.1 will go into .../man1/foo.1.
修正してから
[yano@nx9030 relay-ctrl-3.1.1]$ make
[yano@nx9030 relay-ctrl-3.1.1]$ sudo ./installer
するなり。
/etc/relay-ctrl
[root@nx9030 relay-ctrl-3.1.1]# mkdir /etc/relay-ctrl/
[root@nx9030 relay-ctrl-3.1.1]# mkdir /var/spool/relay-ctrl; chmod 744 /var/spool/relay-ctrl
[root@nx9030 relay-ctrl-3.1.1]# mkdir /var/spool/relay-ctrl/allow; chmod 777 /var/spool/relay-ctrl/allow
[root@nx9030 relay-ctrl-3.1.1]# echo "/var/spool/relay-ctrl/allow" > /etc/relay-ctrl/RELAY_CTRL_DIR #キャッシュディレクトリ
[root@nx9030 relay-ctrl-3.1.1]# echo "600" > /etc/relay-ctrl/RELAY_CTRL_EXPIRY #有効期限600秒(10分)
/etc/cron.d/relay-ctrl

POP before SMTPの有効期限を毎分チェックするcronスクリプト。動作確認が済んだ後でよい。

#!/bin/sh
/usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age

supervise環境の作成

/etc/qmail-smtpd/env

eth0だけでなくlocalhostからの接続も許すのでIPは指定はゼロにする。

[yano@nx9030 yano]$ su
[root@nx9030 yano]# cd /etc/qmail-smtpd/
[root@nx9030 qmail-smtpd]# echo "0" > env/IP
[root@nx9030 qmail-smtpd]# echo "nx9030.bravotouring.com" > env/HOST
[root@nx9030 qmail-smtpd]# echo "domowner" > env/DOMAINOWNER
[root@nx9030 qmail-smtpd]# ln -s /etc/relay-ctrl/RELAY_CTRL_DIR /etc/qmail-smtpd/env/
[root@nx9030 qmail-smtpd]# ln -s /etc/relay-ctrl/RELAY_CTRL_EXPIRY /etc/qmail-smtpd/env/
/etc/tcpserver/smtp_auth.cdb

tcpserverのルールを作成。
・SMTP-Auth未対応のWebMailerによるlocalhostからのRELAY送信を許可
・ローカルIPからの送信はrblsmtpdによるチェックを省略

[yano@nx9030 tcpserver]$ echo '127.0.0.1:allow,RELAYCLIENT=""' > smtp_auth.rules
[yano@nx9030 tcpserver]$ echo '192.168.:allow,RBLSMTPD="",MFCHECK=""' >> smtp_auth.rules
[yano@nx9030 tcpserver]$ /usr/local/bin/tcprules smtp_auth.cdb smtp_auth.tmp <smtp_auth.rules
[yano@nx9030 tcpserver]$ sudo cp smtp_auth.cdb /etc/tcpserver/
/etc/qmail-smtpd/run

WebMailerによるlocalhostからの接続はも許すのでIPは指定はゼロにする。

#!/bin/sh
#  /service/smtpd/run SMTP-Auth 対応    powerd by qmail-vida
#    -x /etc/tcpserver/smtp_auth.cdbでlocalhostをSMTP-Auth対象外とする
#    Set environment variables IP and HOST.
#    If it is virtual domain, set DOMAINOWNER.
#    If it is necessary, set ALLOWPLAIN, FORCEAUTH and TEMPRELAYCLIENT, too.
#    If it is not necessary, remove 'recordio' line.
#  recordio fixcrio \
PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin:
exec envdir ./env sh -c '
  exec softlimit -d6000000 \
  relay-ctrl-chdir \
  tcpserver -x /etc/tcpserver/smtp_auth.cdb \
            -vhR -l"$HOST" -c40 -- "$IP" smtp \
  rblsmtpd -r relays.ordb.org \
  qmail-smtpup "$HOST" \
  checkpassword \
  relay-ctrl-check \
  qmail-smtpd 2>&1
'
/etc/qmail-pop3d/env
[root@nx9030 qmail-pop3d]# echo "0" > env/IP
[root@nx9030 qmail-pop3d]# echo "nx9030.bravotouring.com" > env/HOST
[root@nx9030 qmail-pop3d]# echo "domowner" > env/DOMAINOWNER
[root@nx9030 qmail-pop3d]# ln -s /etc/relay-ctrl/RELAY_CTRL_DIR /etc/qmail-pop3d/env/
[root@nx9030 qmail-pop3d]# ln -s /etc/relay-ctrl/RELAY_CTRL_EXPIRY /etc/qmail-pop3d/env/
/etc/qmail-pop3d/run

WebMailerによるlocalhostからの接続も許すのでIPは指定はゼロにする。

#!/bin/sh
#  /service/pop3d/run   SMTP-Auth 対応  powerd by qmail-vida
#    Set environment variables IP and HOST.
#    If it is virtual domain, set DOMAINOWNER.
#    If it is necessary, set ALLOWPLAIN, too.
#    If it is not necessay, remove 'recordio' line.
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
exec envdir ./env sh -c '
  exec softlimit -d6000000 \
  relay-ctrl-chdir \
  tcpserver -x /etc/tcpserver/pop3.cdb \
            -vhR -l "$HOST" -c40 -- "$IP" pop3 \
  qmail-popup "$HOST" \
  checkpassword \
  relay-ctrl-allow \
  qmail-pop3d Maildir 2>&1
'

アカウントの設定

まずはrootでvida認証データベースの初期化。

[yano@nx9030 qmail-vida-0.53/]# /var/qmail/bin/vida-pwdbinit

続いて各ユーザーの設定

[yano@nx9030 yano]$ /var/qmail/bin/maildirmake ./Maildir
[yano@nx9030 yano]$ echo '#| /var/qmail/bin/qmail-spamassassin spam@bravotouring.com' > .qmail
[yano@nx9030 yano]$ echo ./Maildir/ >> .qmail ←.qmailがないと/var/qmail/queueに溜まるだけで配送されない(;_;)
[yano@nx9030 yano]$ /var/qmail/bin/vida-passwd -a
Changing password for user yano
New password:********
Retype new password:********
vida-passwd: Password for user yano was changed
pwdbmake: authdb/pwdusers/cdb was updated

仮想アカウントmailの作成

linuxのユーザーアカウントを持たないML受信専用のメールボックスを作る。WebMailerからも読み書き可能。

[yano@nx9030 yano]$ su domowner   # DOMAINOWNERアカウントで操作する
[domowner@nx9030 yano]$ cd
/home/domowner/
[domowner@nx9030 domowner]$ vida-passwd -a -u mail -p ********
[domowner@nx9030 domowner]$ vida-assign -a -u mail
[domowner@nx9030 domowner]$ vida-maildirmake mail Maildir
[domowner@nx9030 domowner]$ echo ./Maildir/ > ~/mail/.qmail ←.qmailがないと/var/qmail/queueに溜まるだけで配送されない(;_;)

忘れちゃならないのが sendmail の置き換え。sendmail を捨てた後、qmail版のsendmailインタフェースを入れておかないと、cronlogwatchのメールが送信されなくなってしまう。

[yano@nx9030 qmail-vida-0.53]$ sudo rpm -e sendmail # RPMパッケージの削除
[yano@nx9030 qmail-vida-0.53]$ cd /usr/sbin
[yano@nx9030 sbin]$ sudo mv sendmail sendmail.orig
[yano@nx9030 sbin]$ sudo ln -s /var/qmail/bin/sendmail .

参照
qmail-vidahttp://qmail-vida.sourceforge.jp/
qmailhttp://www.qmail.jp/
 ・timestampをlocal timeにするpatchftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch
 ・DNSバッファを拡張するpatchftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-large-dns.patch
qmail および qmail-vida のインストールメモhttp://gya.jp/~yk/inst-qmail-vida.html

Trouble Shooting

いろいろ弄ってたら /var/log/qmail/current"deferral: Sorry,_message_has_wrong_owner._(#4.3.5)/" というメッセージが出力され、メールの送受信ができなくなった。原因はつい出来心で"chown qmaill:qmail /var/qmail/bin/qmail-*"とかしてしまった為。

そういう場合はqmail-1.03のmakefileで"make setup check"し、OwnerやPermissionを復旧すれば良い。ちなみにqmail-*で

-rwsr-x---    1 qmailu   vida        12340  1月  7 22:13 qmail-newu*    #←qmail-vidaのツール
-rws--x--x    1 qmailq   qmail       13612  1月  7 22:13 qmail-queue*
の2つ以外はOwnerがroot:qmailだ。またQueuing中のメッセージも"chown -R qmailq:qmail /var/qmail/queue/mess/"でOwnerを変更しておいた方が良い。2004/01/07

qmail-smtpdのパッチ

[Full-Disclosure] Lame crash in qmail-smtpd and memory overwrite according to gdb, yet still qmail much better than windowsで指摘された、SMTPセッションで2GB以上のヘッダーを受信するとoverflowしてしまうバグ修正。2004/01/20

    368   pos = 0; flagmaybex = flagmaybey = flagmaybez = 1;
    369   for (;;) {
    370     substdio_get(&ssin,&ch,1);
    371     if (flaginheader) {
    372       if (pos < 9) {
    373         if (ch != "delivered"[pos]) if (ch != "DELIVERED"[pos]) flagmaybez = 0;
    374         if (flagmaybez) if (pos == 8) ++*hops;
    375         if (pos < 8)
    376           if (ch != "received"[pos]) if (ch != "RECEIVED"[pos]) flagmaybex = 0;
    377         if (flagmaybex) if (pos == 7) ++*hops;
    378         if (pos < 2) if (ch != "\r\n"[pos]) flagmaybey = 0;
    379         if (flagmaybey) if (pos == 1) flaginheader = 0;
    380         ++pos;          /* insert by YANO at 2004/01/20 */
    381       }
    382 /*    ++pos;    * commentout by YANO at 2004/01/20 */
    383       if (ch == '\n') { pos = 0; flagmaybex = flagmaybey = flagmaybez = 1; }
    384     }
    385     switch(state) {
qmail-smtpd.c: 502 lines, 13278 characters
$ sudo make setup check

qmailanalog

build & install

[yano@nx9030 yano]$ tar xvpfz qmailanalog-0.70.tar.gz
[yano@nx9030 yano]$ cd qmailanalog-0.70
[yano@nx9030 qmailanalog-0.70]$ patch < qmailanalog-0.70.errno.patch
[yano@nx9030 qmailanalog-0.70]$ make
[yano@nx9030 qmailanalog-0.70]$ sudo make setup check
[yano@nx9030 qmailanalog-0.70]$ cd
[yano@nx9030 yano]$ tar xvpfz qlogtools-3.1.tar.gz
[yano@nx9030 yano]$ cd qlogtools-3.1
[yano@nx9030 qlogtools-3.1]$ patch < qlogtools-3.1.errno.patch
[yano@nx9030 qlogtools-3.1]$ make
[yano@nx9030 qlogtools-3.1]$ sudo ./installer
[yano@nx9030 qlogtools-3.1]$ cd
[yano@nx9030 yano]$ wget http://www.qcc.sk.ca/%7Echarlesc/software/misc/qlogselect
[yano@nx9030 yano]$ chmod +x qlogselect
[yano@nx9030 yano]$ sudo cp qlogselect /usr/local/qmailanalog/bin
以下、glibc 2.3.1以降のお約束。
qmailanalog-0.70.errno.patch
--- error.h.orig 1998-08-31 06:39:27.000000000 +0900
+++ error.h      2005-01-04 16:01:53.716976752 +0900
@@ -1,7 +1,7 @@
 #ifndef ERROR_H
 #define ERROR_H
 
-extern int errno;
+#include <errno.h>
 
 extern int error_intr;
 extern int error_nomem;
qlogtools-3.1.errno.patch
--- qfilelog.c.orig 2001-06-13 06:41:47.000000000 +0900
+++ qfilelog.c      2005-01-04 16:40:52.397443280 +0900
@@ -4,7 +4,7 @@
 #include <string.h>
 #include <unistd.h>
 
-extern int errno;
+#include <errno.h>
 
 #define PAUSE sleep(60)
/etc/cron.weekly/qmailanalog.cron
#!/bin/sh
MAILTO=logwatcher@bravotouring.com
MAILFROM=qmailanalog@bravotouring.com
export PATH="$PATH:/usr/local/bin:/usr/local/qmailanalog/bin"
tmpdir=/tmp/qmail-cron.$$.$RANDOM

mkdir $tmpdir
pushd $tmpdir >/dev/null

s_year=`date -d '1 week ago' +%Y`
s_month=`date -d '1 week ago' +%m`
s_day=`date -d '1 week ago' +%d`
e_year=`date +%Y`
e_month=`date +%m`
e_day=`date +%d`
x_year=`date -d '1 day' +%Y`
x_month=`date -d '1 day' +%m`
x_day=`date -d '1 day' +%d`

start="$s_year-$s_month-$s_day"
end="$e_year-$e_month-$e_day"
xday="$x_year-$x_month-$x_day"

LOGDIR=/var/log/qmail

echo -e "\n$start 〜 $end" >result

cat "$LOGDIR"/{"@",cur}* 2>/dev/null \
| tai64n2tai \
| qlogselect start $start end $xday \
| matchup >logfile 5>/dev/null

for ana in zoverall zddist zdeferrals zfailures zrhosts zsuids zrxdelay; do
echo -n "\n-----------Result of $ana------------" >>result
$ana 2>/dev/null <logfile >>result
done
rm -f logfile

(echo "To: $MAILTO"
echo "From: $MAILFROM"
echo "Subject: qmaillog for $e_year-$e_month-$e_day"
echo ""
cat result )| /var/qmail/bin/qmail-inject -f $MAILTO
rm -f result
popd >/dev/null
rm -rf $tmpdir
参照
qmailanaloghttp://www.emaillab.org/djb/qmailanalog/qmailanalog.html
qlogtoolshttp://untroubled.org/qlogtools/
qlogselecthttp://www.qcc.sk.ca/%7Echarlesc/software/misc/

アンチウィルス

Install & Configration

ITXイー・グローバレッジ株式会社が始めた「電子メールの浄化(アンチウィルスとスパムブロック)を行うサービス」が

福祉関係・自然保護等の活動を行っている各種団体やNPOが所有するドメイン、ならびに個人が所有・運用する非営利のドメインについては、有料サービス開始以降も無料でEPOCサービスをご利用頂けます。
という事なので、早速利用の手続きをとって使ってみる事に。そゆわけでtinydnsの設定を変更する。2003/07/10

[root@portage root]# vi data
# SOA/NS/A
.bravotouring.com:210.175.***.***:ns1.bravotouring.com:86400
# SOA/NS
#.bravotouring.com::ns.spanavi.net:86400
.bravotouring.com:210.175.***.***:ns2.bravotouring.com:86400
# MX/A
@bravotouring.com::bunny.e-globaledge.com:10:86400
@bravotouring.com:210.175.***.***:mail.bravotouring.com:20:86400
# A
+bravotouring.com:210.175.***.***:86400
+www.bravotouring.com:210.175.***.***:86400
# TXT
'bravotouring.com:v=spf1 a -all:3600
'bravotouring.com:Powered by djbdns - http\072//cr.yp.to/djbdns.html
[root@portage root]# make
/usr/local/bin/tinydns-data
./tinydns-notify data
Received NOTIFY answer for bravotouring.com from 219.117.???.???
[root@portage root]#
参照
ITXイー・グローバレッジ株式会社http://www.e-globaledge.com/
EPOCから始まる電子メール浄化サービスhttp://epoc.e-globaledge.com/EPOC/

Tipsに戻る | Topに戻る

Copyright (c) 2002-2004 by YANO
All rights reserved.