qmailのインストール方法
Auhtor nari@seeds-man.com
Document version 1.0
Last update 2001/09/04

INDEX
  • qmailのソースコードを取得の取得と解凍
  • アカウントの作成
  • コンパイル
  • エイリアスの作成
  • 設定ファイルの記述
  • qmailの起動形態
  • 起動ファイルの設定
  • 動作確認
  • リレー許可・不許可の確認
  • メールボックスの作成
  • qmailのソースコードの取得と概要

    http://cr.yp.to/qmail.html からqmail-1.03.tar.gzを取得する。

    $ tar -zxf qmail-1.03.tar.gz

    にて解凍し、解凍後作成される qmail-1.03ディレクトリを適当な場所に移動する。
    (ここでは/usr/local/srcに移動したものと仮定する)

    $ cd /usr/local/src/qmail-1.03

    と、qmailのディレクトリに移動し、

    $ ls INSTALL*

    と実行すると以下のようなファイルが見つかるはずだ。

    INSTALL  INSTALL.alias  INSTALL.ctl  INSTALL.ids  INSTALL.maildir  INSTALL.mbox  INSTALL.vsm

    英語がわかる人であれば、ISNTALLファイルの記述にしたがってインストールすればなにも問題ないはずである。


    アカウントの作成

    qmailを動かすために必要なアカウントを作成する。
    Linuxの場合は以下のコマンドをrootユーザで実行する。

    $ groupadd nofiles
    $ useradd -g nofiles -d /var/qmail qmaild
    $ useradd -g nofiles -d /var/qmail qmaill
    $ useradd -g nofiles -d /var/qmail qmailp
    $ useradd -g nofiles -d /var/qmail/alias alias
    $ groupadd qmail
    $ useradd -g qmail -d /var/qmail qmailq
    $ useradd -g qmail -d /var/qmail qmailr
    $ useradd -g qmail -d /var/qmail qmails

    Linux以外のOSでのアカウント作成方法については、INSTALL.idsファイルに詳しく記述されているためそちらを参照してもらいたい。


    コンパイル

    /usr/local/src/qmail-1.03に移動してコンパイルを行う。

    $ cd /usr/local/src/qmail-1.03
    $ make setup check

    コンパイルが成功したら、次にqmailの設定ファイルの準備を行う。

    $ ./config

    ホスト名がDNSに登録されていないとエラーが発生するが、その場合は後述する手動による設定ファイルの 設定を行えば問題ないので無視する。


    エイリアスの作成

    メールサーバとして最低限必要なアドレスエイリアスを作成する。
    アドレスエイリアスは、/var/qmail/aliasディレクトリの下に、"qmail-エイリアス名" というファイルを作成することで エイリアスを作成することができる。
    ここでは、"postmaster", "MAILER-DAEMON", "root"の3つのエイリアスを作成する。

    $ cd /usr/local/src/qmail-1.03
    $ touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
    $ chmod 644 .qmail*

    postmasterとrootのエイリアスにメールサーバの管理者のアドレスを定義する。

    $ echo '&管理者のメールアドレス' > .qmail-postmaster
    $ echo '&管理者のメールアドレス' > .qmail-root


    設定ファイルの記述

    qmailの動作に必要な設定ファイルを記述する。

    $ cd /var/qmail/control

    $ vi me

    この me というファイルにはメールサーバ自身のホスト名を指定する。
    後述するlocals, defaultdomain, defaulthost, plusdomainの各ファイルが存在しない場合のデフォルト値としても利用される。
    ホスト名はFQDN(Fully Qualified Domain Name : 完全修飾ドメイン名)で指定する。

    例)
    mail.seeds.mine.nu

    $ vi locals

    この locals というファイルは、qmailがローカル配送として処理すべきドメインを一行に一つずつ指定する。

    例)
    localhost
    mail.seeds.mine.nu
    seeds.mine.nu

    $ vi rcpthosts

    このrcpthostsファイルには、ネットワーク経由でqmailが受け取ったメールのうち、受理すべきドメインを 一行に一つずつ指定する。
    qmailは外部から自身に対してsmtp要求があった場合、そのsmtp要求が示す送信先アドレスのドメインが、この rcpthostsに定義されているドメインになかった場合、その要求を不正リレーとみなし、受取りを拒否する。
    例外としてqmail-smtpdの動作時に環境変数RELAYCLIENTがセットされている場合は、rcpthostsの内容は無視され 全てのドメイン宛のメールを受理する。
    (環境変数RELATCLIENTについては後述で説明するため、ここでは気にしないでほしい)

    このrcpthostsファイルにはメールサーバ自身が管理するドメインを記述すればよい。

    例)
    localhost
    seeds.mine.nu
    .seeds.mine.nu
    例では、xxx@localhost, xxx@xxx.seeds.mine.nu, xxx@seeds.mine.nuのドメインが送信先アドレスである場合、 qmailは自身へのメールと判断し、メールを受理する。


    $ vi defaultdomain

    qmail-injectが参照するファイルであり、メール送信時に宛先アドレスもしくは送信者のアドレスのドメイン部に ドット(.)がない場合、自動的に付加するドメイン名を指定する。

    例)
    seeds.mine.nu

    $ vi defaulthost

    qmail-injectが参照するファイルであり、メール送信時に宛先アドレスもしくは送信者アドレスのドメイン部が 省略されている場合、自動的に後ろに付加するドメイン名を指定する。

    例)
    seeds.mine.nu
    この例では、送信先アドレスに nari と指定してメールを送信した場合、qmailがnari@seeds.mine.nuとアドレスを 補完してくれる。


    $ vi plusdomain

    このplusdomainファイル、qmail-injectが参照するファイルであり、宛先ドメインが + という文字で終っていた場合、 このファイルに定義されているドメインで補完する。
    たとえば、このファイルに ne.jp と記述しておき、宛先アドレスに nari@seeds+ と指定してメールを送信すると、 qmailは、宛先アドレスを nari@seeds.ne.jp と補完する。
    あまり使わない機能なので、ここでは無視してもらってかまわない。

    以上で、qmailの動作に必要な設定ファイルの記述は終りである。


    qmailの起動形態

    qmailの起動形態には、inetd/xinetd(&tcpd)、もしくはtcpserver経由の方法がある。
    inetdはパフォーマンスに問題があるため、使用しないほうが良い。
    tcpserverはqmailと同じ作者が開発したTCP用スーパサーバであり、qmailとの相性も良い。
    しかしながらここでは筆者の独断と偏見と好みから、xinetd(&tcpd) + qmailの起動形態で説明する。
    (これから先の説明は、システムに既にxinetdがセットアップされていることを前提とする。)

    $ cd /etc/xinet.d

    xinetdでは、xinetd経由で起動するプログラム単位にこのディレクトリに設定ファイルを作る必要がある。

    $ vi qmail

    このファイルに以下のような設定を記述する。
    service smtp
    {
      disable         = no
      flags           = REUSE NAMEINARGS
      socket_type     = stream
      protocol        = tcp
      wait            = no
      user            = qmaild
      server          = /usr/sbin/tcpd
      server_args     = /var/qmail/bin/tcp-env -R /var/qmail/bin/qmail-smtpd
    }
    
    気をつける点としては、server, server_argsで示されるプログラム(tcpd, tcp-env, qmail-smtpd)が 指定のパスに存在していることを確認すること。

    次にリレー許可ホストの設定を行う。
    現在のままでは、このメールサーバ宛のメールしか送信することができない状態のため、 他のドメインへのメール送はできない。
    つまり貴方宛のメールを受信することはできても、貴方から他のドメイン(メールアドレス)の誰かへはメールが出せないということ である。

    $ cd /etc

    $ vi hosts.allow

    hosts.allowを編集する。
    tcp-env : 127. : setenv = RELAYCLIENT
    tcp-env : 192.168.10.0/24 : setenv = RELAYCLIENT
    tcp-env : 192.168.20.15 : setenv = RELAYCLIENT
    tcp-env : ALL
    このhosts.allowというファイルは、tcpdが参照するファイルであり、特定の送信元のアドレスやドメインによって 指定のプログラムを動かして良いかどうかのアクセスコントロールに使用される。
    このファイルの書式は、
    <プログラム> : <接続要求パターン> : <オプション> [ : <オプション> ... ]
    となっている。
    上記の例では、ある接続パターンの場合のみ、環境変数RELAYCLIENTを宣言している。
    ここで言っている"ある接続パターン"とは正確にいうと、接続元のIPアドレスのパターンのことである。
    以前に少し話したが、qmailは環境変数RELAYCLIENTが宣言されている要求に対しては、設定ファイル rcpthosts は̵無効になり、どの宛先アドレスに対しても配送するということを思い出して欲しい。
    この例では、内部ドメインのアドレス(信頼する身内のアドレス)からはどの宛先のメールでも受取り、 配送するという意味である。

    注意すべき点として、tcpdはhosts.allow中の記述のうち、マッチするものを見つけたらそれ以降のルールは 参照せずに、即座に指示に従ってしまうことだ。
    つまり、tcp-env : ALL を最初に行に書いてしまうと、全ての接続に対して環境変数RELAYCLIENTが宣言 されることは無くなってしまうので注意すること。


    起動ファイルの設定

    qmailの起動に必要なスクリプトを作成する。

    $ cp /var/qmail/boot/home /var/qmail/rc

    デフォルトの状態のrcは各ユーザのホームディレクトリに伝統的なメールボックス形式であるmbox形式でメールを配送する。
    ここではmbox形式よりも新しく安全なMaildir形式で配送させるように変更する。
    /var/qmail/rcファイルを開き、
    qmail-start ./Mailbox splogger qmail
    という一行を以下のように変更すればよい。
    qmail-start ./Maildir/ splogger qmail

    これで、/var/qmail/rc を実行するとqmailが起動する。
    あとはこれはシステム起動時に自動的に実行するように、/etc/rc.d/rc.localなり、 /etc/rc.d/init.dになり登録しておく。
    最後に先ほど編集した、xinetdの変更を反映させるため、

    $ /etc/rc.d/init.d/xinetd restart

    を実行する。


    動作確認

    qmailをまだ起動させていなければ、/var/qmail/rcを実行してqmailを起動する。

    qmailの動作確認を行うにあたり、まず確認すべき点はqmailが正しく起動されているかどうかである。
    qmailは配送関係のログを記録するように設計されているため、ログを見ることで確認がとれる。
    ログファイルはOSによって異なる可能性があるため、各自確認しておいておくこと。
    ちなみに筆者の環境(Kondara2.0)では、/var/log/maillogに保存される。

    $ tail -f /var/log/maillog

    qmailが正常に起動している場合、ログファイルには以下のようなメッセージが出力されているはず。
    qmail: status: local 0/10 remote 0/10 remote 0/20
    「status」のかわりに「cannot start」と表示されている場合には、インストールもしくは設定が 失敗している可能性が高い。
    この場合、今までの手順を再度確認して欲しい。

    次にpsコマンドを実行して、qmailの4つのプロセスが起動しているかどうかを確認する。
    qmail-send (UIDはqmails)
    qmail-lspawn (UIDはroot)
    qmail-rspawn (UIDはqmailr)
    qmail-clean (UIDはqmailq)
    また、sploggerがqmaillのUIDで実行されていることも確認する。
    $ ps axuw | grep qmail
    qmails    5519  0.0  0.1  1348  420 ?        S    Aug31   0:00 qmail-send
    qmaill    5521  0.0  0.1  1320  464 ?        S    Aug31   0:00 splogger qmail
    root      5522  0.0  0.0  1308  364 ?        S    Aug31   0:00 qmail-lspawn ./Mailbox
    qmailr    5523  0.0  0.0  1308  364 ?        S    Aug31   0:00 qmail-rspawn
    qmailq    5524  0.0  0.0  1300  372 ?        S    Aug31   0:00 qmail-clean
    
    次にローカル配送テストに移る。
    /var/qmail/alias の .qmail-rootファイルの中にアドレスが記入されていないことを確認する。
    もし管理者のアドレスが記入されていたら、テストの間だけ削除し、空のファイルにしておく¡£

    $ echo to: root@seeds.mine.nu | /var/qmail/bin/qmail-inject

    でテストメールをroot宛に送る。
    ただちに、/var/qmail/alias以下にあるMailboxファイルにメールが書き込まれればOKである。
    同時にログファイルには以下のようなメッセージが出力されているはずである。
    starting delivery 1: msg 53 to local root@seeds.mine.nu
    「msg 53」の数字は実行するホストによって異なるので気にしないでよい。

    続いてリモート配送のテストを行う。
    seeds.mine.nu以外の外部ドメインのメールアドレスにローカル配送と同様に送信してみる。

    $ echo to: foo@hogehoge.org | /var/qmail/bin/qmail-inject

    実行するとログファイルに以下のようなメッセージが出力されるはずである。
    starting delivery 2: msg 53 to remote foo@hogehoge.org
    delivery 2: success : 1.2.3.4_accepted_message./...
    このようなログが出力されれば成功である。
    念のため、foo@hogehoge.orgにメールが届いているかどうか確認しておこう。


    リレー許可・不許可の確認

    不正リレーを防ぐ機能についても動作確認をとる必要がある。
    この機能が正常に動作していないと瞬く間にスパムメールの発射基地されてしまう恐れがある。

    まず、hosts.allowに定義した信頼する身内のIPアドレスからこのメールサーバを使ってメールを送信してみる。
    自ドメイン、外部ドメインとも正常にメールが配送されるはずである。

    次に、信頼している身内のIPアドレス以外からこのメールサーバを使ってメールを送信してみる。
    自ドメイン宛のメールであれば(rcpthostsに書かれている)配送され、そうではない外部ドメインの場合は 配送されないはずである。
    この確認はtelnetコマンドを利用して行うことができる。
    信頼していない身内以外のIPアドレスのマシンから以下のようなコマンドを実行する。
    $ telnet mail.seeds.mine.nu smtp
    Trying to 192.168.10.10...
    Connected to mail.seeds.mine.nu
    Escape character is '^]'
    200 mail.seeds.mine.nu ESMTP
    helo test.example.com
    250 mail.seeds.mine.nu
    mail from: <test@seeds.mine.nu>
    250 ok
    rcpt to: <test@example.com>
    553 sorry, that domain isn't in my list of allowed rcphosts (#5.7.1)
    
    最後の行メッセージが出れば、不正リレーをブロックしたということを確認できる。


    メールボックスの作成

    メールボックス形式をMaildir形式にしている場合、qmailでは各ユーザ毎のメールボックスを作成しないとそのユーザにいかなるメールも届かない。
    (ログに「Unable_to_chdir_to_maildir._(#4.2.1)」と表示される)

    したがってメールボックスを作りたいユーザ権限で、

    $ /var/qmail/bin/maildirmake ~/Maildir

    と実行し、Maildir形式のメールボックスを作成する必要がある。