きまぐれほげほげひろば

メールサーバー(qmail)のインストール

安全で動作が速いと言われているメールサーバー、「qmail」のインストールを説明します。ちょっとややこしいので初心者には難しいかも・・・

設定時の環境
Fedora Core2
FreeBSD 4.?でもやりました。
wgetはfetch に、makeはgmakeに置き換えてください

やりたい事に応じていろんなインストール方法があるので、最初に方針立てをします。
私の場合は・・・・

ここの手順は、あくまでも私の行った手順です。これを真似してもあなたの環境で100%動くとは限りません。

とにかく探すのが大変。ここ何年とバージョンアップしてないゆえにいろんな人がいろんもん作ってるから・・・

・qmail本体

$ wget ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz

・メールのローカルタイム表示パッチ(デフォルトはグリニッジ標準時)

$ wget http://www.jms1.net/qmail/qmail-date-localtime.patch

tcpserver (外部接続管理)

$ wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz

・quota制限検出機能パッチ(容量オーバーを検出し、その旨を送信者に返す・デフォルトでは容量一杯で受け取れなかったとき、ただのエラーとしか返さない)

$ wget http://www.qmail.org/qmail-1.03-quotas-1.1.patch

・アドレスレベルでの受信拒否を設定できるようにするパッチ

$ wget http://patch.be/qmail/badrcptto.patch 

・APOP認証

$ wget http://optusnet.dl.sourceforge.net/sourceforge/checkpw/checkpw-1.01.tar.gz

・relay-ctrl(POP before SMTP)

$ wget http://untroubled.org/relay-ctrl/relay-ctrl-3.1.1.tar.gz

・daemontools(デーモンとして動かすプロセスの環境変数管理??)

$ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz

落とすものが一杯ですね。先の見える人は、この時点でめまいがする人もいるかも(苦笑)

qmail用のホームディレクトリを作成します。

# su -
# mkdir /var/qmail

qmailが使うユーザ・グループを作成します。qmailって、一つの機能で専用のユーザを使うんですね。だからセキュリティが堅いのかな?

# groupadd -g 900 nofiles
# useradd -u 900 -g nofiles -d /var/qmail/alias -s /bin/false alias
# useradd -u 901 -g nofiles -d /var/qmail -s/bin/false qmaild
# useradd -u 902 -g nofiles -d /var/qmail -s/bin/false qmaill
# useradd -u 903 -g nofiles -d /var/qmail -s/bin/false qmailp

# groupadd -g 901 qmail
# useradd -u 904 -g qmail -d /var/qmail -s /bin/false qmailq
# useradd -u 905 -g qmail -d /var/qmail -s /bin/false qmailr
# useradd -u 906 -g qmail -d /var/qmail -s /bin/false qmails

ダウンロードしてきたものの内、tarボールになっているものを展開(解凍)します。

$ tar zxvf qmail-1.03.tar.gz
$ tar zxvf checkpw-1.01.tar.gz

qmailのソースにパッチを当てます。

$ cd qmail-1.03
$ patch -p1 <  ../qmail-date-localtime.patch           #地方標準時対応パッチ
$ patch -p1 <  ../qmail-1.03-quotas-1.1.patch          #quota制限検出対応(エラーみたいなものが出るが気にしない)
$ patch -p1 <  ../badrcptto.patch                      #アドレスレベルの受信拒否設定パッチ
$ patch -p1 <  ../checkpw-1.01/qmail-popup-auth.patch  #APOP/POP共存パッチ

最近のLinuxでは、glibあたりの使用が変わったのか、ソースに以下の修正が必要です。
とりあえずコンパイルしてみて「errno が・・・」(もちろん英語)というエラーが出たら試してください。

$ vi error.h
extern int errno;  #この記述の行を以下のように変更
	↓
#include <errno.h>

qmailのソースをコンパイル・インストールします

$ su -
# make setup 2>&1 | tee intall.log   #BSDの場合はgmake
# make check

次のコマンドで設定ファイルを生成します。

# ./config
ここで「I'm sorry 〜 DNS」のエラーメッセージが出た場合は、次のコマンドを実行する。  (この状態はDNSの設定が出来ていないときに発生する)
# ./config-fast サーバーのフルドメイン
設定ファイルが生成されたので中身を確認
# cat /var/qmail/control/me                       #マシンのホスト名
サーバーのフルドメイン
# cat /var/qmail/control/locals                   #ローカル配送とする宛先アドレスのドメイン名
サーバーのフルドメイン
# cat /var/qmail/control/rcpthosts                #受信を許可する宛先アドレスのドメイン名
サーバーのフルドメイン
ここで、/var/qmail/control/locals に「localhost.localdomain」と自分のhostname を改行区切りで追記しておくといいかも
# echo -e "localhost.localdomain\nサーバー名" >> /var/qmail/control/locals

起動スクリプトの雛型をコピーします。起動するための情報が記述されています。

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

qmailを起動して、この時点で正しく動作するか確認します。付属のメール送信コマンドからローカルの他のユーザに対してメールを配信します。

# /var/qmail/rc &                       #起動スクリプトをバックグラウンドで実行
# /var/qmail/bin/qmail-inject           #CUIのメールクライアント
To:user
Subject:Test

test.
Ctrl+Dを押して終了
ユーザ:userにメールが届いているはずなので確認する。配信されていれば/home/user/Mailboxが作成されている。
$ ls /home/user
Mailbox
$ cat /home/user/Mailbox
先ほどのメールの内容
確認が終えたら、一旦qmailを停止する。。
# ps -ef | grep "qmail-send"
qmails    3059 31947  0 01:52 pts/8    00:00:00 qmail-send
# kill 3059   #3059はqmail-sendのプロセスID(その時に応じて変更)

Sendmailをqmailに置き換えるために、既に起動しているSendmailを停止します。

/etc/rc.d/init.d/sendmail stop                    #sendmailの停止

Sendmailのコマンドを使用するアプリケーションもあるため、qmailに橋渡しする仕組みを作ります。

# cd /usr/sbin
# mv sendmail sendmail.dist       #sendmailのバイナリを別名に退避
# chmod 0 sendmail.dist           #退避したものにアクセスできなくする
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail      #退避したsendmailの代わりにラッパーにシンボリックリンクを張る

postmaster宛のエラーメールなどが/var/qmail/alias/Mailboxに届くようにします。

# cd /var/qmail/alias
# touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
# chmod 644 .qmail*
ローカル配送のメールがきたとき、1番はじめに/var/qmail/alias/.qmail-メールアドレスの@以前のファイルを参照しにいきます。該当のファイルが存在し中身が空ならそのディレクトリに、メールアドレスが書かれていればそのユーザに転送します。該当のファイルがなかったときは/home/メールアドレスの@以前を探しに行きます。
qmailはrootの権限では動いていないので、ユーザのホームディレクトリはotherでアクセスできる必要があります。もちろん/rootはotherにアクセス権がついていないので別のところにメールを保存させてあげる必要があります。

Postmaster宛てエラーメールを別のアドレスに転送する場合を以下を行う

# echo 転送したいアドレス > /var/qmail/alias/.qmail-postmaster
# echo 転送したいアドレス > /var/qmail/alias/.qmail-mailer-daemon
# echo 転送したいアドレス > /var/qmail/alias/.qmail-root

/home/ユーザディレクトリに.qmailを作成し、「./Maildir/」と記述します。

$ echo "./Maildir/" > ~/.qmail

全てのユーザに無条件にMaildirを適応するなら以下

# vi /var/qmail/rc
qmail-start ./Mailbox splogger qmail
                 ↓修正
qmail-start ./Maildir/ splogger qmail
修正後、qmailを再起動で有効。

上ではMaildir形式でメールを保存しますよと宣言しただけで、器が出来てません。ということで器となるMaildirを作成します。

$ cd                                    #メールを受け取るユーザでログイン
$ pwd                                   #確認
/home/ユーザディレクトリ
$ /var/qmail/bin/maildirmake Maildir    #Maildirの作成

useraddする度にMaildirの設定をしなくてもいいように/etc/skel雛型ディレクトリにあらかじめ仕込んでおく

# /var/qmail/bin/maildirmake /etc/skel/Maildir

まだ今の設定では外部からのメールを受け取れません。Portからqmailを結びつけるTcpserverをインストールします。

$ cd ダウンロードしたディレクトリ
$ tar xzvf ucspi-tcp-0.88.tar.gz
$ cd ucspi-tcp-0.88
# #ここで最近のLinuxの場合はerrnoの部分を修正。5−1を参照
# make setup
# make check
# ls /usr/local/bin/tcpserver               #確認
これでイントール完了。/usr/local/binに tcpserver が配置

APOP認証ができるツールをインストールします。

$ tar xzvf checkpw-0.80.tar.gz
$ cd checkpw-0.80
# make setup check

このツールOSの認証を利用せず、独自のパスワードファイルを使用します。
パスワードファイルはユーザごとに持ち、
/home/ユーザディレクトリ/Maildir/.password (アクセス権600である必要がある)
に、中身をパスワードの平文を記述して保存します。

daemontoolsは普通のインストール方法とは異なりますので注意です。インストーラーがバイナリで用意されています。

# mkdir -p /package
# chmod 1755 /package
# cd /package
# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
# tar zxvf daemontools-0.76.tar.gz
# cd admin/daemontools-0.76
# vi src/error.h #ここで最近のLinuxの場合はerrnoの部分を修正。5−1を参照
# package/install

まずはアーカイブの展開から

# tar xvfz relay-ctrl-3.1.1.tar.gz
# cd relay-ctrl-3.1.1/
ここでちょっとソースを変更します。製作者とのコンパイラの仕様の違いからか制御するファイルにアクセスできないからです。
# vi relay-ctrl-allow.c
... (関数make_file)
  switch (do_chdir()) {
  case 0: return;
  case 2: mode = 0666; break;
  default: mode = 0600; break; /*←46行目*/
                   ↓この行を変更
  default: mode = 0644; break; /*←46行目*/
  
# vi relay-ctrl-check.c
... (関数main)
    if (expiry <= 0) expiry = 900;
    if ((rc = getenv("RELAY_CTRL_RELAYCLIENT")) == 0) rc = "";
    if ((ip = getenv("TCPREMOTEIP")) == 0) /*←85行目*/
                   ↓この行を変更
    if ((ip = getenv("TCPREMOTEIP")) == 0 || (ip= validate_ip(ip))==0) /*←85行目*/
コンパイルします
# make
# ./installer
このツールが使用するディレクトリと設定ファイルを作成します。
# mkdir /var/spool/relay-ctrl
# mkdir /var/spool/relay-ctrl/allow
# chmod 700 /var/spool/relay-ctrl
# chmod 777 /var/spool/relay-ctrl/allow
# mkdir /etc/relay-ctrl
# echo "/var/spool/relay-ctrl/allow" > /etc/relay-ctrl/RELAY_CTRL_DIR  #リレーコントロールの認証記録ファイルのディレクトリの場所の設定

許可した接続の寿命の設定(秒単位)

# echo '900' > /etc/relay-ctrl/RELAY_CTRL_EXPIRY
無条件に接続を許可するドメインの指定
# echo '' >> /etc/relay-ctrl/RELAY_CTRL_RELAYCLIENT #空っぽの方が良いみたいです
expiry(認証記録ファイル)の自動削除設定
# crontab -e                  #エディッタが立ち上がる #5秒おきに起動
*/5 * * * *  /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age

あとは、起動スクリプトを/etc/rc.d/init.d に配置して起動するのみ!

起動スクリプトは記載すると長くなるので、ココに置いておきます。恥ずかしながら私のお手製ですが・・適当に改造して使ってやってください。

# cp qmail /etc/rc.d/init.d   #起動スクリプトのファイル名をqmailと名づけたとします。
# chmod 755 /etc/rc.d/init.d/qmail

qmailの開始

service qmail start
qmailの停止
service qmail stop
qmailの再起動
service qmail restart
qmailの起動チェック
service qmail status

ここの手順は、あくまでも私の行った手順です。これを真似してもあなたの環境で100%動くとは限りません。

戻る