qmail 1.0 + vpopmail 5.4 インストールメモ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # 特徴 #--------------------------------------------------------------------------------------------- qmail はSMTP サーバー、POP サーバーを同封するメールサーバーのALL-IN-ONE パッケージです。qmail 単体では単一ドメインのみ利用でき、仮想ドメインでの運用には対応していません。また、POP サーバーについても、認証機能が付加していないなど、そのままでは実用的には使えません。そこで、これの問題を解決するためにvpopmail を利用します。 vpopmail はqmail に仮想ドメイン管理に関わる機能を補助するためのパッケージです。その機能の大部分はqmail を補う形で実装されますが、メールボックスへの配送部分にassigin ファイルを利用するなどqmail の仕組みを一部利用して実装されるものもあります。 ※ qmail のPOP 認証をシステムユーザーで行う場合はcheckpassword ユーティリティーを用います # インストール方法 #--------------------------------------------------------------------------------------------- + tcpserver のインストール +--------------------------------------------------------------------------------------------- SMTP プログラム、およびPOP プログラムは通常スーパーサーバーより起動されます。qmail では詳細なアクセス制御が可能なtcpserver をスーパーサーバーとして利用します。次の手順でtcpserver をインストールしてください。 # su root # cd /usr/local/src # wget ucspi-tcp-0.88.tar.gz # wget ucspi-tcp-0.88-periplimit.7.patch # wget ucspi-tcp-0.88-errno.patch # tar zxvf ucspi-tcp-0.8.8.tar.gz # cd ./ucspi-tcp-0.80 # patch -s < ../ucspi-tcp-0.88-periplimit.7.patch # patch -s < ../ucspi-tcp-0.88-errno.patch ※ パッチについて ※ ucspi-tcp-0.88-periplimit.7.patch | 「-s」オプションで指定された数でIP ごとに接続数制限を実施 | します # vi conf-qhome 編集 → 1行目を/usr/local/ucspi-tcp に書き換えます # make # make setup + vpopmail のインストール +--------------------------------------------------------------------------------------------- vpopmail 専用のユーザー/グループを作成します。専用のユーザーはホームディレクトリを設定し、ログインする必要もないので、シェルを無効としてください。 # groupadd vchkpw # useradd -g vchkpw -d /usr/local/vpopmail -s /bin/false vpopmail ※ ホームディレクトリはインストールの際にインストール先ディレクトリとして参照されるので必ず設定います。 vpopmail のソースをインターネットよりダウンロードします。 # su root # cd /usr/local/src # wget vpopmail-5.4.0.tar.gz # tar zxvf vpopmail-5.4.0.tar.gz configure の際、エラーが起きないように次の作業を行います。 # mkdir /usr/local/vpopmail # mkdir /usr/local/vpopmail/etc # touch /usr/local/vpopmail/etc/tcp-smtp vpopmail を解凍後、ディレクトリに入りインストール作業を行います。 # cd ./vpopmail-5.4.0 # ./configure --prefix=/usr/local/vpopmail --enable-qmaildir=/usr/local/qmail \ --enable-clear-passwd=y --enable-domainquotas=y --enable-qmail-ext=n \ --enable-roaming-users=y --enable-relay-clear-minutes=15 \ --enable-tcpserver-file=/usr/local/vpopmail/etc/tcp-smtp \ --enable-tcprules-prog=/usr/local/ucspi-tcp/bin/tcprules ※ configure について ※ --enable-qmaildir | qmail のインストール先ディレクトリを指定します --enable-clear-passwd | パスワードを平文で記憶します | CRAM-MD5、APOP 認証を行う場合は必ず「y」とします --enalbe-domainquotas | 仮想ドメイン単位のソフトクォータを有効にします --enable-qmail-ext | 拡張アドレスを仮想アカウントで利用可能とします --enable-roaming-users | POP Before SMTP を有効にします --enable-tcpserver-file | POP Before SMTP を利用するためにtcpserver のアクセス制御ファイル | tcp-smtp の場所を指定します --enable-tcprules-prog | POP Before SMTP を利用するためにtcpserver のtcprules プログラムの | 場所を指定します # make # make install + qmail のインストール +--------------------------------------------------------------------------------------------- qmail 専用のユーザー/グループを作成します。専用のユーザーはホームディレクトリをなしとし、ログインする必要もないので、シェルを無効としてください。 # groupadd qmail # groupadd nofiles # useradd -g nofiles -d /usr/local/qmail/alias -s /bin/false alias # useradd -g nofiles -d /usr/local/qmail -s /bin/false qmaild # useradd -g nofiles -d /usr/local/qmail -s /bin/false qmaill # useradd -g nofiles -d /usr/local/qmail -s /bin/false qmailp # useradd -g qmail -d /usr/local/qmail -s /bin/false qmailq # useradd -g qmail -d /usr/local/qmail -s /bin/false qmailr # useradd -g qmail -d /usr/local/qmail -s /bin/false qmails qmail のソース、およびパッチ、その他必要なソースをインターネットよりダウンロードします。 # su root # cd /usr/local/src # wget qmail-1.03.tar.gz # wget qmail-date-localtime.patch # wget qmail-103.patch # wget qmail-smtpd-relay-reject.patch # wget qmail-errno.patch # wget chkuser-2.0.9-release.patch # wget qmail-tarpit.patch # tar zxvf qmail-1.03.tar.gz qmail を解凍した後、ダウンロードしたパッチをあてます。また、qmail のインストール先を変更するため、一部のファイルを修正します。 # cd ./qmail-1.03 # patch -s < ../qmail-date-localtime.patch # patch -s < ../qmail-smtpd-relay-reject.patch # patch -s < ../qmail-large-dns.patch # patch -s < ../qmail-errno.patch # patch -s < ../chkuser-2.0.9-release.patch # patch -s < ../qmail-tarpit.patch # patch -s < ../vpopmail-5.4.0/contrib/qmail-maildir++.patch ※ パッチについて ※ qmail-date-localtime.patch | Recieved フィールド、又はDate フィールドの時間をローカルタイ | ム表記にします qmail-smtpd-relay-reject.patch | メールアドレスの@ の前(ユーザ名部分) に@ と% と! があった場 | 合に転送エラーとします qmail-large-dns.patch | DNS に関するUDP パケットが512 バイトを超えると処理できなくな | る問題に対処します qmail-maildir++.patch | qmail-pop3d がMaildir++ に対応していない問題に対処します chkuser-2.0.9-release.patch | SMTP セッション中にユーザー有無を調査し、存在しなければ切断 | します qmail-tarpit.patch | SMTP セッション中のRCPT TO の応答を遅延させます # vi conf-qmail 編集 → 1行目を/usr/local/qmail に書き換えます # make # make setup # ./config qmail を利用するにはqmail のqmail-startd を起動させるスクリプトを用意します。これはqmail にすでに用意してあるのでこれを利用します。 # cd /usr/local/qmail # cp ./boot/home ./rc # chmod 700 ./rc # vi rc 編集 → qmail-start ./Maildir/ splogger qmail 以上でqmail + vpopmail のメール環境の構築は終わりました。しかし、qmail の起動スクリプトがソースに付属されていないので下記を利用します。 ↓ /etc/rc.d/init.d/qmail ---------------------------------- #!/bin/sh # # qmail vpopmail 対応qmail 起動スクリプト # # chkconfig: 345 80 30 # description: mail server daemon # # config: /usr/local/qmail/controls/ # . /etc/rc.d/init.d/functions QMAILPATH=/usr/local/qmail VPOPMAILPATH=/usr/local/vpopmail 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 $VPOPMAILPATH/etc/tcp-smtp.cdb \ 0 25 \ $QMAILPATH/bin/qmail-smtpd 2>&1 | \ $QMAILPATH/bin/splogger smtpd 3 & # POP3 起動 # 1. -H -R にてリモート先に関する情報を集めない # 2. -v にてログを詳細に出力 # /usr/local/ucspi-tcp/bin/tcpserver -H -R \ 0 110 \ $QMAILPATH/bin/qmail-popup ns.tiwata.mirai.ad.jp \ $VPOPMAILPATH/bin/vchkpw \ $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 ↑ ココまで ------------------------------------------------ # chmod 755 /etc/rc.d/init.d/qmail # 起動方法 #--------------------------------------------------------------------------------------------- 以上でqmail の設定が全て終わりました。起動スクリプトを実行することによりqmail が起動されます。 起動方法 : /etc/rc.d/init.d/qmail start 停止方法 : /etc/rc.d/init.d/qmail stop # 最も基本的な設定 #--------------------------------------------------------------------------------------------- qmail を利用する上での設定は/usr/local/qmail/control ディレクトリ配下のファイルに対して行います。 me ファイル 自サーバーのホスト名をFQDN 形式で設定します locals ファイル 自サーバーで受け取るドメインを指定します rcpthosts ファイル 配送されてきたメールのうち、自サーバーで受け取るべきドメインを指定します SMTP サーバーは誰でも利用できてよいものではありません。そこで、qmail-smtpd を起動するtcpserver によるアクセス制御を利用します。まずは下記のファイルを作成してください。下記の設定では、127.0.0.1 から送信されたメールについてはRELAYCLIENT がセットされるので、qmail-smtpd は無条件に外部へ中継配送します。 ↓ /usr/local/vpopmail/etc/tcp-smtp ------------------------ 127.0.0.1:allow,RELAYCLIENT="" :allow ↑ ココまで ------------------------------------------------ # cd /usr/local/vpopmail/etc # /usr/local/ucspi-tcp/bin/tcprules tcp-smtp.cdb tcp-smtp.tmp < tcp-smtp 上記tcp-smtp.cdb ファイルをqmail-smtpd を起動するtcpserver の「-x」オプションで指定することでSMTP 接続時のアクセス制御が行われます。 # エイリアス #--------------------------------------------------------------------------------------------- qmail のエイリアスは自サーバーが管理するドメインに属するアカウントの別名を指定し、/usr/local/qmail/alias ディレクトリ以下に設定します。別名で受け取ったメールをその場で受け取ったり、別のアカウントに転送したり自由に設定することができます。 自ドメインがexample01.jp としてtest01@example01.jp 宛のメールをtest02@example01.jp に転送する場合は次のように設定します。 # vi .qmail-test01 追加 → &test01@example01.jp 自ドメインがexample01.jp としてroot@example01 宛のメールをその場で受け取る場合は次のように設定します。 # vi .qmail-root 追加 → ./Mailbox 別名ユーザーへの配送はalias ユーザーで行われます。そのため、その場で受け取るということは、alias ユーザー宛のメールとして受け取るということになり、上記root@example01.jp 宛のメールはalias ユーザーホームディレクトリ直下のMailbox ファイルに記憶されることになります。 # 仮想ドメイン、仮想ユーザー #--------------------------------------------------------------------------------------------- qmail はrecpthosts ファイルで指定されたドメイン宛のメールを自身が受け取るものとして判断し、システムユーザーのメールボックスに配送します。 example01.jp が既にqmail で設定されており、example02.jp を仮想ドメインとして追加する場合、受信するためにrcpthosts ファイルにexample02.jp を追加します。 しかし、この場合、example01.jp とexample02.jp の配送ユーザーは共有することとなるのでexample02.jp をvpopmail にて下記のように仮想ドメインとして定義します。 # /usr/local/vpopmail/bin/vadddomain example02.jp 上記のようにvpopmail でドメインを管理した場合、配送ユーザーについては仮想ユーザー扱いとなり、システムユーザーとしては作成しません。実際は、/usr/local/vpopmail/domains/example02.jp に配送ユーザーvpopmail 権限で配送されます。 例えば仮想ユーザーtest01 は次のように作成します。作成後、仮想ユーザーのメールボックスは/usr/local/vpopmail/domains/example02.jp/test01 に作成されているはずです。 # /usr/local/vpopmail/bin/vadduser test01@example02.jp # ソフトクォータ #--------------------------------------------------------------------------------------------- ソフトクォータはqmail 単体での実装ではなく、vpopmail による拡張的な実装です。バージョン5.1.1 から、maildrop などのcourier 製品で使われているMaildir++ 仕様がvpopmail に組み込まれたことで実現されました。vpopmail が実装するソフトクォータはドメインクォータとアカウントクォータがあります。 、前者についてはコンパイル時特に指定なく利用できますが、後者についてはコンパイル時に「--enable-domainquotas=y」のような指定がいります。 + アカウントクォータ +--------------------------------------------------------------------------------------------- アカウントクォータはコンパイル時に特別なオプションを指定することなく利用できます。 アカウントクォータはvmoduser -q コマンドにて設定し、指定方法は最大サイズと最大メッセージ数の2種類の制限が可能となっています。 # vmoduser -q test01@example01.jp 1024S test01@example01.jp に対して最大1Kbyte のサイズ制限を設定します # vmoduser -q test01@example01.jp 1024S, 100C test01@example01.jp に対して最大1Kbyte のサイズ制限と最大100メッセージ制限を設定します vmoduser -q コマンドにてクォータの制限を行った後、そのアカウントにメールが着信した時に初めてクォータが有効となります。クォータはMaildir++ の仕様に沿って、/usr/local/vpopmail/domains/example01.jp/test01/Maildir/maildirsize ファイルで管理されます。 アカウントクォータでは、アカウントの容量が90% ほどになった際にアカウントに警告メッセージを送ることができます。幸い、文例がソースに用意されているので、それを所定の場所にコピーして利用します。 # cp /usr/local/src/vpopmail-5.4.0/quotawarn.msg /usr/local/vpopmail/domains/.quotawarn.msg + ドメインクォータ +--------------------------------------------------------------------------------------------- ドメインクォータを実現するには、システムクォータを使う方法、ソフトクォータを使う方法の2つが用意されています。 ● システムクォータを使う qmail がメールを受け取りvpopmail がそれを配送する際、実際の配送ユーザーはvpopmail となります。つまり、vpopmail が管理するユーザー情報とは、仮想ユーザーであり、システムユーザーをアカウントとして管理していません。 これを、ドメインごとにシステムユーザーを割当て、実際のクォータはlinux システムに任せることでドメインクォータを行う仕組みが用意されています。ドメインごとにシステムユーザーを割り当てる場合次のコマンドを使います。 # /usr/local/vpopmail/bin/vadddomain -u mlmaster-example01 example01.jp システムユーザーmlmaster-example01 をexmple01.jp ドメインの配送ユーザーとします 上記のようにexample01.jp を作成することで、vpopmail はvpopmail ユーザーではなく、mlmaster-example01 ユーザーでメールを配送しようとします。 ● ソフトクォータを使う ドメインクォータをソフトクォータで実現する場合、コンパイル時に「--enable-domainquotas=y」オプションを指定します。 ソフトクォータはvmoddomainlimits コマンドにて設定し、指定方法は最大サイズと最大メッセージ数などの制限が可能となっています。 # vmoddomainlimits -q 1024 -M 100 example01.jp example01.jp に対して最大1Kbyte のサイズ制限と最大100メッセージ制限を設定します 設定したクォータ値は/usr/local/vpopmail/domains/example01.jp/.qmailadmin-limits ファイルで管理され、そのドメインのアカウントにメールが着信した時に初めてクォータが有効となります。 ※ 注意 ) システムクォータ とvpopmail によるソフトクォータの相互関係について、ソフトクォータのクォータ値更新処理がシステムクォータの容量制限で拒否される可能性があるため、同居はできません。 ドメインクォータ制限に引っかかった場合は送信者宛に「domain is over quota」のメールが送信され、アカウントクォータ制限に引っかかった場合は送信者宛に「user is over quota」のメールが送信されます。 ソフトクォータは、vdelivermail プログラム(.qmail-default に記載されています) 経由でメールが配送された場合のみ有効となります。配送エージェントをmaildrop などに切り替えた場合は有効となりません。 qmail-pop3d でPOP され、サーバー上から削除されたメールについての容量はソフトクォータに反映されません。また、例えば.qmail-[ユーザー] など、qmail 拡張アドレスの仕組みから配送されたメールについても.qmail-default を経由しないためソフトクォータに反映されません。これを防ぐためにqmail をコンパイルする前に、vpopmail 付属の qmail-maildir++.patch をqmail に当ててください。 # POP Before SMTP #--------------------------------------------------------------------------------------------- POP Before SMTP を行う場合は、vpopmail が「--enable-roaming-users=y」オプション付きでコンパイルされている必要があります。以降、vpopmail が次のオプションでコンパイルされたものとして説明します。 --enable-relay-clear-minutes=15 --enable-tcpserver-file=/usr/local/vpopmail/etc/tcp-smtp --enable-tcprules-prog=/usr/local/ucspi-tcp/bin/tcprules POP Before SMTP は、qmail、vpopmail、tcpserver による連携によって実現されます。それぞれがどのようにPOP Before SMTP に対して影響してくるかは、それぞれの役割を知ることで理解できると思います。 + vpopmail の役割 +--------------------------------------------------------------------------------------------- vpopmail のPOP 認証プログラムvchkpw は、POP したクライアントのIP アドレスを/usr/local/vpopmail/open-smtp ファイルに記憶します。その後、直ちに同場所のtcp-smtp ファイルとopen-smtp ファイルがマージされ、tcprules プログラムによってtcp-smtp.cdb ファイルが作成されます。 ※ /usr/local/vpopmail の場所は「--enable-tcpserver-file」で指示されたファイルがある場所です ※ tcprules プログラムは「--enable-tcprules-prog」で指示されたプログラムです + tcpserver の役割 +--------------------------------------------------------------------------------------------- tcpserver でqmail-smtpd を起動すると、ポート25 の監視はtcpserver が行います。tcpserver が「-x /usr/local/vpopmail/etc/tcp-smtp.cdb」と起動されたとき、IP ベースのアクセス制御をtcp-smtp.cdb ファイルにて行います。 tcp-smtp ファイルの中身が例えば「192.168.100.2:allow,RELAYCLIENT=""」であった場合、192.168.100.2 からのアクセスを許可し、環境変数RELAYCLIENT をセットします。 ※ 「-x」オプションで指定するファイルはvpopmail が作成するtcp-smtp.cdb を指定します + qmail の役割 +--------------------------------------------------------------------------------------------- qmail-smtpd は外部から着信したメールを処理します。着信メールを中継するか否かはrcpthosts ファイルを参照しますが、通常POP Before SMTP 環境下ではrcpthosts よりもむしろ、環境変数RELAYCLIENT の有無が中継の可否に大きく影響します。qmail-smtpd は環境変数RELAYCLIENT がセットされているクライアント、および、rcpthosts に記載のあるドメインへのメールについてのみ中継します。 # APOP #--------------------------------------------------------------------------------------------- vpopmail はAPOP にディフォルトで対応しており、vadddomain やvadduser にてドメインまたは、アカウントを生成する際に明視的にAPOP 対応オプションなどをつける必要はありません。 ただ、ひとつ気をつけるべき点は、メールサーバーをAPOP に対応する際は「--enable-clear-passwd=y 」オプションをつけてコンパイルしてください。 # qmail の動作に関わる備忘録 #--------------------------------------------------------------------------------------------- ● qmail-local の仕事 ・ メールの最初にReturn-Path とDelivered-To 行を付ける ・ ローカル配送エージェントとしてメールボックスにメールを配送する ● qmail-remote の仕事 ・ 宛先から経路の決定する(smtproutes があれば参照する) ・ MX レコードの検索と送り先を決定する(DNS のキャッシュが有効) ・ 送り先へのTCP 接続する(並列接続の効用) ・ SMTP でメイル配送する ● qmail-smtpd の仕事 ・ Received または Delivered-To ヘッダーが100 以上あるようなメールは受信を拒絶する ※ いわゆるホップ数制御。通常.qmail 等による転送ループは Delivered-To ヘッダをカウントすること で検出できるがqmail の設定ミスなどによる静的配送ループなどはホップ数制御でしか防げない。 ・ SMTP の改行(CR LF) をUNIX の改行(LF) に変換するが、LF が単独で現れた場合は一時エラーとして 接続を切る ● メール配送多重度を設定 ローカル宛の配送多重度を制御するには concurrencylocal 制御ファイルに多重度(数) を記述します。 リモート宛の配送多重度を制御するには concurrencyremote 制御ファイルに多重度(数) を記述します。 qmail を通常にコンパイルした時点で、設定できる最大多重度は120 と決定されている。しかし、ソース conf-spawn を変更すれば多重度の上限を上げることが出来ます。 ● キューの操作 キューのチェックを行う # /usr/local/qmail/bin/qmail-qread | grep -v done キュー内のメッセージを即座に配信する # kill -ALRM qmail-send の PID キュー内の個数を確認する # /usr/local/qmail/bin/qmail-qstat ● 再配送間隔 sendmail では一時エラーを受け取ったメールの再配送時間をCF ファイルにて設定できますが、qmail にはそのような設定はありません。qmail では、再配送時間は7 分、10 分、15 分と再配送する度に乗数的に増えていき、最終的にqueuelifetime に達した場合バウンスする仕組みとなっています。 ● キューに滞在できる時間 queuelifetime 制御ファイルに滞在時間を秒単位で記述します。qmail は一時的に配送できなかったメー ルをキューに貯め、一定時間の後に再送する。が、キューに保存されたときからqueuelifetime 時間経っ てしまったメールに関しては即座にバウンスします。 ● 容量オーバーによるバウンス > MDA にqmail-local を用いてローカル配送している場合 > システムクォータによる容量制限に引っかかった場合 直ちに送信者にバウンスメールが返信される。ただし、容量制限でメールが送れなかった理由までは メールに言及されない。 > maildropdir によるソフト容量制限に引っかかった場合 直ちに送信者にバウンスメールが返信される。このとき、容量制限でメールが送れなかった理由も メールに言及される。 > MDA にmaildrop などの外部MDA を用いてローカル配送している場合 > システムクォータによる容量制限に引っかかった場合 maildrop が一時配送エラーと判断しqmail-queue にメールを渡す > maildropdir によるソフト容量制限に引っかかった場合 直ちに送信者にバウンスメールが返信される。このとき、容量制限でメールが送れなかった理由も メールに言及される。 MDA にmaildrop などの外部MDA を用いており、システムクォータによる容量制限を行っていた場合は容量オーバー時には一時配送エラーとなります。これを回避するには、.qmail ファイル内でmaildrop を呼んでいる箇所を下記のように変更すべきです。 | /usr/local/qmail/bin/preline /usr/local/maildrop/bin/maildrop /home/maild/[FTP-ID]/domains/[ドメイン]/[アカウント]/.mailfilter || /usr/local/qmail/bin/bouncesaying 'disk write error.'