qmail 構築上の注意点 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # ▼ メールの正しい捨て方 -------------------------------------------------------------------- dot-qmail に「#」だけを書いておく。 存在しないアドレス宛のメールをバウンスさせるのをふせぐにはqmail-default に「#」だけを記述し、メールを捨てる必要があります。 # ▼ 容量オーバーによるバウンスの仕組み ------------------------------------------------------ > MDA にqmail-local を用いてローカル配送している場合 > システムquota による容量制限に引っかかった場合 直ちに送信者にバウンスメールが返信される。ただし、容量制限でメールが送れなかった理由ま ではメールに言及されない。 > maildropdir によるソフト容量制限に引っかかった場合 直ちに送信者にバウンスメールが返信される。このとき、容量制限でメールが送れなかった理由 もメールに言及される。 > MDA にmaildrop などの外部MDA を用いてローカル配送している場合 > システムquota による容量制限に引っかかった場合 maildrop が一時配送エラーと判断しqmail-queue にメールを渡す > maildropdir によるソフト容量制限に引っかかった場合 直ちに送信者にバウンスメールが返信される。このとき、容量制限でメールが送れなかった理由 もメールに言及される。 MDA にmaildrop などの外部MDA を用いており、システムquota による容量制限を行っていた場合は容量オーバー時には一時配送エラーとなる。これを回避するには、.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.' # ▼ キューに滞在できる時間を制御 ------------------------------------------------------------ queuelifetime 制御ファイルに滞在時間を秒単位で記述します。qmail は一時的に配送できなかったメー ルをキューに貯め、一定時間の後に再送する。が、キューに保存されたときからqueuelifetime 時間経っ てしまったメールに関しては即座にバウンスする。 # ▼ 再配送時間のナゾ ---------------------------------------------------------------------------------------------- sendmail では一時エラーを受け取ったメールの再配送時間をCF ファイルにて設定できるが、qmail には そのような設定はない。qmail では、再配送時間は7 分、10 分、15 分と再配送する度に乗数的に増え ていき、最終的にqueuelifetime に達した場合バウンスする仕組みとなっている。 # ▼ キューの操作 ---------------------------------------------------------------------------------------------- > キューのチェック /usr/local/qmail/bin/qmail-qread | grep -v done > キュー内のメッセージを即座に配信 kill -ALRM qmail-send の PID > キュー内の個数を確認 /usr/local/qmail/bin/qmail-qstat # ▼ メール配送多重度を制御 ---------------------------------------------------------------------------------------------- ローカル宛の配送多重度を制御するには concurrencylocal 制御ファイルに多重度(数) を記述します。 リモート宛の配送多重度を制御するには concurrencyremote 制御ファイルに多重度(数) を記述します。 qmail を通常にコンパイルした時点で、設定できる最大多重度は120 と決定されている。が、ソース conf-spawn を変更すれば多重度の上限を上げることが出来る。 # ▼ qmail-smtpd 仕事 ---------------------------------------------------------------------------------------------- 1. Received または Delivered-To ヘッダーが100 以上あるようなメールは受信を拒絶する。 2. SMTP の改行(CR LF) をUNIX の改行(LF) に変換する。 LF が単独で現れた場合は一時エラーとし、接 続を切る。 # ▼ qmail-remote の仕事 ---------------------------------------------------------------------------------------------- 1. 宛先から経路の決定する(smtproutes があれば参照する)。 2. MX レコードの検索と送り先の決定する(DNS のキャッシュが有効)。 3. 送り先へのTCP 接続する(並列接続の効用)。 4. SMTP でメイル配送する。 # ▼ qmail-local の仕事 ---------------------------------------------------------------------------------------------- メールの最初にReturn-Path とDelivered-To 行を付ける。qmail-local をMDA にしない場合はpreline プログラムがそれを行う。 # ▼ ローカル配送が完了したと判断するタイミング ---------------------------------------------------------------------------------------------- qmail ではメールボックスへの配送は「メールをディスクに書き終ってから」配送完了としているので、 停電があってもメールは失われません。 # ▼ 配信特徴 ---------------------------------------------------------------------------------------------- 他のMTA の配送方法には「速いが信頼できない」ものから「遅くてqueue を使う(ので確実)」ものまで選 択に幅があります。 qmail ではqueue に項目が登録されると直ちにqmail-send が起動されます。 ですから、qmail システムには「速くてqueue を使う」という1つの方法しかありません。 # ▼ 2重バウンスの宛て先 ---------------------------------------------------------------------------------------------- 2重バウンスの宛て先はディフォルトでpostmaster となります。 # ▼ ソフト容量制限 -------------------------------------------------------------------------- MTA で容量制限を行うには、システムQUOTA を用いる方法とソフトQUOTA を用いる方法がある。後者はmaildirquota と呼ばれるソフトを用いるが、これはvpopmail やmaildrop などのプログラムに組み込まれている。 vpopmail はMDA ではないが、maildirquota が内蔵され、必要に応じてqmail-local にソフト容量制限を行わせることができる。通常、vpopmail でソフト容量制限を行うには、付属のqmail-maildir++.patch をqmail にパッチする必要がある。 maildrop でソフト容量制限を行うには、maildrop 内蔵のmaildirquota を用いる。maildrop 自体MDA なので、vpopmail でソフト容量制限を導入するようにqmail にパッチする必要はない。 # ▼ qmail のパッチ ---------------------------------------------------------------------------------------------- > qmail-smtpd-relay-reject.patch 修正ファイル:qmail-smtpd.c 不正中継チェックなどで見られる、”%”や”!”や複数の”@”が含まれるアドレスに対する中継拒否を行うためのパッチ > qmail-date-localtime.patch 修正ファイル:date822fmt.c メールヘッダに日本標準時を意味する「+0900」を付加するためのパッチ > qmail-large-dns.patch 修正ファイル:dns.c.103 DNS のMX レコードが512 Byte 以上の応答(RFC違反) を返してくるAOL などに対応するためのパッチ > qmail-smtpd-auth-0.31 修正ファイル:qmail-smtpd.c SMTP-AUTH を実装するパッチで、”qmail-smtpd-relay-reject.patch”と一緒に導入する際は”qmail-smtpd-relay-reject.patch”パッチの行番号を編集し、”qmail-smtpd-auth-0.31”パッチを当てた後にパッチを当てる > qmail-maildir++.patch vpopmail 付属のパッチで、qmail-local をmaildirquota によるソフト容量制限に対応させるために用いる # ▼ ローカルからのメール送信 ---------------------------------------------------------------------------------------------- サーバー内部からサーバー外部のメールアドレスにメール送信する際は、二通りの送り方がある。 TELNET コマンドでローカルの25 ポートを叩いて外部に送信する方法では、SMTP 接続経由でメールを送ることになるので、当然qmail-smtpd がrecpthosts を参照する。recpthosts ファイルでローカルからの外部中継を許可されていない場合はメールを送ることができない。 MAIL コマンドや、qmail-inject コマンドなどで外部に送信する方法では、特にqmail の設定ファイルを参照することなしに外部中継することができる。 # ▼ リモート宛のメールが送信できない場合の対処 ---------------------------------------------------------------------------------------------- ● キューにリモート宛のメールが蓄積されるケース ・存在しないメルアド宛のINBOUND メールを、送信元へ返送するケース。この場合、送信元メル アドが不正であるとメールがキューに残る。これはおおむねSPAM メールである。 ・存在するメルアド宛のINBOUND メールだが、容量オーバーなどの理由で送信元へメールを返送するケー ス。この場合、送信元メルアドが不正であるとメールがキューに残る。 ● qmail-remote が 20/20 となっている理由 例えば、ドメイン不正なメルアドにメールを送る場合、SMTP コネクションを張れない。逆にディフォルト20 分間、qmail-remote は張れるまで待機する。このため、qmail-remote が消費されるです。 ● キューにメールがたまる理由 宛先不明(SPAM メール) が大量に送られると、上記理由により、qmail-remote はすぐに 20/20 に達する。このため大量のメールをさばききれず、キューにたまる。 ● 対策 timeoutremote リモートの SMTP サーバーからの各応答を待つ時間を、秒数で指定します。ディフォルトは1200秒(20分) だが、キューにメールがたまっている場合、qmail-remote の消費を防ぐため、30 秒ほどにする。 queuelifetime メッセージがキュー内に留まることができる期間を、秒数で指定します。デフォルトは604800秒(一週間)だが、キューにメールがたまっている場合、キューになるべく不正メールを残さないため、5 分ほどにする。 concurrencyremote リモート配送を同時に行うことを許可する、最大の数を指定します。 デフォルトは20だが、キューにメールがたまっている場合、MAX80とする。