maehachi08 Anything Blog

2012年05月05日
qmailインストール(設定編)

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

  • qmailでは設定ファイルを複数のファイルに分けて管理します
  • 設定ファイルの置き場所はデフォルトで /var/qmail/control ディレクトリ
  • qmailではmeファイルがあれば最低限起動させることが可能
  • meファイルだけでは無制限にスパムメール中継を許すことになる

qmailの特徴がセキュリティにあると言われているけど、それはあくまで適切なセキュリティ設定があればこそ!適切な設定を行うことで堅牢で強固なメールサーバを構築できるのです。

# cd /var/qmail/control

# ls -l
合計 20
-rw-r--r-- 1 root root 13  4月 22 20:42 defaultdomain
-rw-r--r-- 1 root root 10  4月 22 20:43 locals
-rw-r--r-- 1 root root 21  4月 22 20:53 me
-rw-r--r-- 1 root root 10  4月 21 19:48 plusdomain
-rw-r--r-- 1 root root 20  4月 22 20:46 rcpthosts

### FQDNをmeファイルに設定します。
# hostname > me

### デフォルトで使用するドメイン名をdefaultdomainに設定します。
# echo "maepachi.com" > defaultdomain

### 受信するホスト名、ドメイン名(qmail-sendプロセスが参照)
# echo "localhost" > locals
# echo "pachi01.maepachi.com" > locals
# echo "maepachi.com" > locals

### 受信するホスト名、ドメイン名(qmail-smtpdプロセスが参照)
### これを設定しないと不特定多数のドメイン宛てのメールを受けとってしまいます。
# echo "localhost" > rcpthosts
# echo "pachi01.maepachi.com" > rcpthosts
# echo "maepachi.com" > rcpthosts

sendmail停止と置き換え

ほとんどのLinuxディストリビューションにはsendmailというMTAインターフェースを備えています。qmailではこのsendmailを置き換える実行可能プログラムを備えています。qmailをメールサーバとして使用する場合には、既存のsendmailプログラムをqmailのラッパープログラムであるsendmailに置き換える必要があります。qmailのsendmailプログラムはqmail-injectにメッセージを渡すフロントエンドとして動作するプログラムです。qmailのsendmailプログラムはsendmailと同じパラメータで動作するのでsendmailをMTAとして使用するように作られたMUAでも問題なく動作します。デフォルトパラメータでqmailをインストールした場合のqmailのsendmailプログラムは/var/qmail/bin/sendmailです。

### sendmailを停止します。
# /etc/rc.d/init.d/sendmail stop

# chkconfig sendmail off

### sendmailプログラムをqmailのラッパープログラムであるsendmailに置き換えます。
# mv /usr/sbin/sendmail /usr/sbin/sendmail-old

# chmod 000 /usr/sbin/sendmail-old

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

管理者アカウント宛てのメールエイリアス設定

# cd /var/qmail/alias/

# touch .qmail-postmaster .qmail-mailer-daemon .qmail-root

# chmod 644 .qmail*

qmail起動スクリプト配置と配送方法の変更

qmailの起動スクリプトである/var/qmail/boot/homeを/var/qmail/rcファイルとしてコピーします。コピーした/var/qmail/rcファイルは初期値ではMailbox設定になっているので、Maildir設定に変更します。この時Maildirの後にスラッシュ(/)を入れることを忘れないようにしましょう。

# ls -l /var/qmail/boot/home
-rwxr-xr-x 1 root qmail 204  4月 21 19:42 /var/qmail/boot/home

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

# ls -l /var/qmail/rc
-rwxr-xr-x 1 root qmail 204  4月 21 19:42 /var/qmail/rc

# vi /var/qmail/rc
(修正前)qmail-start ./Mailbox splogger qmail
(修正後)qmail-start ./Maildir/ splogger qmail

ユーザ作成時のメールディレクトリ作成設定

qmailでMaildir方式のメールサーバを構築した場合、一般ユーザのメールボックスディレクトリは手動で作成する必要があります。メールボックスディレクトリを作成するコマンドである/var/qmail/bin/maildirmakeをそれぞれのユーザで実行する必要があります。

既に存在するユーザアカウントのためのメールボックスディレクトリを作成する場合は対象ユーザアカウントで以下コマンドを実行します。

$ /var/qmail/bin/maildirmake $HOME/Maildir

新規ユーザアカウント登録の際に、自動的にMaildirを作成するようにするには、スケルトンディレクトリ(テンプレートディレクトリ)にMaildirを作成しておくと良いでしょう。スケルトンディレクトリへの登録は以下コマンドを実行します。

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

qmailの起動テスト

/var/qmail/rcを実行するとqmail-startが引数情報を読み込み、実行されます。/var/qmail/rc実行直後のプロセス起動状況も確認しましょう。qmail-sendプロセスを親としてsplogger、qmail-lspawn、mail-rspawn、qmai-cleanが実行されます。

# /var/qmail/rc &

⇒ qmailが起動しているかどうかプロセスを確認します。
# ps auxf | grep qmai
qmails   48290  0.2  0.0   3844   564 pts/1    S    18:16   0:00                      \_ qmail-send
qmaill   48300  0.1  0.0   3800   548 pts/1    S    18:16   0:00                      |   \_ splogger qmail
root     48302  0.0  0.0   3804   400 pts/1    S    18:16   0:00                      |   \_ qmail-lspawn ./Maildir/
qmailr   48303  0.0  0.0   3804   424 pts/1    S    18:16   0:00                      |   \_ qmail-rspawn
qmailq   48305  0.0  0.0   3792   408 pts/1    S    18:16   0:00                      |   \_ qmail-clean
root     13586  0.0  0.0  11264   896 pts/1    S+   18:18   0:00                      \_ grep qmai

⇒ qmail起動しているかどうかログで確認することも出来ます。
# tail /var/log/maillog
2012-04-23T18:16:02.453423+09:00 localhost qmail: 1335172562.453189 status: local 0/10 remote 0/20
2012-04-23T18:16:02.454523+09:00 localhost qmail: 1335172562.453466 new msg 133875756

tcpserverでqmail-smtpdを起動する設定(インストール編)

qmail-smtpdはスーパーデーモン管理下に置き、外部からの接続要求をスーパーデーモンが受けてから起動されるように設定します。スーパーデーモンとしてtcpserverを使用します。tcpserverを使用するためにはucspi-tcpパッケージをインストールする必要があります。

tcpserverでqmail-smtpdを起動する設定(設定編)

tcpserverをスーパーデーモンとして起動する場合、アプリケーションプログラムへの接続を制限するルールを作成することが出来ます。ルールはテキストファイルで1行に1ルールを記載して作成します。作成したテキストファイルからcdbというデータベース形式へ変換し、tcpserver起動コマンドの引数としてcdbデータベースパスを指定することでルールが適用されます。

⇒ ルールファイル用のディレクトリを作成します。
# mkdir /var/qmail/rules

# cd /var/qmail/rules/

⇒ ルール定義のテキストファイルを作成します。
  ファイル名はtcp[udp].[protocol]とします。
# vi tcp.smtp
127.0.0.1:allow,RELAYCLIENT=""

# cat tcp.smtp | tcprules tcp.smtp.cdb tcp.smtp

# ls -l
合計 4
-rw-r--r-- 1 root root 2048  4月 28 18:59 tcp.smtp.cdb

⇒ ルールデータベースのチェック
# tcprulescheck tcp.smtp.cdb
default:
allow connection

起動スクリプト作成

現状では/var/qmail/rcもtcpserverも手動で起動しなければならず、サーバを再起動した場合などに不便です。そこでOS起動時に込みこまれる自動起動スクリプトを作成します。qmailの起動スクリプトでは2つのプロセスを起動する必要があります。1つ目はqmail-sendプロセスであり、/var/qmail/rcスクリプトをバッググラウンドプロセスとして実行することで起動します。2つ目はtcpserverをスーパーデーモンとするqmail-smtpdプロセスであり、tcpserverの引数としてqmail-smtpdを指定することでTCP25番ポートへのアクセス要求をtcpserverが受け、qmail-smtpdを起動します。

急ごしらえですが、自前の起動スクリプトです。

#!/bin/bash
# This script is auto start of qmail.
# chkconfig: 345 99 01
# description: qmail is a Mail Transport Agent,which is the program
# that moves mail from one machine to another.


# Source function library.
. /etc/init.d/functions

PATH=/sbin:/bin:/usr/sbin:/usr/bin
QMAIL_SEND_PATH="/var/qmail/bin/qmail-send"
QMAIL_SMTP_PATH="/var/qmail/bin/qmail-smtpd"
QMAIL_SEND=`basename ${QMAIL_SEND_PATH}`
QMAIL_SMTP=`basename ${QMAIL_SMTP_PATH}`

START(){
    echo -n "Starting qmail..."

    if [ -f /var/qmail/run/qmail ]; then
        echo "Always qmail is started or Exist /var/qmail/run/qmail"
        exit 99
    fi


    csh -cf '/var/qmail/rc &' > /dev/null 2>&1 ; ERROR1=$?

    /usr/local/bin/tcpserver -p -x /var/qmail/rules/tcp.smtp.cdb \
      -u 5003 -g 5003 0 smtp /var/qmail/bin/qmail-smtpd & > /dev/null 2>&1 ; ERROR2=$?

    if [ $ERROR1 -eq 0 -a $ERROR2 -eq 0 ] ; then
        ps -aefw | grep "qmail-send" | grep -v "grep" | awk '{print $2}' >> /var/qmail/run/qmail
        ps -aefw | grep "qmail-smtpd" | grep -v "grep" | awk '{print $2}' >> /var/qmail/run/qmail
        echo "OK"
    else
        rm -f /var/qmail/run/qmail > /dev/null 2>&1
        echo "NG"
    fi
}

STOP(){
    echo -n "Stopping qmail..."

    if [ ! -f /var/qmail/run/qmail ]; then
        echo "Always qmail is stopped or Not Exist /var/qmail/run/qmail"
    fi

    while read PID;
    do
        kill -9 ${PID} > /dev/null 2>&1
    done < /var/qmail/run/qmail

    rm -f /var/qmail/run/qmail
    echo "OK"
}

STATUS(){
    status $QMAIL_SEND
}

case "$1" in
    start)
        START
        ;;
    stop)
        STOP
        ;;
    restart)
        STOP
        START
        ;;
    status)
        STATUS
        ;;
esac

実行可能スクリプトとして実行権限を付与します。

# chmod 755 /etc/init.d/qmail

# ls -l /etc/init.d/qmail
-rwxr-xr-x 1 root root 782  4月 29 18:28 /etc/init.d/qmail

自動起動設定を行います。

# chkconfig --add qmail

# chkconfig --list | grep "qmail"
qmail           0:off   1:off   2:off   3:on    4:on    5:on    6:off

qmail起動とテストメール

起動スクリプト作成したことですし、serviceコマンドを使ってqmailデーモンを起動したいと思います。
まずは起動です。

# service qmail start
Starting qmail...OK

# service qmail status
qmail-send (pid 3134) を実行中...

# ps auxf | grep "qmail"
root      9784  0.0  0.0  11264   904 pts/2    S+   22:38   0:00                      \_ grep qmail
qmails    3134  0.0  0.0   3844   460 pts/2    S    22:37   0:00 qmail-send
qmaill    3141  0.0  0.0   3800   548 pts/2    S    22:37   0:00  \_ splogger qmail
root      3142  0.0  0.0   3804   400 pts/2    S    22:37   0:00  \_ qmail-lspawn ./Maildir/
qmailr    3143  0.0  0.0   3804   404 pts/2    S    22:37   0:00  \_ qmail-rspawn
qmailq    3144  0.0  0.0   3792   408 pts/2    S    22:37   0:00  \_ qmail-clean
qmaild    3136  0.0  0.0   5916   580 pts/2    S    22:37   0:00 /usr/local/bin/tcpserver -p -x /var/qmail/rules/tcp.smtp.cdb -u 5003 -g 5003 0 smtp /var/qmail/bin/qmail-smtpd

無事起動できました。
続いてテストメールを送信したいと思います。まずはローカルメール配送を実施します。

# echo "TestMail-$(date +%Y%m%d)" | mail -s "test" pachi

# ls -l /home/pachi/Maildir/new/
-rw------- 1 pachi pachi  340  5月  4 22:41 1336138918.50538.pachi01.maepachi.com

# cat /home/pachi/Maildir/new/1336138918.50538.pachi01.maepachi.com
Return-Path: <root@pachi01.maepachi.com>
Delivered-To: pachi@pachi01.maepachi.com
Received: (qmail 50530 invoked by uid 0); 4 May 2012 22:41:58 +0900
Date: 4 May 2012 22:41:58 +0900
Message-ID: <20120504134158.50529.qmail@pachi01.maepachi.com>
From: root@pachi01.maepachi.com
To: pachi@pachi01.maepachi.com
Subject: test

TestMail-20120504

うまくローカル配送できました。続いて、外部へのメール送信を実施します。
gmailアカウントを使用して送受信テストを行いましたが問題ありませんでした。