qmail-1.03 インストールメモ #--------------------------------------------------------------------------------------------- # qmail 概要 #--------------------------------------------------------------------------------------------- qmail は高速、安定したメールサービスを提供するためのパッケージです。sendmail に比べ、設定が容易である点、設計が簡素であるため問題の切り分けもし易く近年急速に復旧しています。 このドキュメントでは、qmail をシステムユーザーで運用する方法をご紹介します。単純にサーバーを一つのドメインで専有し、メールサーバーを運用する際に利用する際にご覧ください。 #--------------------------------------------------------------------------------------------- # 構築するシステム概要 #--------------------------------------------------------------------------------------------- test.com : サーバードメイン名 test : linux システムユーザー test@test.com : メールアドレス 上記の場合、test@test.com にメールを送信すると、linux システム上のtest ユーザーのホームディレクトリ配下にメールが配送されます。 #--------------------------------------------------------------------------------------------- # インストール方法 #--------------------------------------------------------------------------------------------- qmail のソース、およびパッチ、その他必要なソースをインターネットよりダウンロードします。 # su root # cd /usr/local/src # wget qmail-1.03.tar.gz # wget ucspi-tcp-0.88.tar.gz # wget checkpassword-0.90.tar.gz # wget qmail-date-localtime.patch # wget qmail-103.patch # wget qmail-smtpd-relay-reject.patch # wget ucspi-tcp-0.88-periplimit.7.patch ※ パッチの説明 ※ ・qmail-date-localtime.patch MTA が付けるRecieved フィールド、又はMTA がMTU となった時に付けるDate フィールドの時間をローカルタイム表記にします。 ・qmail-smtpd-relay-reject.patch メールアドレスの@ の前(ユーザ名部分) に@ と% と! があった場合に転送エラーとします。 ・qmail-103.patch DNS に関するUDP パケットが512 バイトを超えると処理できなくなる問題を対処します。 ・ucspi-tcp-0.88-periplimit.7.patch IP ごとに接続数制限を実施します。特に設定ファイルがあるわけでもなく、tcpserver の-s オプションにより接続数を指定します。 続けて、qmail のインストール先ディレクトリ、およびグループ・ユーザーを作成します。 # mkdir /usr/local/qmail # groupadd qmail # groupadd nofiles # useradd -g nofiles -d /usr/local/qmail/alias -s /bin/nologin alias # useradd -g nofiles -d /usr/local/qmail -s /bin/nologin qmaild # useradd -g nofiles -d /usr/local/qmail -s /bin/nologin qmaill # useradd -g nofiles -d /usr/local/qmail -s /bin/nologin qmailp # useradd -g qmail -d /usr/local/qmail -s /bin/nologin qmailq # useradd -g qmail -d /usr/local/qmail -s /bin/nologin qmailr # useradd -g qmail -d /usr/local/qmail -s /bin/nologin qmails qmail ソースを解凍した後、ダウンロードしたパッチをあてます。また、qmail のインストール先を変更するため、一部のファイルを修正します。 # cd /usr/local/src # tar zxvf qmail-1.03.tar.gz # cd ./qmail-1.03 # patch -s < ../qmail-date-localtime.patch # patch -s < ../qmail-smtpd-relay-reject.patch # patch -s < ../qmail-103.patch # vi conf-qmail # 1 行目 : qmail のインストール先を/usr/local/qmail にする # make # make setup # make check # ./config ←/usr/local/qmail/control 以下の設定ファイル群を作成 メールサーバーのPOP プログラム(qmail-pop3d) は通常スーパーサーバーより起動されます。qmail では詳細なアクセス制御が可能なtcpserver をスーパーサーバーとして利用します。tcpserver をインストールしてください。必要に応じて、IP ごと接続数制限パッチを当てます。 # cd /usr/local/src # tar zxvf ucspi-tcp-0.8.8.tar.gz # cd ./ucspi-tcp-0.80 # patch -s < ../ucspi-tcp-0.88-periplimit.7.patch # make # make setup # make check さらに、POP プログラム(qmail-pop3d) ではlinux システムユーザーを認証する機構が用意されていないため、linux システムユーザの認証を行うcheckpassword プログラムをインストールします。 # cd /usr/local/src # tar zxvf checkpassword-0.90.tar.gz # vi conf-home # 1 行目 : checkpassword のインストール先を/usr/local/qmail にする # make # make setup 上記手順が正常に行われれば、以下の環境が作成されます。 qmail 本体 :/usr/local/qmail/ 以下にインストール checkpassword 認証プログラム :/usr/local/qmail/bin/ 以下にインストール tcpserver スーパーサーバー :/usr/local/ucspi-tcp/ 以下にインストール #--------------------------------------------------------------------------------------------- # qmail の設定 #--------------------------------------------------------------------------------------------- qmail のインストールはできましたが、実際qmail が受信するドメインは何処で設定するのでしょうか?また、メールサーバーの不正対策はどうなっているのでしょうか?その答えはqmail の設定ファイルにあります。 /usr/local/qmail/control 配下にはqmail の設定ファイルが置かれており、これらのファイルを元に、qmailの動作が決定されるのです。以下、/usr/local/qmail/control 配下に置くqmail の設定ファイルに関して説明します。 ● locals ファイル(受信側の設定) qmail で受信するドメインはlocals に記載します。locals ファイルに記載したドメイン、またはホストが含まれるメールアドレスに関してはローカル配送されます。 下記の例では、xxxx@localhost、xxxx@test.com、xxxx@ns 宛のメールに関してはローカル配送します。 例 ) ------------------------------------------------------------ localhost test.co.jp ns ------------------------------------------------------------ ● rcpthosts ファイル(送信側の設定) qmail はrcphosts の定義に従ってメール送信するか否かの判断が行われます。これは主にメール中継をする際の定義を記述します。 下記の例では、xxxx@localhost、xxxx@test.com、xxxx@ns 宛に送信するメールは中継、もしくはローカル配送されます。 例 ) ------------------------------------------------------------ localhost test.co.jp ns ------------------------------------------------------------ ● me ファイル(メールサーバー自体の設定) 自身のドメインを記述します。シェルスクリプトやCGI などで、サーバー内部からメールを送信する場合、補完されるドメインを記載します。 また、サーバー内部からの root 宛メールなどは me ファイルの内容に従って、root@[me ファイル記載のドメイン] 宛のメールと解釈され、/usr/local/qmail/alias/.qmail-root 定義に沿ってメール配送されます。 下記の例では、サーバー内部から xxxx 宛にメール送信した場合、実際はxxxx@test.com 宛にメールが送信されます。 例 ) ------------------------------------------------------------ test.com ------------------------------------------------------------ #--------------------------------------------------------------------------------------------- # メールアカウントの作成 #--------------------------------------------------------------------------------------------- qmail はディフォルトで各linux システムユーザーのホームディレクトリ配下のMaildir 形式のメールボックスにメールを配送します。つまり、linux システムユーザーがそのままメールアカウントとして利用できます。 まずはメールを受信するためにメールアカウント(linux システムユーザー) を作成します。 # useradd -d /home/test -s /bin/bash test 次に、test メールアカウントのメールボックスを作成します。test メールアカウントのメールボックスを作成するので、test ユーザーで次のコマンドを実行します。 # su test # cd ~ # /usr/local/qmail/bin/maildirmake ./Maildir # echo './Maildir/' > .qmail ※ 注意 ) .qmail ファイルはtest メールアカウントに配送する定義を記述します。このファイルが無い場合はメールは配送されません この時点で、test メールアカウントでメールが受信できる準備が整いました。 #--------------------------------------------------------------------------------------------- # 拡張メールアドレスの対応 #--------------------------------------------------------------------------------------------- qmail では各メールアカウントごとに拡張アドレスが利用できます。拡張アドレスはメールアカウント名の末尾に-xxxx を追加することで、実現できます。例えば、test メールアカウントでtest@test.com の他に、test-abc@test.com 宛のメールも受け取ることができます。 拡張メールアドレスを実現するには、qmail のアカウント管理ファイル(/usr/local/qmail/users/assign) に拡張メールアドレスを設定する必要があります。記述方法は、絶対的にマッチしたメールアカウントに対して拡張メールアドレスを適応する場合と、前方一致したメールアカウントに対して拡張メールアドレスを適応する場合の2 パターンあります。 ● 絶対的にマッチしたメールアカウントに対して拡張メールアドレスを適応する場合 =local:user:uid:gid:homedir:dash:ext: local : メールアカウント user : local メールアカウントを配送するユーザー名 uid : local メールアカウントを配送するUID gid : local メールアカウントを配送するGID 通常、local メールアカウントへのメールは、homedir/.qmail[dash][ext] により制御されます。 ※ 注意 ) 同じメールアカウントに対して幾つかの指定がある場合、最初の1 つを使用します 例 ) =test-extent:test:5000:10000:/home/test:-:extent: 上記定義では、test-extent@test.com 宛のメールは/home/test/.qmail-[extent] の定義に従って処理されます。 ● 前方一致したメールアカウントに対して拡張メールアドレスを適応する場合 +local:user:uid:gid:homedir:dash:ext: local : 前方一致するメールアカウント user : local メールアカウントを配送するユーザー名 uid : local メールアカウントを配送するUID gid : local メールアカウントを配送するGID 通常、****local メールアカウント(**** は任意文字列) へのメールはhomedir/.qmail[dash][ext] により制御されます。 例 ) +test:test:5000:10000:/home/test:-:extent: 上記定義では、test-abc1@test.com やtest-abc2@test.com などに送信するメールは/home/test/.qmail-[extent] の定義に従って処理されます。 #--------------------------------------------------------------------------------------------- # 接続元アクセス制限の設定 #--------------------------------------------------------------------------------------------- POP プログラムは基本的にスーパーサーバーであるtcpserver より起動されます。また、tcpserver では、接続元アクセス制限が行えることから、qmail と連動し、特定の接続元からのメール送信を外部中継させることができます。 ディフォルトで外部中継を許可するIP を記載するtcp-smtp を作成します。 # cd /usr/local/qmail # mkdir ./etc # cd ./etc # vi tcp-smtp 例 ) ------------------------------------------------------------ 100.100.100.100:allow,RELAYCLIENT="" 200.200.200.:allow,RELAYCLIENT="" :allow ------------------------------------------------------------ 上記設定では、100.100.100.100, 200.200.200.*** からの接続はSMTP 中継が強制的に許可され、それ以外のホストについては/usr/local/qmail/control/rcpthosts の設定により中継可否が決定されます。 ※ 注意 ) 最後の:allow を記述しないと、rcphosts の設定が無効となります。 次に作成したtcp-smtp をデータベース化します。 # /usr/local/ucspi-tcp/bin/tcprules tcp-smtp.cdb tcp-smtp.tmp < tcp-smtp これにより以降、POP されたと同時にtcp-smtp.cdb によりアクセス制限、および外部中継判断が行われます。 #--------------------------------------------------------------------------------------------- # 起動スクリプト作成 #--------------------------------------------------------------------------------------------- qmail を利用するにはqmail のqmail-startd を起動させるスクリプトを用意します。これはqmail にすでに用意してあるのでこれを利用します。なお、今回はMaildir 形式でqmail を利用するのでスクリプトを変更します。 # cd /usr/local/qmail # cp ./boot/home ./rc # chmod 700 ./rc # vi rc ↓ ココから ------------------------------------------------ #!/bin/sh # Using splogger to send the log through syslog. # Using qmail-local to deliver messages to ~/Mailbox by default. exec env - PATH="/var/qmail/bin:$PATH" \ qmail-start ./Maildir/ splogger qmail ~~~~~~~~~~ ← Maildir 形式に変更 ↑ ココまで ------------------------------------------------ 次に、qmail を実際起動するための起動スクリプトを用意します。 # cd /etc/rc.d/init.d/ # vi qmail ↓ ココから ------------------------------------------------ #!/bin/sh # # qmail vpopmail 未対応qmail 起動スクリプト # # chkconfig: 345 80 30 # description: Single Qmail Script # # config: /usr/local/qmail/controls/ # # 共通シェル関数を読み込む . /etc/rc.d/init.d/functions QMAILPATH=/usr/local/qmail TCPSERVERPATH=/usr/local/ucspi-tcp [ -f $QMAILPATH/rc ] || exit 0 case "$1" in start) echo -n $"Starting qmail: " sh $QMAILPATH/rc & # SMTP 起動 # 1. -H -R にてリモート先に関する情報を集めない # 2. -v にてログを詳細に出力 # $TCPSERVERPATH/bin/tcpserver -H -R -v \ -u `/usr/bin/id -u qmaild` -g `/usr/bin/id -g qmaild` \ -x $QMAILPATH/etc/tcp-smtp.cdb \ 0 25 \ $QMAILPATH/bin/qmail-smtpd 2>&1 | \ $QMAILPATH/bin/splogger smtpd 3 & # POP3 起動 # 1. -H -R にてリモート先に関する情報を集めない # 2. -v にてログを詳細に出力 # $TCPSERVERPATH/bin/tcpserver -H -R -v \ 0 110 \ $QMAILPATH/bin/qmail-popup test.com \ $QMAILPATH/bin/checkpassword \ $QMAILPATH/bin/qmail-pop3d Maildir 2>&1 | \ $QMAILPATH/bin/splogger pop3d 3 & echo touch /var/lock/subsys/qmail ;; stop) echo -n $"Shutting down qmail: " # POP3/SMTP 停止 PID1=`/bin/ps -ax | /bin/grep 'tcpserver.*0 [110|25].*' | /bin/awk '{print $ 1}'` # qmail 停止 PID2=`/bin/ps -aef | /bin/grep qmail | /bin/awk '{print $2}'` if [ "x$PID1" != "x" -a "x$PID2" != "x" ] ; then /bin/kill ${PID2} ${PID1} 1> /dev/null 2>&1 fi echo rm -f /var/lock/subsys/qmail ;; restart) $0 stop $0 start ;; *) echo "Usage: qmail {start|stop|restart}" exit 1 esac exit 0 ↑ ココまで ------------------------------------------------ #--------------------------------------------------------------------------------------------- # qmail の起動 #--------------------------------------------------------------------------------------------- 以上でqmail の設定が全て終わりました。下記のスクリプトを実行することによりqmail はtcpserver 経由で起動されます。 qmail 起動方法 : /etc/rc.d/init.d/qmail start qmail 停止方法 : /etc/rc.d/init.d/qmail stop