魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

qmail

投稿日:
修正日:
修正日:
タグ:

本稿はqmail環境の構築に関するメモである。メールについては「コンピュータ・ネットワーク(6) -アプリケーション層-」を参照されたし。

qmail

qmailは、ダニエル・バーンスタインによって開発されたUNIX系OS向けのオープンソースのメールサーバである。本稿では、その中で現在の最新版であるnetqmail-1.06を使用する。

準備

はじめにqmailのソースコードやパッチを取得する。

ソースコード
netqmail-1.06
qmail-1.03にいくつかのドキュメントとパッチを加えたものである。
パッチ
qmail-103.patch512バイト以上のDNS応答のパケットを取り扱えるようにする。
qmail-date-localtime.patch表示されるDateタグをJST表示にする。
qmail-smtpd-relay-reject.patchユーザアカウント部分にいくつかの記号が入っている場合それを拒否する機能を追加。
圧縮されたqmailの解凍は次のようにして行う。
user% tar zxvf netqmail-1.06.tar.gz

インストール場所の用意

qmailでは、標準で/var/qmailに必要なファイルが配置される。そして、いくつかのユーザのホームディレクトリも/var/qmailに設定される。

user% sudo mkdir /var/qmail

ユーザとグループの追加

qmailでは複数のユーザやグループを使用する。そのためにユーザやグループの追加が必要である。

ユーザ名ホームディレクトリグループその他
alias/var/qmail/alias/nofilesエイリアス機能
qmaild/var/qmail/
qmaill
qmailp
qmailqqmail
qmailr
qmails
追加するユーザや追加方法は、展開されたファイルの1つINSTALL.idsを見れば良い。例えば、私の環境であるFreeBSDの場合、次のようにして行った。
user% pw groupadd nofiles
user% pw useradd alias -g nofiles -d /var/qmail/alias -s /sbin/nologin
user% pw useradd qmaild -g nofiles -d /var/qmail -s /sbin/nologin
user% pw useradd qmaill -g nofiles -d /var/qmail -s /sbin/nologin
user% pw useradd qmailp -g nofiles -d /var/qmail -s /sbin/nologin
user% pw groupadd qmail
user% pw useradd qmailq -g qmail -d /var/qmail -s /sbin/nologin
user% pw useradd qmailr -g qmail -d /var/qmail -s /sbin/nologin
user% pw useradd qmails -g qmail -d /var/qmail -s /sbin/nologin

インストール

もしパッチを当てる場合、コンパイルの前にパッチをソースがあるディレクトリに移動させ、以下のコマンドを実行する。

user% patch < ./qmail-date-localtime.patch
これによりソースコードを修正することができる。

そしてコンパイルとインストールには、makeコマンドを使用する。与える引数は次の通りである。

user% sudo make setup check
makeコマンドが正常に終了したならば、/var/qmailにさまざまなサブディレクトリが生成されているはずだ。

なおFreeBSD10ではutmp.hがないということでビルドエラーが発生した。これを解決するにはコードの修正が必要だが、誰かがパッチを作ったようだ。

設定

/var/qmail以下に生成されたいくつかのディレクトリについて説明する。

alias

エイリアス機能の設定ファイル群。標準では、/var/qmail/aliasはユーザaliasのホームディレクトリである。

設定ファイルは、.qmail-から始まるファイル名であり、メールを追加するファイルやディレクトリ、転送先アドレスが書いてある。

/var/qmail/mbox
mbox形式ファイルのパス。
./Maildir/
maildir形式で保存するディレクトリ
&user
転送先ユーザ。
|/bin/hoge
プログラムに与える場合のプログラムのパス。mbox形式のメールの中身が標準入力に入力される。

/var/qmail/aliasに届いたメールアドレスの設定ファイルがなく、かつユーザとして存在していれば、そのユーザのホームディレクトリにある.qmailの設定ファイルに従って処理を行う。また、"存在するユーザ名-"から始まる名前である場合、ホームディレクトリにある.qmail-から始まるファイルを検索し、あればその設定に従い処理を行う(例えば$HOME/.qmail-testならuser-test)。

必要不可欠なのかは未確認だが、いくつかのプログラムで以下の3つの設定ファイルが使用される。そのためこれらのファイルを作成し、設定を記述する必要がある。

  • /var/qmail/alias/.qmail-root
  • /var/qmail/alias/.qmail-postmaster
  • /var/qmail/alias/.qmail-mailder-daemon
なおこのファイルはaliasによって読み込まれるようである。

もし/var/qmail/alias/にmaildir形式のディレクトリを生成するならば、maildirmakeで生成できる。 ログイン可能な各ユーザが自分のホームディレクトリに生成するならば、次のように普通に使えば良い。

user% maildirmake ~/Maildir
しかし本稿ではaliasを非ログインユーザとして設定しているので、sudoを使用する。
user% sudo -u alias maildirmake ~/Maildir

control

制御ファイルの設定ファイル群。プログラムqmail-smtpdやqmail-send、qmail-inject、qmail-remoteなどによって使用される。以下にいくつかそれらのファイルを紹介する。

me
qmailが稼働するサーバのドメインの名前。
locals
qmailがローカル配送するドメインの名前。
defaultdomain
ドメインを省略した場合に付けられる標準のドメイン名。
plusdomain
メールアドレスに+と付けていた場合に置き換える文字列。
rcpthosts
qmail-smtpdが受信するSMTPのRCPT(宛先アドレス)のドメイン。

/var/qmail/controlを簡単に設定するには、添付されたスクリプトconfig-fastやconfigを使用する。例えばドメインpied-piper.netを前述の5つの設定ファイルに記述する場合、次のようにする。

user% sudo ./config-fast pied-piper.net
詳細については、ソースに添付されたINSTAL.ctlを参照されたい。

bin
プログラム群。以下にいくつかのプログラムを紹介する。
qmail-inject
メールを送信するためのコマンド。先頭から空行までがヘッダで、それからEOFまで本文である。
user% /var/qmail/bin/qmail-inject
To: user
Subject: hello

Hello, User
maildirmake
maildir形式のディレクトリを生成するコマンド。
user% /var/qmail/bin/maildirmake /etc/skel/Maildir
man
マニュアル群。
doc
ドキュメント群。
もし設定ファイルのバックアップを欲しいならば、少なくとも/var/qmail/aliasと/var/qmail/controlのバックアップが必要である。

起動

本稿では、qmailの起動にucspi-tcpを使用する。ucspi-tcpはqmailの開発者したサーバ制御ツールである。ucspi-tcpのtcpserverを使用すると不正中継の防止などを行うことで、セキュリティを向上させることができる。

インストールはqmailと同様このような感じで行うことができる。

user% tar zxvf ucspi-tcp-0.88.tar.gz
user% cd ucspi-tcp-0.88
user% sudo make setup check
tcpserverはtcprulesで生成したデータベースに基づいて処理を行う。

データベースの作成

tcpserverが使用するデータベースを生成するには、ソースファイルを生成し、それをコンパイルする必要がある。

データベースのソースは、各行に「左辺:右辺」といった感じで記述する。左辺にはアドレス、かネットワークを、右辺にはそれに対する設定を記述する。例えばアドレスの場合は"192.168.1.1"のように、ネットワークの場合"127.*.*.*"のネットワークを示したい場合、"127."と記述する。以下にサンプルを示す。

  • 192.168.:allow,RELAYCLIENT=""
    127.:allow,RELAYCLIENT=""
    :allow
    
  • 192.168.:allow,RELAYCLIENT=""
    192.169.:deny
    
もし環境変数RELAYCLIENTを設定した場合、controlのrcpthostsは無視され、RELAYCLIENTの値が使用される。

データベースのコンパイルは次のようにして行う。

user% tcprules tcp.smtp.cdb  tcp.smtp.tmp < tcp.smtp
以上まででtcp.smtp.cdbという名前のデータベースファイルが生成される。

サーバの起動

qmailサーバの起動には、次の3つを起動する。

  • qmail-start
  • qmail-smtpd
  • qmail-pop3d
これらを起動するためのスクリプトのサンプルは次の通りである。
#!/bin/sh

# Start qmail-start
exec env - PATH="$PATH:/var/qmail/bin" qmail-start ./Maildir/ \
splogger qmail &

# Start qmail-smtpd
/usr/local/bin/tcpserver -x /var/qmail/tcp.smtp.cdb -u qmaild \
-g nofiles 0 smtp /var/qmail/bin/qmail-smtpd &

# Start qmail-pop3d
/usr/local/bin/tcpserver -x /var/qmail/tcp.pop3.cdb \
0 pop3 /var/qmail/bin/qmail-popup \
pied-piper.net /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
本稿の構築方法ではログにはsyslogを使用している。もし何かトラブルが発生したならば、まず/var/log/maillogを見れば良いだろう。


トラブルシューティング(というか実際あったトラブル)

deferral: CNAME_lookup_failed_temporarily._(#4.4.3)/
  • ネットワークの構成を変えた際に/etc/resolv.confの内容に誤りがあった。

一覧