Linux -> サーバ構築 -> qmail

qmailによるメールサーバの構築

第2回 設定


■ コントロールファイルの編集

   /var/qmail/control 配下のファイル

     defaultdomain     qmail-injectが参照するファイルであり、メール送信時に宛先アドレスもしくは送信者のアドレスの
                       ドメイン部にドット(.)がない場合、自動的に付加するドメイン名を指定する。
                       ( toヘッダなどにドメイン名が省略された場合、補完されるドメイン名 )
       ----------------
       mydom.or.jp
       ----------------

     locals            qmailがローカル配送として処理すべきドメインを一行に一つずつ指定する。
                       ( 受信するホスト名・ドメイン名:qmail-sendが利用 )
       ----------------
       localhost
       host.mydom.or.jp
       mail.mydom.or.jp
       mydom.or.jp
       ----------------

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

       ----------------
       host.mydom.or.jp
       ----------------

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

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

       ---------------
       localhost
       mydom.or.jp
       .mydom.or.jp
       ---------------  

■ エイリアスの設定

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

   # cd /var/qmail/alias
   # touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
   # chmod 644 .qmail*

  これでpostmaster、MAILER-DAEMON、rootあてのメールは/var/qmail/aliasに保存されます。

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

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


■ Sendmail の削除

  起動スクリプトの削除
     # rm /etc/rc.d/rc*/*sendmail

   sendmailデーモンを停止します。
      # kill -STOP プロセスID

   sendmailのキュー(/var/spool/mqueue)にメッセージが残っていたら、
   sendmailのキューをフラッシュします。なくなるまで繰り返します。
       # /usr/lib/sendmail -q
 
    sendmailバイナリのsetuidビットを削ります。
       # chmod 0 /usr/sbin/sendmail

    sendmailのバイナリを移動します。
       # mv /usr/sbin/sendmail /usr/sbin/sendmail.bak

    sendmailコマンドのラッパーを設定します。
       # ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

    binmailをシステムから削除します。
       # chmod 0 /bin/mail

■ 起動スクリプト設定

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

   (( MailDir形式の設定 ))

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

    MailBox形式 qmail-start ./Mailbox  splogger qmail
    MailDir形式  qmail-start ./Maildir/ splogger qmail

■ 起動

   /var/qmail/rc &

   ・起動確認

   /var/log/qmaillog に以下のログが出力されている事
       -----------------------------------------------------------------------------
       Nov 15 13:00:55 kakin qmail: 1132027255.418048 status: local 0/10 remote 0/20
       -----------------------------------------------------------------------------

   以下のプロセスが起動している事を確認する。
 
   # ps -ef | grep qmail
   qmails   11716 11431  0 13:00 pts/1    00:00:00 qmail-send
   qmaill   11717 11716  0 13:00 pts/1    00:00:00 splogger qmail
   root     11718 11716  0 13:00 pts/1    00:00:00 qmail-lspawn ./Maildir/
   qmailr   11719 11716  0 13:00 pts/1    00:00:00 qmail-rspawn
   qmailq   11720 11716  0 13:00 pts/1    00:00:00 qmail-clean
   #

■ メールBOXの作成

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

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

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

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

   rootのMaildirは以下のように作成する

   # cd /var/qmail/alias
   # /var/qmail/bin/maildirmake ./Maildir
   # chown -R alias Maildir

   新規のユーザーについては、/etc/skelディレクトリにMaildirのひな型を置いておくと、
   adduserコマンドなどでユーザーを作成した際に自動でMaildirディレクトリが生成されるようになります。具体的には、下記のようにします。

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


■ 送信テスト

   echo to:root | /var/qmail/bin/qmail-inject 

   送信ユーザの  ~/Maildir/new 配下にメッセージが作成される。

   /var/log/maillog に以下のようなメッセージが出力されていればOK。
 
   Nov 15 13:40:08 kakin qmail: 1132029608.316483 starting delivery 2: msg 3047795 to local sysadm11@kakin.homeftp.org
   Nov 15 13:40:08 kakin qmail: 1132029608.316741 status: local 1/10 remote 0/20
   Nov 15 13:40:08 kakin qmail: 1132029608.322660 delivery 2: success: did_1+0+0/


■■ tcpserver のインストールと設定

# tar xvfz ../ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88/
# make setup check 

 次に設定ですが、まずcdbの基になるファイルを準備します。ここでは/etcディレクトリにtcp.smtpファイルとして作成します。

# vi /etc/tcp.smtp 

192.168.0.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""  
:allow

tcpserverは、動作に必要なホスト名やIPアドレスなどの情報を環境変数から取り出します。
例えば、1行目の設定は「192.168.0.*からの接続は環境変数RELAYCLIENTに設定し、接続を許可する」となります。
大きなサブネットで許可したくないという場合は、

192.168.0.0-31:allow,RELAYCLIENT="" 

などのようにしてアドレスの範囲を指定します。これで192.168.0.0から192.168.0.31までが対象になります。
逆に、接続を拒否したい場合は次のようになります。

192.168.0.:deny 

 では、cdbファイルを作成します。cdbファイルは以下のコマンドを実行することで作成できます。

# /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp 

cdbファイルの作成
アクセス用DBファイルを作成します。
DBファイルを作成するには、DBファイルの元となるテキストファイルを作成します。
テキストファイルの例は次のようになります。

#
#  /etc/tcp.pop3 : configuration of pop3 service
#
127.0.0.1:allow      ← 127.0.0.1 を許可
192.168.1.:allow     ← 192.168.1.* を許可
192.168.80-85.:allow ← 192.168.80.* 〜 192.168.85.* を許可
.domain.name:allow   ← *.domain.name を許可
:deny                ← その他は不許可

シャープ("#")で始まる行はコメントです。

コロン(":")の左側に接続元IPアドレスまたは、ドメイン名を記述します。ワイルドカード的に使用したい場合は、
ドット(".")の前後を省略することで指定することができます。
ネットワークアドレス・ネットマスクでの指定はできませんが、アドレスの範囲をハイフン("-")で指定することができます。
また、コロンの左側を書かない場合は、すべての条件を指定できます。
条件の順番は重要です。条件は上から順に判定されますので注意してください。
コロン(":")の右側は allow または deny を記述します。その後ろに環境変数を指定することができます。
例えば、特定の条件に対して、環境変数 RELAYCLIENT を設定するには次のようにします。

#
#  /etc/tcp.smtp : configuration of smtp service
#
127.:allow,RELAYCLIENT=""         ← 127.* はリレー許可
192.168.1.:allow,RELAYCLIENT=""   ← 192.168.1.* はリレー許可
.domain.name:allow,RELAYCLIENT="" ← *.domain.name はリレー許可
:allow                            ← その他はリレー不可(受取のみ)

作成したテキストファイルをtcprulesプログラムを使用してcdb形式に変換します。コマンドの使用方法は次のとおりです。
tcprules (cdbファイル) (tmpファイル) < (textファイル)
例えば、テキストファイルが /etc/tcp.pop3 の場合、cdb形式の /etc/tcp.pop3.cdb ファイルを作成したい場合は、次のように実行します。

# cd /etc
# tcprules tcp.pop3.cdb tcp.pop3.tmp < tcp.pop3

POP3サーバでの起動例
qmail-pop3d の起動例を以下に示します。

# /usr/local/bin/tcpserver -v -x /etc/tcp.pop3.cdb \
  -R -H 0 pop3 /var/qmail/bin/qmail-popup (qmailのホスト名) \
  /bin/checkpassword /var/qmail/bin/qmail-pop3d \
  Maildir 2>&1 &

-R でidentプロトコルを調査を行わず、 -H でホスト名を調べないようにしています。

SMTPサーバでの起動例
qmail-smtpd の起動例を以下に示します。

# /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb \
  -R -H -l0 -u 252 -g 251 0 smtp \
  /var/qmail/bin/qmail-smtpd 2>&1

-u 252 -g 251 で起動するユーザID/グループIDを設定します

■SMTPの設定

アクセスDBの作成
qmail-smtpdを起動するには、qmail-pop3dと同様にinetdやtcpserverなどが必要になります。
tcpserverそのもののインストールの詳細は ucspi-tcpのインストールを参照してください。

アクセスDBの作成
smtpサーバへアクセスする際に利用するためのDBファイルを作成します。エディタで /etc/tcp.smtp サーバを作成します。

#
#  /etc/tcp.smtp : configuration of smtp service
#
192.168.1.:allow,RELAYCLIENT=""   ← 192.168.1.* はリレー許可
127.:allow,RELAYCLIENT=""         ← 127.* はリレー許可
.domain.name:allow,RELAYCLIENT="" ← *.domain.name はリレー許可
:allow                            ← その他はリレー不可(受取のみ)

tcp.pop3ファイルの場合と違うのは、RELAYCLIENT="" という部分だと思います。これは、条件にマッチした場合に、
環境変数 RELAYCLIENT を設定(中身の値はありません) する意味になります。qmail-smtpdは、起動時に環境変数 RELAYCLIENT が設定されていると、
リレー(受け取ったメールを任意のあて先に関してメールを送信すること)を許可します。

smtpサーバの場合、最後の行(上の条件にマッチしない場合)は、自ホストあてであればどのサーバからも接続を許可する必要があったために、
接続そのものは許可しておきます。 (リレーは不可能です)

作成したテキストファイルを cdb 形式に変換します。

# cd /etc
# /usr/local/bin/tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp

※ /etc/tcp.smtp.cdb ファイルが作成されていることを確認します。

qmail-smtpdの起動
起動スクリプトを作成
tcpserverを使用してプログラムを起動します。次のような感じで起動するとよいでしょう。

# /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb \
  -R -H -l0 -u 252 -g 251 0 smtp \
  /var/qmail/bin/qmail-smtp 2>&1

-u 252 -g 251 となっているのは、インストール時に作成したユーザ qmaild のユーザID,プライマリグループIDになります。
これは、idコマンドで調べることができます。

% id qmaild
uid=252(qmaild) gid=251(nofiles) groups=251(nofiles)

また、daemontoolsを使用した起動設定もあります。詳細はdaemontoolsでのqmailサーバのセットアップを参照してください。

■POP3の設定
checkpasswordのインストール
qmail-pop3dを使用するには、UNIXシステムユーザの認証を行うプログラムであるcheckpasswordが必要です。
vpopmailを使用したバーチャル形式のユーザ(user@host.domain形式のユーザ)を使用したい場合は、
checkpasswordを別の認証プログラムを使用すればよいことになります。

ソースを取得して展開します。checkpasswordのホームページは、http://cr.yp.to/checkpwd.html です。

% wget http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz
% tar zxvf checkpassword-0.90.tar.gz

コンパイル・インストールします。checkpasswordプログラムは、/binディレクトリにインストールされます。

% cd checkpassword-0.90
% make
% su
# make setup check

アクセスDBの作成
qmail-pop3dを起動するには、inetdやtcpserverなどのインターネットスーパーサーバが必要です。
インターネットスーパーサーバは、特定のポートに対してアクセスが行われた場合に該当するプログラムを起動するものです。
ここでは、tcpserverが含まれるucspi-tcpプログラムを使用します。

詳細は ucspi-tcpのインストール を参照してください。

アクセスDBの作成
POP3にアクセスするためのDBファイルを作成します。まずは、エディタで /etc/tcp.pop3 ファイルを次のように作成します。

#
#  /etc/tcp.pop3 : configuration of pop3 service
#
192.168.1.:allow      ← 192.168.1.* を許可
127.:allow            ← 127.* を許可
.domain.name:allow    ← *.domain.name を許可
:allow                 ← 条件に一致しない場合不許可

コロン(":")の左側がIPアドレスまたはドメイン名、右側が動作(許可・不許可)を設定します。
最後の行は、すべて(上の条件に一致しない場合に)不許可の設定になります。

作成したテキストファイルを cdb 形式に変換します。

# cd /etc
# /usr/local/bin/tcprules tcp.pop3.cdb tcp.pop3.tmp < tcp.pop3

※ /etc/tcp.pop3.cdb ファイルが作成されていることを確認します。

qmail-pop3dの起動
起動スクリプトを作成
tcpserverを使用してプログラムを起動します。次のような感じで起動するとよいでしょう。

# /usr/local/bin/tcpserver -v -x /etc/tcp.pop3.cdb \
  -R -H 0 pop3 /var/qmail/bin/qmail-popup (qmailのホスト名) \
  /bin/checkpassword /var/qmail/bin/qmail-pop3d \
  Maildir 2>&1 &

-x でcdbファイルの指定を行い、-H で接続元のホスト名を調べない設定になっています。
-Hを指定した場合は、cdbファイル上にドメイン名での確認はできなくなります。オプションの詳細は ucspi-tcpのインストール を参照してください。

また、daemontoolsを使用した起動設定もあります。詳細はdaemontoolsでのqmailサーバのセットアップを参照してください。


■tcpserverによるqmailの起動

# tcpserver -v -u[qmaildのUID] -g[nofilesのGID]-x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 & 


#!/bin/sh
#
# qmail: /var/qmail
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin

[ -f /var/qmail/rc ] || exit 0

case "$1" in
  start)
        # Start daemons.
        echo "Starting qmail."

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

	# Start smtpd
        tcpserver -v -u [qmaildのUID] -g [nofilesのGID]-x /etc/tcp.smtp.cdb \
        0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &

	# Start pop3d
	/usr/local/bin/tcpserver 0 110 \
        /var/qmail/bin/qmail-popup ark.bitarts.co.jp \
	/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &

        touch /var/lock/subsys/qmail
        ;;
  stop)
        # Stop daemons.
        echo "Shutting down qmail."
        PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
        if [ ! -z "$PID" ] ;  then
            /bin/kill ${PID} 1> /dev/null 2>&1
        fi
        echo
        rm -f /var/lock/subsys/qmail
        ;;
   *)
        echo "Usage: S99qmail {start|stop}"
        exit 1
esac

exit 0 


■qmailのプログラム
qmail-smtpd
外部メールサーバやメールソフトからの接続を受け付けて、qmail-queueに渡します。
単独で常駐するのではなく、tcpserverやinetdなどのインターネットスーパーサーバ経由で起動されます。

環境変数 RELAYCLIENT がセットされてqmail-smtpdが起動された場合は、無条件に転送を許可しますが、そうでない場合は、
rcpthostsファイルに記述されたドメイン宛のメールのみ受け取り、それ以外のあて先の場合は第3者転送と判断して拒否します。

qmail-smtpdを通過したメールは、Received: ヘッダがメッセージに付加されます。

qmail-inject
標準入力からデータを読み込み、メールヘッダを加工してqmail-queueに渡します。

qmail-queue
qmail-smtpdやqmail-injectからメールを受け取り、キュー(待ち行列)に入れます。

qmail-send
メールキューからメールを取り出し、メールアドレスや設定ファイルから、「自ホスト宛」(ローカル)か「他ホスト宛」(リモート)かを判断し、
アドレスを加工します。例えば、あて先が user01@example.com の場合、次の順番で判断します。

locals に example.com が存在 → ローカル宛 
virtualdomains に user01@example.com:vuser01 が存在
→ vuser01-user01@example.com とアドレスを変換してローカル宛 
virtualdomains に example.com:examplecom が存在
→ examplecom-user01@example.com とアドレスを変換してローカル宛 
リモート宛 
ローカル宛の場合、qmail-lspawn経由でqmail-localが、リモート宛の場合、 qmail-rspawn経由でqmail-remoteが呼び出されます。

qmail-clean
qmailキューの清掃を行います。メール配送終了時やディスクエラー発生時にqmail-sendから起動されます。

qmail-lspawn
ローカル配送の際に呼び出され、qmail-localへメール配送を依頼します。このタイミングで、
users/assignファイル(正確にはqmail-newuコマンドで作成されたcdbファイル) を検索し、適切なユーザと.qmailファイルのあるディレクトリを検索します。

qmail-local
ユーザに対応したディレクトリから、.qmailファイルを読み出し、メールを配送します。
qmail-localを経由したメッセージには、メッセージ内に "Delivered-To:" ヘッダを付加されます。

qmail-rspawn
リモート配送の際に呼び出され、qmail-remoteへメール配送を依頼します。

qmail-rspawn
qmail-rspawnから呼び出されます。DNS検索などを行った後、相手側メールサーバにメールを配信します。

      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google