qmailの設定方法

目次

メールサーバーとして代表的なMTAの1つであるqmailを紹介します。qmailは比較的容易に構築できる仕組みになっています。

qmailの基本設定
controlの基本設定
簡単な運用
qmailの修正
smtpリレーの制限
smtp-auth

courier-imap
vpopmail
controlパラメータの種類

戻る

qmailの基本設定

インストールログで入力したドメイン名は /var/qmail/control の中に記録されてます。従ってドメインを変更する場合はcontrol以下にあるファイルを変更してください。 ただしドメインの逆マッピングができていればインストール後 ./configを実行するだけでcontrol以下のファイルは自動生成されます。

<基本設定>
起動ファイルを作成します。
qmaiの起動ファイルは/var/qmail/rcファイルです。下記の様にサンプルスクリプトをコピーしてください。尚、Maildir形式を利用する場合はrcスクリプト中qmail-start以下を ./Maildir/ splogger qmail に変更して下さい。

# cp /var/qmail/boot/home /var/qmail/rc   

次にユーザーのホームディレクトリにMaildirを作成します。

% /var/qmail/bin/maildirmake $HOME/Maildir
% echo ./Maildir/ > $HOME/.qmail
   

Maildir以下のディレクトリ構成を/etc/skelに保管しておくと次回ユーザ作成直後からメールを利用出来る様になります。

<Sendmailからの移行作業>
元のSendmailコマンドのバックアップを取ります。

# mv /usr/lib/sendmail /usr/lib/sendmail.bak   

スプールに残っているメールを転送しておきます。
sendmail を起動しないように パーミッションを0にしておきます。

# chmod 0 /usr/lib/sendmail.bak
# chmod 0 /bin/mail 
 
qmailへの移行を考えた場合は、mailコマンドをqmailに設定しておいた方がよいでしょう
 

/usr/lib/sendmailコマンドをqmailのsendmailコマンドに置き換えます。

# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail   

qmail の起動は/var/qmail/rcから立ち上げます。

# csh -cf '/var/qmail/rc &'   

<転送メールを利用>
rootユーザーのメールアドレスを admin@[ドメイン] にしたい場合 /var/qmail/alias/.qmail-admin を作成し、その中に下記の内容を記述します。

&root   

hoge@[ドメイン名] testuser@test.com に転送したい場合も同じく/var/qmail/alias/.qmail-hoge を作成し、その中に下記の内容を記述します。

&testuser@test.com   

taroユーザーに taro-office taro-home 等の複数のメールアドレスを発行する為には taroのホームディレクトリに~/.qmail-office ~/.qmail-home を作成してその中に下記の内容を記述します。

&taro   

これによりtaro-office@[ドメイン名] taro-home@[ドメイン名] の宛てのメールは すべて taroユーザーに届くようになります。
アドレスが英数字で始まっているときは'&'は省略できます。

controlの基本設定

/var/qmail/control の説明をします。qmailのドメイン設定がうまく行われていない場合、メールサーバー自身自分の名前を知らないわけですからちゃんと機能しません。各設定ファイルはいくつのドメインネームを記述してもかまいませんが、ホスト名とドメイン名はしっかしと区別 して記述してください。

meファイル
メールサーバー自身の[ホスト名].[ドメイン名]を指定します。
<例>
syns.net

localsファイル
ローカル転送に使うドメインを指定してください。meと同じ内容でかまいません。
<例>
syns.net
mail.syns.net
localhost


defaultdomainファイル
メールサーバー自身ドメインを指定します。
<例>
syns.net

rcpthostsファイル
qmail-smtp が参照するファイルであり、ネットワーク経由できたメールのうち、リレーすべきドメインを1行に1つずつ記述しています。このファイルで指定していないドメイン宛てのメールは受け取りを拒否する事ができます。普段smtpを外部に公開していれば そのIPからのみの利用を制限すべきです。

qmailの修正

問題はそう深刻ではありませんが qmail-smtpdがOSのリソースを100%占領するというバグです。外部から悪意ある攻撃でこのリソース不足がおこるようでqmail作者により発見されました。対処方はqmail-smtpdの実行にワンクッションおいて制限付きスクリプトから実行させることで問題は回避できます。

# cd /var/qmail/bin
# mv qmail-smtpd qmail-smtpd2
# touch qmail-smtpd
# chown root qmail-smtpd
# chgrp qmail qmail-smtpd
# chmod 755 qmail-smtpd

新たに作ったqmail-smtpdには次の内容を記述します。

#! /bin/sh
ulimit -d 1024
exec /var/qmail/bin/qmail-smtpd2 ${1+"$@"}

簡単な運用

smtpの設定:inetd.confに smtpを追記します。ポートは25番を開きますのでルーターの設定なども前もって25番を開けておく必要があります。(ルーターを使っていない場合は不要ですが)

smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd  

popの設定checkpasswordを入手してインストールします。展開して、make;make install でOKです。 Checkpasswordは/binに入りユーザーパスワード/etc/passwdからpopのログインユーザーを認識します。inetd.confにpopデーモン欄を追記し ポート110を開かせるようにします。[ドメイン名]には POPメールサーバーのドメイン名を入れてください。ただしこのcheckpasswordはパスワード認証にDESをサポートしています。環境によってはMD5の暗号化を利用している場合もありますので システム自体のパスワード認証をDESに変更するかMail用にパスワードファイルを作るかは管理者が選択してください。たしかcheckpasswordのMD5版もありますが僕のBSDはSunと統一するためにDESに変更しました。変更方法などの詳細はこれより下を参考にしてください。

pop3 stream tcp nowait root /var/qmail/bin/qmail-popup qmail-popup [サーバのFQDN] /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir

imapを利用する場合: Maildir形式でimapを利用するには imap2000(wu-imapd)を利用するといいみたいです。試しにやってみました。imap2000を解凍後 gccでコンパイルします。

# make gso

imapというディレクトリが完成します。その後、下記の様に適当な場所にコピーします。

# cd imapd
# cp imapd /usr/local/etc/

inetd.confの内容を編集して、先ほどコピーした場所からimapdを呼び出します。

imap stream tcp nomait root /usr/local/etc/imapd imapd

これで作業終了です。imap-SSLを利用して本格的な運用をする方法は 後で説明します

smtpリレーの制限 (tcpserver)

ここではqmailとtcpserverの連結を紹介します(インストール方法はメインページの「インストールログを参照」のこと)。

tcp.smtp.cdbの作成 >
smtpのアクセスをコントロールするdatabaseファイルを作成します。
まずコントロールのルールを/etc/tcp.smtpに記述します。

210.152.:allow,RELAYCLIENT=""
210.129.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

:allow

上記は、210.152.および210.129.のnetworkからの接続においてRELAYCLIENTを指定しています。記述の注意点はIPアドレス:(コロン)との間などスペースを入れない様に注意して下さい。
この結果/var/qmail/control/rcpthostsの制約が無効、smtpの中継が許可されます。
それ以外のnetworkからのsmtpの中継は環境変数RELAYCLIENTが設定されず許可されません。
下記のコマンドラインを実行してください。これにより/etc/tcp.smtpから/etc/tcp.smtp.cdbを作成します。

# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

/etc/tcp.smtpを変更した場合は、/etc/tcp.smtp.cdbを忘れずに作りなおしてください。

/etc/inetd.confの修正 >
/etc/inetd.confのsmtpの行を削除/コメントアウトします。
ps axでinetdのプロセス番号を確認してKillシグナルを送ります。

# kill -HUP

<qmail-smtpdを起動>
tcpserverで/var/qmail/bin/qmail-smtpdを起動します。

# tcpserver -u [qmaildUID] -g [nofilesGID]-x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd &

-u 7791 は qmaildのUIDです。
-g 2108 は qmaildが属すnofilesのGIDです。
システムの起動スクリプト(/etc/rcなど)に上の行を追加しておきます。
debugには"-v"をつけましょう。

最後にtcpserver のオプションをまとめておきました。参考にして下さい。
-R リモートホストから $TCPREMOTEINFO の取得を行わない
-H DNSでリモートホストを調べない
-l0 DNSでローカルホストを調べない(小文字のエルに数字のゼロ)
-v 全メッセージ出力 -c 同時接続数
-x tcprulesの設定ファイルの指定

ログを取りたい場合は qmailのsploggerにパイプで渡してください。
例: 2>&1 | /var/qmail/bin/splogger pop3d 3 & など

smtp-auth (inetd or tcpserver and patch)

http://members.elysium.pl/brush/qmail-smtpd-auth/ 
http://www.sera.desuyo.net/smtp-auth/qmail-smtpd-auth-0.30-iwm.patch
素材はこちらにあります。kazuhiko Iwama氏が作成したパッチも用意してください。
とりあえず smtp-authサーバーの導入だけ考えていきましょう(こちらが理想です)。

展開後 base64.c base64.h の2つのファイルをqmail1.03の中に入れてパッチを当てるだけです。

# gtar zxvf qmail-smtpd-auth-0.30.tar.gz
# cd qmail-smtpd-auth-0.30
# cp README.auth base64.c base64.h ../qmail-1.03
# patch -d ../qmail-1.03 < auth.patch
# cd ../qmail-1.03
# patch -p1 < ../qmail-smtpd-auth-0.30-iwm.patch

ver0.30 などで 認証がうまくいかないというバグ報告が盛んに噂されていますが、qmail-smtpd-auth-0.30-iwm.patch を使えば全てのsmtpリレーを認証することができます。プロバイダー等、smtpサーバーが別 で用意されている場合はこの手段を取った方がいいでしょう。外側ホストから内側ホストにリレーする場合も認証するわけですから、popサーバーと同一では使えません。

smtp stream tcp nowait root /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd [サーバのFQDN] /bin/checkpassword /bin/true &

passwdファイルを使って認証するのでroot権限である事に注意しておいてください。)

popサーバーと共存させる為にはどうすればいいのでしょうか。この不都合の原因は、このauthパッチが内側ホストから送信したスプールなのか外側ホストから受信したスプールなのか、区別 する事ができないとろこにあります(少なくとも現在のバージョンでは)。それをtcpserverで回避します。smtp-auth認証をかけた後でrcpthosts制限をかけます。smtp-auth認証に成功したユーザーからのスプールはrcpthosts制限を無視します。smtp-auth認証に失敗したユーザーはrcpthosts制限がかかります。これにより外部ホストから受信したスプールはsmtp-auth認証にパスできなくともrcpthosts制限によってsmtp-localに渡されるわけです。
あまり良い方法ではありませんがsmtpサーバーのsmtpdとpopのsmtpdを共存させるにはこの方法しか思い浮かびません(強引にポートを分けてもいいのですが別 ポートでsmtpサーバーを使うことのできないMTUもあるわけですから)。もちろん認証エラーはsmtp-authのエラーではなくrcpthosts制限メッセージとして表示されるでしょう。
kazuhiko Iwama氏が作成したパッチを当てずに smtp-authパッチだけ当て下さい。起動方法だけ変わります。tcpserverから下記のように起動します。

# tcpserver -l0 -HR -u 0 -g 102 -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd syns.net /bin/checkpassword /bin/true &

tcp.smtpの内容は下記の通りです。

127.:allow,RELAYCLIENT=""
:allow

tcpserverは一度起動すれば処理は継続されますのでRCスクリプトに埋め込む場合は必ず&をつけておきましょう。checkpasswordはroot(UID0)で起動していますが、setuidやsetfaclなどを使ってqmailユーザーで起動させる別 の良い手段が他にあるかもしれません。各々で良い方法を選択して下さい。qmail全体を見て作業を進めていくと、このあたりがかなり複雑になってしまって動作をしっかりと理解していなければ頭がゴチャゴチャになるかとおもいます。ゆっくりと理解していって下さい。
http://tanaka-www.cs.titech.ac.jp/~euske/doc/qmail-expl.html
http://www.big.or.jp/~mio/ca/qm/ref/qm.html
これらを参考にして下さい。

courier-imap

SSLに対応しているcourier-imapを紹介します。今回の素材はcourier-imap-2.2.1.tar.gzとopenssl-0.9.7とdb-4.0.14です。OpenSSLのインストール方法はOpenSSHとセットで メインページの「インストールログ」に示していますのでそちらを参照してください。尚、BerkelyDBのパスは/usr/local/dbとします。

$ gtar zxvf courier-imap-2.2.1.tar.gz
$ cd courier-imap-2.2.1
$ setenv CPPFLAGS "-I /usr/local/ssl/include -I /usr/local/db/include"
$ setenv LDFLAGS "-L /usr/local/ssl/lib -L /usr/local/db/lib "

$ ./configure --without-authmysql --prefix=/usr/local/imapd --without-authldap
$ make
$ make check [error]
$ su
# make install
# make install-configure

<imapdの通常起動>
/usr/local/imapd/libexec/authlibに認証モジュールが入っていますので各々の認証より使い分けて下さい。
authdaemondにはBerkeleyDBのlibdb-4.1.soが必要です。こちらを/usr/lib以下にリンクを貼ってから以下のコマンドラインより起動して下さい。

/usr/local/imapd/libexec/imapd.rc start

<SSL通信imapdの起動>
etc/imapd-sslファイルの以下の行を編集します。
IMAPDSSLSTART=YES
OpenSSLで作成した秘密鍵と公開鍵を追記したファイルを/share/imapd.pemに生成します。起動は次のコマンドラインを実行して下さい。

/usr/local/imapd/libexec/imapd-ssl.rc start

vpopmailと併用する際にpreauthvchkpw.cのコンパイルでエラーが発生する場合があります。解決策としてhttp://www.inter7.com/vpopmail/download.htmlを参考にしてください。

vpopmail

1つのサーバーが2つ以上のドメインを持ち仮想ドメインと仮想メールユーザーを公開させることができます。またメールユーザーを完全にUNIXユーザーと切り離して使う場合にも用いられるツールです。

http://www.inter7.com/vpopmail/ よりダウンロードしてください。
今回使用したサンプルはvpopmail-5.2.1です。

# tar xvzf vpopmail-5.2.1.tar.gz
# cd vpopmail-5.2.1
# groupadd -g 89 vchkpw
# useradd -g vchkpw -u 89 -d /var/vpopmail vpopmail
# ./configure
--enable-hardquote=2097152 (quota2MBにした場合)
--enable-roaming-users=y
(pop before smtpを使用する場合)
# make
# make install-strip

UIDとGIDは他のページをみても89を使っているのであわせる事にしました。インストール先は/var/vpopmail です。

<仮想ドメインの追加と削除>
インストールが済めば仮想ドメインと仮想ユーザーを設定します。

# cd /var/vpopmail
# ./bin/vadddomain free.syns.net
Please enter password for postmaster:
enter password again:

仮想ドメインの管理者用パスワードを入力します。このパスワードは、仮想メールユーザーの追加・削除でも使用します。パスワードは、vadddomainの2番目の引数として指定することも可能です。

仮想ドメインの削除は次のコマンドラインを実行してください。

# ./bin/vdeldomain free.syns.net

又は、/var/qmail/control/virtualdomainsを編集し、/var/vpopmail/domains/free.syns.netを削除することで仮想ドメインは削除されます。

仮想ユーザーの追加は次の様にして下さい。

# ./bin/vadduser test@free.syns.net
Please enter password for test@free.syns.net:
enter password again:

削除は次の様に実行して下さい。

# ./bin/vdeluser test@free.syns.net

<仮想ユーザのクォータ変更>
これにはvsetuserquoteコマンドを使用します。
このコマンドを使用するには、./configureオプションに--enable-hardquote=y を指定して下さい。(デフォルトではすでに50MBの制限がかけられています。)

# ./bin/vsetuserquota test@free.syns.net 5m

これでtest@free.syns.netのクォータが5Mに設定されました。

<エイリアスを利用する場合>
./domains/free.syns.net/.qmail-[エイリアスユーザー名]
を作成し、その中に転送先ユーザー叉は転送先メールアドレスを記述してください。

smtp-auth&pop3を使用する場合はパスワード参照先を/var/vpopmail/bin/vchkpwに変更します。

# tcpserver -l0 -HR -u 0 -g 102 -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd syns.net /var/vpopmail/bin/vchkpw /bin/true &

pop before smtpを使用する場合は下記の様に起動します。

# /usr/local/bin/tcpserver -l0 -HR -v -x /etc/tcp.smtp.cdb -u [qmaildのUID] -g [nofilesのGID] 0 smtp /var/qmail/bin/qmail-smtpd
# /usr/local/bin/tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] /var/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir

またcronに対して下記の様に設定してください。

# crontab -e
0 * * * * /var/vpopmail/bin/clearopensmtp 2>&1 > /dev/null
 

(注意)ユーザー名は今回の場合、test@free.syns.netになります。

controlパラメータの種類

plusdomain
hogege@aaa.bbというアドレスに送っても、ここで+ccと記述しておけばhogege@aaa.bb.ccに送られます。

databytes
巨大な容量のメールをリレー拒否したい場合はこのファイルを作成してバイト数のみを書き込んで下さい。無制限にする場合は0とするか、作成しないかしてください。

badmailfrom
リレーしたくない 送信者またはそのドメインを書き込んでおくファイルです。ここに書き込まれたメールアドレスまたはドメインから送られてきたメールは一切リレーしません。

bouncefrom

バウンスメッセージを返信する送信元のユーザー名を指定します。バウンスメッセージが返信される原因の大半は永続的な配信障害によるものでデフォルト値はMAILER-DAEMONとなっています。

bouncehost
バウンスメッセージを返信する送信元のホスト名を指定します。デフォルト値はmeと同じホスト名になっています。

concurrencylocal

qmail-localが同時に実行できるプロセス数を定めることができます。デフォルト値は10であり最大値はコンパイルパラメータconf-spawnで設定されています。ディフォルトの最大値は120ですが、conf-spawnを255まで上げることが可能です。

concurrencyremote
qmail-remoteが同時に実行できるプロセス数を定めることができます。デフォルト値は20であり最大120まで上げることができます。concurrencylocalと同じ様にコンパイルパラメーターconf-spawnを変更すれば最大を255まで上げることが可能です。

queuelifetime

メールキュー内の未送信メッセージの保管時間を指定します。このファイルのディフォルトは1週間(604800)となっています。この時間が経過すると、qmail-sendはメッセージの最後の配送を試み、配送されなかった場合はメッセージを削除します。

smtproutes
メールを特定の宛先に配送するために使用できる静的なSMTP経路を指定します。host:relay と書き込んでおけばhostに指定したホスト名またはドメイン名宛のメールは、relayに指定したメールサーバーに転送されます。これによりDNS MXレーコードの検索をせずにメールを転送させることができます。


timeoutconnect
qmail-remoteがリモートSMTPサーバによるSMTP接続の許可を待つ時間を指定します。指定した時間が経つと、SMTPセッションは切断されます。デフォルトは60(秒)になっています。

timeoutremote
qmail-remoteがリモートSMTPサーバからの応答を待つ時間を指定します。指定した時間が経つと、qmail-remoteはセッションを切断し、配送障害をログに記録します。デフォルトは1200(秒)になっています。

timeoutsmtpd
qmail-remoteがリモートSMTPサーバからのデータの受信を待つ時間を指定します。デフォルトでは1200(秒)になっています。


 


<戻る>