[俺日記]

qmail on Mac OS X(not Mac OS X Server) 9回目改/qmailをインストールする。 / 2003-07-22 (火)

qmailのインストール書き直しー。

事前に書いておきますが、ここに書かれている内容については無保証ですので、「動かねー」「SPAMの踏み台にされた」などなどの苦情は受け付けませんのでそこんとこよろしく。なお、「ここ間違ってるぞ」「こんな設定させんなゴルァ!」などのツッコミは大歓迎ですので是非是非ツッコんでやって下さい。よろしくお願いします。

んではいくかぁ。

当初、qmailのOS X用パッケージを使う、と最初書きましたが、qmailのオリジナルのソースにパッチを当ててビルドしようと思います。おそらくこっちのほうが簡単。

今回出来るようにするのは以下の項目です。

・メールの保存形式はMaildir
・APOPでの認証
・POPでの認証
・メールの送信
・メールの受信

以下のものは今回やりません。

#つか俺がまだやってないので出来ない:-)

・virtual user
・virtual domain
・POP before SMTP
・IMAP4対応
・SSL対応

んじゃまずダウンロードから。一般ユーザでOKです。適当なディレクトリを作ってその中で作業しましょう。

% mkdir -p ~/Desktop/qmail_tmp
% cd ~/Desktop/qmail_tmp

qmail本体。必須←あたりまえだ

% curl -O http://cr.yp.to/software/qmail-1.03.tar.gz

展開します。

% tar zxvf qmail-1.03.tar.gz

APOP認証を使うので、SourceForgeで配布しているcheckpwを使います。いろんなミラーがある(*)んですが、今回はflowサーバ(オーストラリア)から落として展開しておきます。

% curl -O http://flow.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
% tar zxvf checkpw-1.00.tar.gz

次にテスト( http://www.rbl.jp/svcheck.php )に合格するため:-)のパッチ。実は入れなくてもいいんだけど。
SMTPセッションで、ローカルパートに!やら@やら%やらあるやつをリレーしているように見えるのを、拒否するパッチ(らしい)。qmailでは、宛先の@以降が/var/qmail/control/rcpthostsに書いてあるドメインである場合、とりあえず受け取ります。@の左側はチェックしないんですね。受け取ったあと@の左側をチェックするのは別のプログラムが行い、そこでエラーになれば返送されるわけです。受け取ってリレーするように見えても実はちゃんとエラーを返すので、特に問題無いんですけど、気持ち悪いと思う人は入れましょう、くらいのパッチです。2chのUNIX板qmailスレ( http://pc.2ch.net/test/read.cgi/unix/1044498957/82-115n あたり)を見ると俺より詳しい人:-)が解説してます。

% curl -O http://www.qmail.org/qmail-smtpd-relay-reject

日付をタイムゾーンに従ったものにするパッチ。これも入れなくても問題ないけど、これは入れといたほうが......見にくいし。

% curl -O ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch

Mac OS Xでmakeできるようにするパッチ。SENDMAILとINSTALLの上書き対策とかconf-ldのパッチとか。必須。

% curl -O http://gururi.com/qmail/qmail-MacOSX.patch

ディレクトリを移動します。

% cd qmail-1.03

パッチを当てます。

% cat ../qmail-smtpd-relay-reject | patch -d.
% cat ../qmail-date-localtime.patch | patch -d.
% cat ../checkpw-1.00/qmail-popup-auth.patch | patch -d.
% cat ../qmail-MacOSX.patch | patch -d.

インストール先ディレクトリを作成します。

% sudo mkdir -p /var/qmail

グループを作成します。

% sudo niload group . <<END
nofiles:*:81:
qmail:*:82:
END

ユーザを作成します。アカウントPreferencePaneに出したくないのでuidを100未満で作ります。今回はデフォルトで存在するアカウントのuidと被らないように80番台を使います。

% sudo niload passwd . <<END
alias:*:81:81:qmail user:/var/qmail/alias:/bin/true
qmaild:*:82:81:qmail user:/var/qmail:/bin/true
qmaill:*:83:81:qmail user:/var/qmail:/bin/true
qmailp:*:84:81:qmail user:/var/qmail:/bin/true
qmailq:*:85:82:qmail user:/var/qmail:/bin/true
qmailr:*:86:82:qmail user:/var/qmail:/bin/true
qmails:*:87:82:qmail user:/var/qmail:/bin/true
END

makeします。make installではなくmake setup checkです。

% sudo make setup check

これでインストールは終わっているはず。
次にcheckpwをmakeします。

% cd ../checkpw-1.00

INSTALLを退避。面倒なのでパッチはなし。

% mv INSTALL INSTALL.txt

make。

% make prog

selectcheckpwが変なので直しておく。具体的には//binになってるところを/binに直してます。

% /usr/bin/perl -i -pe's|//|/|g;' ./selectcheckpw

インストールします。

% sudo make setup check

インストールははこれでおしまい(たぶん)。次は設定です。

今回サーバの名前はserver.dyndns.example.jpでやってますが、これはローカル向けの名前なので、dyndns.example.jpで設定を行います。

% cd ../qmail-1.03
% sudo config-fast dyndns.example.jp

以上(笑)。

次にユーザを作ります。

% sudo $SHELL
# cd ~alias
# echo '&'${SUDO_USER} > .qmail-mailer-daemon
# echo '&'${SUDO_USER} > .qmail-postmaster
# echo '&'${SUDO_USER} > .qmail-root

最低限この三つは作りましょう。なお、.qmail-hogehogeという名前でファイルを作り、中身を
&example@example.com
にしておくとhogehoge@dyndns.example.jp宛にメールを送るとexample@example.comに転送されます。転送メールアドレスだけだったらこれだけでいくらでも作れるわけです。

んで、次。Maildir形式でやりますので各ユーザのホームディレクトリにMaildirを作ります。

# for i in `nidump passwd .|perl -ne'@u=split(/:/);print "$u[0] " if ($u[1] ne "*");'`
sudo -u $i /var/qmail/bin/maildirmake ~$i/Maildir && sudo -u $i echo ~$i/Maildir/ > ./$i/.qmail && /Developer/Tools/SetFile -a V ~$i/Maildir

複雑に見えますが、nidumpでユーザのリストを取得して、パスワードフィールドが*ではないユーザのユーザ名を取得して、それぞれについて処理しています。やっているのは以下の処理。

・各ユーザの権限で/var/qmail/bin/maildirmakeを実行し、~user/Maildirを作成
・~user/.qmailにMaildirの場所を書き込み
・Developer ToolsのSetFileコマンドでMaildirを不可視に

Maildirを不可視にしておくとユーザが誤って消してしまうと行った事故を防げますのでおいらはこれ推奨。

さて、これで大体の準備が出来ましたので、qmailを稼働させてみましょう。qmailもtinydns同様daemontools支配下で動かします。/service以下にサービスのシンボリックリンクを置くわけですが、今回の例ではそのオリジナルは/var/qmail/svcに置くことにします。

# mkdir -p /var/qmail/svc
# cd /var/qmail/svc

まずqmail-startの起動スクリプトを作ります。

# mkdir qmail
# cat <<END > qmail/run
#! /bin/sh
echo 'Starting qmail...'
exec 2>&1
exec env - PATH="/var/qmail/bin:?$PATH" qmail-start ./Maildir/
END
# chmod 755 qmail/run
# chown root.qmail qmail/run
# mkdir -p qmail/log/main
# cat <<END > qmail/log/run
#!/bin/sh
exec env - PATH="?$PATH" setuidgid qmaill multilog t s1000000 ./main
END
# chmod 755 qmail/log/run
# chown -R qmaill.qmail qmail/log
# chmod +t qmail qmail/log

daemontoolsのサービスに登録します。

# ln -s /var/qmail/svc/qmail /service

起動を確認します。

# svstat /service/qmail
/service/qmail: up (pid 3313) 15 seconds

0または1 secondでうろうろしてpidがどんどん増加する時は起動に失敗しています。起動に成功したらローカル配送のテストをしてみましょう。

# /var/qmail/bin/qmail-inject <<END
To: ${SUDO_USER}
Subject: local mail test

local mail test
END

# cat ${SUDO_USER}/Maildir/new/*
Return-Path: <root@example.dyndns.jp>
Delivered-To: gururi@example.dyndns.jp
Received: (qmail 2764 invoked by uid 0); 16 Jul 2003 11:12:49 +0900
Date: 16 Jul 2003 11:12:49 +0900
Message-ID: <20030716021249.2763.qmail@example.dyndns.jp>
From: root@example.dyndns.jp
To: gururi@example.dyndns.jp
Subject: local mail test

local mail test

Message-IDの数字とかユーザ名は環境によって変わるので、違うからと言って騒がないように。

ここまで出来たら次はsmtpサーバの設定をします。

# cd /var/qmail/svc
# mkdir -p smtp/log/main
# cat <<END > smtp/run
#!/bin/sh
echo 'Starting qmail-smtpd...'
exec 2>&1
exec env - PATH="/var/qmail/bin:?$PATH" envuidgid qmaild softlimit -d250000 tcpserver -vRH -c40 -U -x smtp.cdb 0 25 qmail-smtpd
END
# cat <<END > smtp/smtp
127.0.0.1:allow,RELAYCLIENT=""
10.0.1.100-105:allow,RELAYCLIENT=""
all:allow
END
# cat <<END > smtp/Makefile
TCPRL=/usr/local/bin/tcprules

all: smtp.cdb

smtp.cdb: smtp
        ?${TCPRL} ?$@ smtp.tmp < smtp
END
# cat <<END > smtp/log/run
#!/bin/sh
exec env - PATH="?$PATH" setuidgid qmaill multilog t ./main
END
# chmod 755 smtp/log/run smtp/run
# chown root.qmail smtp/run smtp/Makefile smtp/smtp
# chmod +t smtp smtp/log
# cd smtp
# chown -R qmaill.qmail log
# make

smtpの制限はtcpserverで行います。/var/qmail/svc/smtp/smtp.cdbファイルがその設定ファイルで、そのもとになるテキストファイルが/var/qmail/svc/smtp/smtpです。Makefileを作っておくと/var/qmail/svc/smtp/smtpを編集したあと/var/qmail/svc/smtpでmakeを実行するだけで/var/qmail/svc/smtp/smtp.cdbが更新されます。まぁあんまり編集しないという話もありますが。
で、/serviceに登録します。

# ln -s /var/qmail/svc/smtp /service
# svstat /service/smtp
/service/smtp: up (pid 4808) 32 seconds

0または1 secondでうろ(略)

んで最後にPOPサーバの設定をします。まずパスワードの登録をします。パスワードは~/Maildir/.passwordに書き込んでおきます。

# exit
% vi ~/Maildir/.password

viの簡単な使い方。

・起動時は文字入力出来ません。hjklで左・下・上・右にカーソルが移動します。
・iとタイプするとカーソル位置から文字を入力出来ます。
・aとタイプするとカーソル位置の次から文字を入力出来ます。
・escキーで移動するモードに戻ります。
・移動モードでZZとタイプすると保存して終了します。

つまり、
・viを起動
・i(必ず小文字)を入力する
・パスワードを入力
・escキーを押す
・ZZ(両方とも大文字)とタイプして保存・終了

という流れになります。なお、パスワードを変更する時はddで入力してあるパスワードを消すか、rm ~/Maildir/.passwordでファイル自体を消してから作業して下さい。

パスワードファイルを作ったら、自分以外は読み書き出来ないようにパーミッションを変更します。他の人が読める状態だと動きません。

% chmod 600 ~/Maildir/.password

再びroot権限でshellを動かします。

% sudo ${SHELL}
# cd /var/qmail/svc
# mkdir -p pop/log/main
# cat <<END > pop/run
#!/bin/sh
exec 2>&1
exec env - PATH="/var/qmail/bin:?$PATH" tcpserver -x pop.cdb -vRH 0 110 qmail-popup `cat /var/qmail/control/me` /bin/selectcheckpw qmail-pop3d Maildir
END
# cat <<END > pop/pop
all:allow
END
# cat <<END > pop/Makefile
TCPRL=/usr/local/bin/tcprules
all: pop.cdb
pop.cdb: pop
        ?${TCPRL} ?$@ pop.tmp < pop
END
# cat <<END > pop/log/run
#!/bin/sh
exec env - PATH="?$PATH" setuidgid qmaill multilog t s1000000 ./main
END
# chmod 755 pop/log/run pop/run
# chown root.qmail pop/run pop/Makefile pop/pop
# chmod +t pop pop/log
# cd pop
# chown -R qmaill.qmail log
# make

popは普通どこからでもアクセス出来るようにすると思いますが、変な所からアタック受けた時、すぐに制限出来るようにルールファイルを作っておきます。拒否したいIPアドレス:denyという行をall:allowより前に書いておくと、そのIPアドレスからのPOP接続を拒否出来ます。接続制限をしない場合は、pop/runの-x pop.cdbを削って下さい。

さて、popもdaemontoolsのサービスに登録します。

# ln -s /var/qmail/svc/pop /service

qmail,smtp同様、起動しているかどうか確認します。

# svstat /service/pop
/service/pop: up (pid 5715) 17 seconds

さて、それではネットワークとメールクライアントの設定を変更してみましょう。
10.0.0.201=client1.dyndns.example.jpの設定を変更するものとして進めます。

まずはシステム環境設定→ネットワーク。
DNSキャッシュサーバ=10.0.0.100=dnscache.dyndns.example.jp
としましたので、DNSサーバの欄を10.0.0.100と書き換えます。検索するドメインの欄にdyndns.example.jp とlocal(10.2以降)を加えます。他に変更する部分は無いので、今すぐ適用ボタンを押します。

smtpサーバにはserver.dyndns.example.jp、dyndns.example.jpまたは10.0.0.101と入力します。
popサーバにもserver.dyndns.example.jp、dyndns.example.jpまたは10.0.0.101と入力します。popユーザ名はサーバにあるあるアカウントと同じものを、パスワードはpopのところで入力したパスワードを入れます。

設定はこれで終わりです。なお、ルータの25番と110番をserver.dyndns.example.jpに向けておかないとメールが届きませんので自分のルータの説明書をよく読んで設定しましょう。

(*)
http://aleron.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://belnet.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://cesnet.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://easynews.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://flow.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://heanet.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://switch.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://twtelecom.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://umn.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz
http://unc.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.00.tar.gz