カテゴリー

アクセスカウンター


since 1996/06/14

Count per Day

  • 2今日の訪問者数:
  • 38昨日の訪問者数:
  • 809月別訪問者数:
  • 0現在オンライン中の人数:

qmailでメールサーバ

はじめに




 ここでは、qmailを利用したメールサーバの構築方法を解説します。主な内容はqmailによるSMTPサーバの構築と、各種ツールの使い方、popサーバの構築方法です。
 qmailはsendmailに比べるとシンプルだと言われますが、動くようになるまでは結構大変です(それこそsendmailとあまり変わりません)。
 ちなみに私は「qmail メールサーバの構築」という本で勉強しました。qmailの公式サイトも見づらいので意外と役立つ情報が多いです。

このコンテンツでのソフトのバージョン


 特に表記が無ければ、以下のバージョンに関して解説します。新しいバージョンが出てても設定方法はさほど変わらないと思いますので、なるべく最新のものを利用するように心がけてください。
※一部、インストール中にソースファイルの内容を書き換えているところがありますが、それはバージョンに依存するかも。

qmail:qmail-1.03.tar.gz
checkpassword:checkpassword-0.90.tar.gz
ucspi-tcp:ucspi-tcp-0.88.tar.gz
daemontools:daemontools-0.76.tar.gz
relay-ctrl:relay-ctrl-3.1.1.tar.gz
qpopper:qpopper4.0.4.tar.gz

RedHat9でのエラーについて(2004/02/08)


 RedHat9でqmailを構築する際に、コンパイル中に以下のようなエラーが出ます。

: undefined reference to `errno’
collect2: ld はステータス 1 で終了しました
make: *** auto-str エラー 1

※qmail、checkpassword、ucspi-tcp、qmail-vida、daemontoolsでエラーが出ることを確認しましたが、基本的にdjb製のソフトは同様のエラーが発生するそうです。
 これを解決するにはソースコードの修正が必要ですが、ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/にパッチがありますので、それを適用することにより解決することも可能です。
※以下の操作はすべてそれぞれのコンパイル前のソースが存在していることが前提です。

※qmailの場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/qmail-1.03.errno.patch
$ patch < qmail-1.03.errno.patch


※checkpasswordの場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/checkpassword-0.90.errno.patch
$ patch < checkpassword-0.90.errno.patch


※ucspi-tcp場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/ucspi-tcp-0.88.errno.patch
$ patch < ucspi-tcp-0.88.errno.patch


※daemontools場合
$ wget ftp://moni.csi.hu/pub/qmail/glibc-2.3.1/daemontools-0.76.errno.patch
$ cd admin/daemontools-0.76/src/
$ patch < daemontools-0.76.errno.patch

※qmail-vidaやその他パッチが無いソースの場合。
 「error.h」というファイルを探し、「extern int errno;」という行を「#include <errno.h>」に書き換える。
※3行目くらいにあるのですぐ見つかると思います。

メールプロトコル


 ここではメールに関わるプロトコルに関して解説します。知っていると動作テストで絶大な力を発揮できますので、覚えて起きましょう。
※テストに関係無いところは解説しません。

SMTP


 SMTPは「Simple Mail Transfer Protocol」の略でその名の通りメール配信に関する通信手順です。RFC(インターネットでのルールとかが書かれて文書)では、RFC821、822に当たり、その後ESMTPとして拡張されたりしてます。
 RFC821等の内容は既にRFC2821としてリニューアルされてますが、テストではRFC821だけで十分ですし、内容も短くて読みやすいので読んでおくといいかもしれません(検索すれば日本語訳もいっぱい出てきます)。
 SMTPでは通常以下の流れでメールを送信します。

  1. tcpのsmtpポート(25番)に接続。

  2. HELO ドメイン名(ドメイン名のところは結構適当でも大丈夫な場合が多い)

  3. MAIL FROM:送信元メールアドレス

  4. RCPT TO:送信先メールアドレス

  5. RCPT TO:送信先メールアドレス、、、

  6. DATAenterメール本文(文末にピリオドだけの行で本文終わり)。

  7. QUIT


 「RCPT TO」が複数あるのは送信先が複数の時です。ここで入力されたメールアドレスはヘッダ情報に記録されないので、ccやbccの区別はありません(ヘッダ情報はDATA以降に書かれる)。
 これらの情報は送信元から送信される情報で、受信側サーバは1行1行コマンドに対する応答をします。応答は「3桁の数字 メッセージ」で、システムは3桁の数字で状況判断し、メッセージは人が見やすいようにするだけのオマケのような物です。3桁の数字は、200番台が成功、300番台が入力待ちのような状態(DATAの後に出ます)、400、500番台がエラーです。
 では、例として「mail.sender.dom」というサーバを用いて、「aaa@sender.dom」から「bbb@receive.dom」へメールを送信する場合の手順を解説します(これらのドメインやアドレスは当然架空のものです)。
※「$」はシェルのプロンプト、「S:」は入力するSMTPコマンド、「R:」はサーバからの応答(例)です。

$ telnet mail.sender.dom 25
R: Trying mail.sender.dom…
R: Connected to mail.sender.dom.
R: Escape character is ‘^]’.
R: 220 mail.sender.dom ESMTP
S: HELO sender.dom
R: 250 ok
S: MAIL FROM: aaa@sender.dom
R: 250 ok
S: RCPT TO: bbb@receive.dom
R: 250 ok
S: DATA
R: 354 go ahead
S: test
S: .
R: 250 ok 1030963107 qp 2027
S: QUIT
R: 221 ok
R: Connection closed by foreign host.

※WindowsのDOS窓からのtelnetはエコーバック(通常のtelnetは入力した文字がサーバに届いた後、クライアントに送信され初めて入力された文字が画面に出る)が無いので、入力した文字が出ません。UNIX系を使うか、脳内補完しましょう。
 これで、bbb@receive.domにメールが送れます。ちゃんと遅れなかった場合はログを見ましょう。セキュリティ上の理由から送れない場合もあります。
 UNIX系OSであればtailコマンドに-fオプション(もしくはtailfコマンド)を活用するといいでしょう。ログが更新されると自動的に画面に表示してくれます。

tail -f /var/log/maillog

受信したメールを見ると気が付くと思いますが、件名どころか、送信元、送信先アドレスが無いメールが届きます。これらの情報は全てDATA以後に書かなければならないので当然です。以下のように書けばちゃんと見れるようになります。

S: DATA
R: 354 go ahead
S: From: aaa@sender.dom
S: To: bbb@receive.dom
S: Subject: test
S:
S: test
S: .

 「From:」〜「Subject:」までが「メールヘッダ」、「test」が「メール本文」です。「メールヘッダ」と「メール本文」を分けるのは空行を一つ入れるだけです。ちなみに通常のメールサーバはSMTPの「MAIL FROM:」/「RCPT TO:」に書かれた内容と、DATA以降に書かれたメールヘッダの情報の整合性を取らないので、メールクライアントで見れる「From:」「To:」はいくらでも詐称できます(これがSPAMやウイルス等で使われるメールアドレスの詐称です)。
 実際のメールヘッダにはこれ以外の情報も加えられますが、これはメールサーバが付加する情報で、主に中継したサーバの情報や時間が記載されます。
 さて、SPAM対策や接続制限されたサーバ等はここまでのようにエラー無しでは終わりません。SPAM対策等に関しては別で解説しますが、主に失敗するパターンは以下のとおりです。
接続時

 tcpwrapper等で制限されたサーバへは接続すらさせてくれません。この時の挙動は2種類あり、「拒否」された(拒否のフラグが設定されたTCPのパケットを丁寧に返送してくれる)場合はすぐに「connection refuse」とかエラーを返します。「無視」された(サーバが何の応答も返さずほったらかし)の場合はタイムアウトまで待たなければなりません。いずれにしろ「220 云々」という応答が無い限りどうにもなりません。



メールアドレスチェック

 これにはいくつかの挙動があります。

一つは自ドメインに存在しないユーザがメール送信する場合で、この場合「MAIL FROM:hogehoge@sender.dom」と入れた直後に「User unkown」とエラーを返します。送信先のユーザの存在は送ってみないとわからないので、後でエラーメールとかが送られてきます。ちなみにqmailではここでのユーザチェックはしないみたいです(つまり存在しないユーザからのメール送信が出来る)。

 また、SPAM対策も送受信のメールアドレスがキーで、主にメールアドレスのドメイン名を元にチェックされます。



メール容量などのチェック

 メールは最後のDATAコマンドで入力した文書が書き終わった段階(ピリオドを送信した後)に送られます。その段階でメール送信容量の上限チェックがかけられている場合はエラーになります。



メールキュー

 送信したメールも受信したメールも、通常はキューに溜まり(通常は特定のディレクトリに保存される一時ファイルのような物)、その後送信されます。一般的にはsmtpでメール送信後(DATAコマンドで入力終了してピリオドを送信した後)に出てくるメッセージ(上記の例では「R: 250 ok 1030963107 qp 2027」)に、キューに関連した番号が表示されるので、それを頼りに検索するとキューがちゃんと処理されたかがわかります。

※これは表示形式は違いますが、qmailもsendmailも同じです。

POP3


 POP3は「Post Office Protocol Version 3」の略で、通常はメールクライアントが、サーバのメールボックスからメールを引き出す為に用いるプロトコルです。
※たまに勘違いされる時があるが、メールクライアントで「送信サーバ(SMTP)/受信サーバ(POP3)」と書かれていることがあるが、これはメールクライアントから見た表現で、通常のインターネット上のメール配信は全てSMTPの仕事です。
 POP3はRFC1939に定義されています(これも過去の文書の改訂版だが、最新版でもかなり短くて読みやすいです)。ここでは最も基本的なコマンドを解説します。

  1. tcpのpop3ポート(110番)に接続。

  2. USER ユーザID

  3. PASS パスワード

  4. STAT

  5. QUIT


 当然メールの中身まで確認できますが、手動テストで底までやる必要は通常ありえないので、解説しません。ここではSTATコマンド(メールボックスにあるメール数と容量の表示)のみ行ってます。
 これらの情報は送信元から送信される情報で、受信側サーバは1行1行コマンドに対する応答をします。応答は「結果 メッセージ」で、結果には「+OK」か「-ERR」しかありません。また、SMTP同様にメッセージは人が見やすいようにするだけのオマケのような物です。
 では、「pop3.mailserver.dom」に接続し、ユーザ名「user」、パスワード「password」で接続した場合の手順を解説します。
※「$」はシェルのプロンプト、「S:」は入力するSMTPコマンド、「R:」はサーバからの応答(例)です。

$ telnet pop3.mailserver.dom 110
R: Trying pop3.mailserver.dom…
R: Connected to pop3.mailserver.dom.
R: Escape character is ‘^]’.
R: +OK ready
S: USER user
R: +OK Password required for user.
S: PASS password
R: +OK user has 0 visible messages (0 hidden) in 0 octets.
R: STAT
R: +OK 0 0
R: QUIT
R: +OK Pop server at pop3.mailserver.dom signing off.
R: Connection closed by foreign host.

 これをやってみるとわかりますが、パスワードはクリアテキストで流されます。パケットキャプチャーとかで、110番ポートへのパケットを傍受して、USER xxxとPASS xxxという文字列を拾えば簡単にパスワードを入手することができたりします。
 POP3でのテストで重要なのは、「USER xxx」と「PASS xxx」の部分で、この認証まで成功すればPOP3のテストはOKだと思ってよいでしょう。
 ちなみに蛇足ですが、「USER xxx」で存在しないユーザを指定して、「User unknown」とか返すPOP3デーモンは使うのをやめましょう。不正侵入される場合は、パスワードだけではなく、可能な限りユーザIDも守るべきです。適当なパスワードを入力したとして、存在するユーザと存在しないユーザでエラーの表示が変わると、それだけでも侵入できる可能性が高まります。
 さて、メールのセキュリティを高める手法として、POP3関連には「POP before SMTP」と「APOP」というのがあります。
 「POP before SMTP」は、POP3認証(USER〜PASSまで)が「+OK」になった時点で、その接続元IPをサーバ側で数分間蓄積しておき、そのIPのユーザだけsmtpによるメール転送を許可するものです。その為、POP3でのプロトコルには何の代わりもありません(つまり、telnet before SMTPでも「http basic auth before SMTP」でもイイってこと)。
 APOPはPOP3のプロトコルに組み込まれたコマンドを利用するので、ちゃんとメールクライアントで設定しなければなりません。具体的には、POP3ポートへ接続された時の文字列「+OK ready 」の「」の部分(になる)を用い、「パスワード文字列」をMD5で暗号化してダイジェスト文字列を発行します。そして、サーバへ「USER〜PASS」ではなく、「APOP ユーザID ダイジェスト文字列」を送ることで認証します。まぁ、盗聴されればメールの中身が見られることにはかわり無いが、パスワードが守られるってことで幾分セキュアになります。

qmailのインストール


 ここではまずqmailのインストール手順(qmail本体とsmtpデーモン起動まで)に関して解説します。この手順ではpop3デーモンは起動しません。pop3に関しては、後半の「POP3デーモン・・・総合解説」で解説します。
 本文内でも書きますが、機能によってはソースにパッチを当ててからコンパイルの必要があるものもありますので、コンパイル後もソースは保存しておくことをお勧めします。
 qmailをインストールする場合、インストール前に決めなければ鳴らないことがいくつかあります。インストール先とかの検討も必要なことがあるかもしれませんが、特に重要なポイントは以下の2点です。
MailBoxを使うか、Maildirを使うか。

 「13、ローカル配信先の考慮」で詳しく解説していますが、sendmail等で使用されているメールボックスとの互換を重視するか、qmail独自の信頼性の高いMaildirを選ぶかの選択です。



pop3(もしくはimap)をどうするか。

 インターネットメールはサーバ間のメール交換はSMTPという決められたルールでやり取りされますが、受信したメールを見る方法、さらにそれに付随する機能にさまざまのな方法が存在します。




  1. MaildirかMailboxか・・・上記「1」に関連することですが、メールの蓄積方法によって使用できるプログラムが変わってきます。

  2. POP3・・・受信したメールをサーバからダウンロードしてクライアントでメールを管理する最もポピュラーな方式。

  3. APOP・・・基本的にはPOP3と同じ。認証の時にパスワードが暗号化される。

  4. imap・・・POP3とは逆でメールをクライアントに落とさず、サーバで管理します。基本的にqmailのMaildirと相性が悪い場合が多い?

  5. pop before smtp・・・メールを送るのにpopの認証を活用し、不正中継を抑制します。

  6. 仮想メールボックス・・・基本的には「メールユーザ=サーバアカウント」ですが、ユーザ数が増えると管理が手間なので、仮想メールボックスを活用した方がいい場合があります。


 この辺の詳細は「POP3デーモン・・・総合解説」で解説しています。

1、ダウンロード


 まず、qmailの本体をダウンロードします。本体はhttp://www.qmail.org/からたどれますが、qmailの製作者のD. J. Bernsteinのサイトから落とした方がわかりやすいかも知れません。
 とりあえず、ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gzから落とせるかも。

2、ダウンロードしたソースを展開


 tarで解凍します。qmailは基本的にroot権限でインストール作業をするので、始めからrootで作業した方がいいかもしれません。
 まぁ、解凍は変なところを指定してファイルを上書きしちゃうと怖いのでroot以外の方がいいかもしれませんが、、、。

# tar zxvf qmail-1.03.tar.gz -C /usr/local/src
# cd /usr/local/src/qmail-1.03

3、「conf-」ファイル


 qmailはインストール前の設定を「conf-xxxx」と言うファイルの内容を変更することによって行うことが出来ます。
※でも、ほとんどそのままでも問題は無いし、ここの解説も特に設定変更してません。
 気にすべきところは、インストール先を示す「conf-qmail」、qmailが使用するユーザとグループを示す「conf-groups」と「conf-users」。
 また、メールの流通量が多いサーバでは、「conf-spawn」、「conf-split」を気にした方がいいかもしれません。
conf-break
 代替メールアドレスを作成する為の区切り文字。デフォルトは「-」。

conf-cc
 コンパイラとそのオプションスイッチの指定。デフォルトは「cc -O2」。

conf-groups
 qmailプログラムを実行するユーザが格納されるグループを指定する。デフォルトは「qmail」と「nofiles」。

conf-ld
 make中のリンカーとリンクオプションの指定。デフォルトは「cc -s」。

conf-patrn
 パーミッションのマスクの指定?デフォルトで「002」なので、「776」というパーミッションになるということかな?要検証。

conf-qmail
 qmailのインストール先。デフォルトは「/var/qmail」。

conf-spawn

 qmail-localとqmail-remote(ローカル/リモート送信用サービス)の最大セッション数。デフォルトは「120」。最大は「255」。

 これは別記の「制御ファイル」で解説する「concurrencylocal」と「concurrencyremote」で指定できる値の「最大値」なので、大量のメールを処理するなら増やす必要がある。セッション数が増えるとサーバリソースを消耗するが、それは「concurrencylocal」と「concurrencyremote」の設定次第なので、「conf-spawn」を減らしてもさほど意味は無い(リソースを気にするとしてもデフォルトのままでよいってこと)。



conf-split

 スプールディレクトリに作成するサブディレクトリの最大値(ディレクトリ参照の負荷軽減に用いられる)。デフォルトは「23」。

 qmailではメールキューが膨大になった時に、スプールディレクトリを分割してキューを蓄えることにより、ディレクトリ参照の負荷を軽減できます。

 メールスプールが1000以上になるような大規模なメールサーバを構築する場合はこの値を大きくすると(500とか)いいらしいです。



conf-users
 qmailのシステムが使用するユーザ名。デフォルトは以下のとおり。

alias/qmaild/qmaill/root/qmailp/qmailq/qmailr/qmails

4、ディレクトリの作成


 qmailがインストールされるディレクトリを作成します。
場所は「/var/qmail」がデフォルトです。場所を変えたいのであれば、後に出てくる「conf-qmail」の設定をコンパイル前に設定する必要があります。

# mkdir /var/qmail

5、ユーザ、グループの作成


 インストール前に各ユーザとグループを作成しなければなりません。以下の手順で追加することが出来ます。
※ユーザに関する設定は「conf-users」、グループは「conf-groups」に定義されているので、変更したならそれにあわせる。
※Linux以外の人は、qmailに含まれるドキュメント「INSTALL.ids」を読んでください。

# groupadd nofiles
# groupadd qmail
# useradd -g nofiles -d /var/qmail/ qmaild
# useradd -g nofiles -d /var/qmail/ qmaill
# useradd -g nofiles -d /var/qmail/ qmailp
# useradd -g nofiles -d /var/qmail/alias alias
# useradd -g qmail -d /var/qmail/ qmailq
# useradd -g qmail -d /var/qmail/ qmailr
# useradd -g qmail -d /var/qmail/ qmails

6、バグ対応


 DNS周りのバグがあるので、手作業で修正した方がいいらしいです。ファイルは「dns.c」で場所は24行目。
 コンパイル間にvi等で編集/修正しておいてください。

  • 修正前



static union { HEADER hdr; unsigned char bufPACKETSZ; } response;


  • 修正後



static union { HEADER hdr; unsigned char buf65535; } response;

※これよりもhttp://www.ckdhr.com/ckd/qmail-103.patchにあるパッチを当てた方が確実っぽいです。

$ wget http://www.ckdhr.com/ckd/qmail-103.patch
$ patch < qmail-103.patch

7、JST対策


 qmailはそのままコンパイルすると送信したメールの時間表示が全てGMT(世界標準時)になります。JST(日本時間)にするにはコンパイル前にパッチをあてなければなりません。
 操作はqmailのソースを展開したディレクトリの中で以下のような操作をします。

  • パッチの入手



$ wget ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch


  • パッチあて



$ patch < qmail-date-localtime.patch

 これでOK。

8、その他パッチあて


 qmail-vida等を導入する時は、メイクの前にパッチを当てる必要がある場合があります。

9、メイク


 以下の操作でコンパイル/インストールが行われます(要root権限)。

# make setup check

 コンパイルがうまくいかなかった場合、インストール先ディレクトリを作ってなかったとか、必要なユーザが居ないとか、他のインストールプログラムではあまり見られないようなことがあるので注意しましょう。

10、制御ファイルを編集


 /var/qmail/controlに制御ファイルを作成/設定します。
制御ファイルとは、いわゆる設定ファイルのことで、sendmailであればsendmail.cfにあたるものです。
 この点、始めにちょっと戸惑います。
 作成方法ですが、制御ファイル「me」に「hogehoge.jp」を設定する場合は「me」というテキストファイルを作って、内容を「hogehoge.jp」にします。つまりコマンドで表現するならば、

# echo hogehoge.jp > /var/qmail/control/me

となります。
 制御ファイルに関しては別記「qmailのファイル構成」の「制御ファイル」で解説していますが、主要ファイルは以下の通りです(以下の例ではホスト名を「mail.hogehoge.jp」と仮定しています)。

  • 制御ファイル「me」・・・mail.hogehoge.jp

  • 制御ファイル「defaultdomain」・・・hogehoge.jp

  • 制御ファイル「locals」・・・mail.hogehoge.jp

  • 制御ファイル「rcpthosts」・・・mail.hogehoge.jp


 「me」は絶対に必要です。これがないとqmailは動きません。他の制御ファイルが無い場合は決められた値がセットされたことになります。
 ちなみに「me」は自ホスト名。「defaultdomain」はメアドでホスト名(@より右)を省略したときに自動補完されるホスト名。「locals」はローカルサーバとみなすホスト名。rcphostsは主にSPAM対策用ですがそのホスト名のアドレス以外宛先への転送を許可しないという設定です。
※つまり上記の設定だと自ホスト以外へメールを送れなくなりますけど、それを可能にする方法は後ほど解説します。とりあえずこの設定をしないと公開して1日もすればSPAMの温床になります。

11、エイリアスファイル


 メールサーバを運用する際に必要なメールアドレスは、当然メールを使うユーザのアドレスを準備すればいいのですが、それ以外にも必要なメールアドレスが存在します。
 それぞれのメールアドレスを作ってもいいのですが、受け取る方にしてみればえらい面倒なことなので、それらのメールを「エイリアスファイル」に定義することにより、特定のユーザにメールを転送することが出来ます。
※つまり、sendmailのエイリアスと同じ意味
 最低限必要そうなのは、postmaster、MAILER-DAEMON、root宛のメールなので、ここでは例として「user」ユーザのエイルアスに設定し、「user」がメールを受け取るようにします。

echo user > /var/qmail/alias/.qmail-mailer-daemon
echo user > /var/qmail/alias/.qmail-postmaster
echo user > /var/qmail/alias/.qmail-root

※qmailはユーザ名を全て小文字で設定する。
 このように、「/var/wmail/alias」に「.qmail-宛先ユーザ名」というファイルを作って、そのファイルの内容に転送先のユーザ名を設定すればエイリアスの設定は完了です。
 なお、/var/qmail/alias、及び各エイリアスファイルは「chmod 644」のパーミッションに設定しておきましょう。

12、sendmailとの互換性


 よく、CGIのフォームメールなどで、sendmailの実行ファイルを直接起動することがあります。qmailをインストールするとそのままでは当然sendmailを呼び出すことが出来なくなる為、以下のようにして対策することが出来ます。
sendmailを探す。
 「# find / -name sendmail」コマンドなどを使ってsendmailを探します。ここで見つかるのは設定ファイルだったり、エイリアスだったりする場合もあるので、その点も確認しておいてください。
※ちなみに「/var/qmail/bin/sendmail」というファイルが見つかると思いますが、これがqmail版sendmail実行ファイルです(なんか妙な表現だな^^;)。これは消してはいけません。
 RedHatの7系でチェックしたところ、以下のようなシンボリックリンク構造になってました。

/usr/lib/sendmail → ../sbin/sendmail
/usr/sbin/sendmail → /etc/alternatives/mta
/etc/alternatives/mta → /usr/sbin/sendmail.sendmail

 えらいややこしいですけど、「/usr/sbin/sendmail.sendmail」が本体でしたので、以下のようにして「/var/qmail/bin/sendmail」に置き換えます。

# chmod 0 /usr/sbin/sendmail.sendmail

 ※ローカルハッキング防止の為、権限を外しましょう。ほおって置くとバッファーオーバフローの問題が見つかったらroot権限が取られます。

# mv /usr/sbin/sendmail.sendmail /usr/sbin/sendmail.sendmail.org
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail.sendmail

13、ローカル配信先の考慮


 qmailではsendmail等でおなじみのメールボックス(/var/mailや/var/spool/mail等)にメールを蓄積する方法の他に、「Maildir」という独自の方式がります。
 さらに、基本的にユーザのホームディレクトリ毎にメールボックスを作成します。
 Mailboxか、Maildirかでqmailの起動方法も異なりますが、それは後ほど設定します。
 sendmail等のメールサーバでは通常受信したメールを「/var/mail/ユーザ名」や「/var/spool/mail/ユーザ名」というファイルに蓄積し、そのデータをpop3などを利用してユーザは引き出します。qmailではこの「Mailbox方式」の他に「Maildir方式」を利用することが出来ます。それぞれの特徴は以下のとおりです。
Mailbox

 一般的。

 データ破損に弱い(1ユーザに付き、一つのファイルなので、ファイルが壊れるとそのユーザの蓄積されたメールが全部見えなくなる可能性がある)。

 メールが増えると重くなる。



Maildir

 qmail独自色が強い。他のデーモンとの兼合いに注意が必要。

 データ破損に強い(ファイルが細分化されて保存されるため、1個のファイルが壊れても、他のメールに影響が出ない)。

 メールの増大に強い。



 pop3を使う分にはほとんど問題無いですが、imapを使う場合はMaildirはダメだと思った方がいいです。
※imapデーモンの種類によってはパッチが提供されてるのもあるが、パフォーマンスに難があるらしい。

14、メールボックスの作成


 「Mailbox」と「Maildir」で方法が異なります。
-sendmail互換のメールボックス
 qmailでは「/home/ユーザ名/Mailbox」にメールが蓄えられるので、それを作成して、シンボリックリンクをはります。

1、# mv /var/mail/ユーザ名 /home/ユーザ名/Mailbox
2、# ls -s /home/ユーザ名/Mailbox /var/mail/ユーザ名

※もともとメールボックスが無い時は、「/home/ユーザ名/Mailbox」という空のファイルを作ってリンクを張ってもOK。
※最近のRedHatなどのディストリビューションは「/var/mail」が「/var/spool/mail」のシンボリックリンクになってるようなので、操作する前によく確認してください。
-Maildir
 作業はrootでは無く、各ユーザの権限で行います。

1、# su ユーザ名
2、$ cd
3、$ /var/qmail/bin/maildirmake /home/ユーザ名/Maildir

15、起動テスト


 ここまで設定されていれば、qmailは一応動きます。最終的には起動スクリプトを作ったりとかしないとダメですが、とりあえず「qmailのテスト」を参考にしてテストしてみるといいかも知れません。

16、スーパサーバの設定


 SMTPデーモンである「qmail-smtpd」は外部にポート(TCP25番)を開放するのでアクセス制限を施す必要があります。
 基本的にはSMTPポートは開放するのですが、たとえばSPAMメール対策の為に、特定ユーザのみ中継を許可すると言うような設定が必要になります。
 通常のデーモンはinetdやxinetdなどを使用しますが、qmailはucspi-tcpがいいので、別記の「ucspi-tcpのインストール」を参照し、インストールとルールデータベース「tcp.smtpd.cdb」を作ります。
 インストール方法は、「ucspi-tcpのインストール」で解説しています。
※inetd等でも動きますけど、さまざまな機能(APOPとか、POP before SMTP)を実装する際に非常に面倒になるので、ucspi-tcpをお勧めします。
※どうしてもxinetdがいい人は「xinetdでの設定」を見てください。

17、起動スクリプトの作成


 初めて起動するときは、シェルを別に開いておき、「tail -f /var/log/maillog」当たりを監視しながら起動チェックした方がいいです。
 起動スクリプトでは、スーパデーモンとして、ucspi-tcpに含まれるtcpserverや、xinetd、inetdなどを使用することが出来ます(どれでも大丈夫ですが、pop3の関連ツールに影響が出る場合があります)。ここの解説はtcpserverを利用しています。xinetdは次で解説しています。

qmail起動スクリプト


/var/qmail/rc(chmod 705)

#!/bin/sh
exec env – PATH="/var/qmail/bin:$PATH" \
qmail-start ./Mailbox splogger qmail&
/usr/local/bin/tcpserver -R -H -x \
/etc/tcp.smtp.cdb -v -u 503 -g 502 0 smtp \
/var/qmail/bin/qmail-smtpd 2>&1 | \
/var/qmail/bin/splogger smtpd 3 &

 qmail本体(qmail-start:3〜4行)及びsmtpデーモン(qmail-smtpd:6〜9行)の起動サンプル。qmail-smtpdはアクセス制御の為にtcpserverを使っている。
 上記の例は「Mailbox」対応版です、「Maildir」に対応させるには、4行目を以下のように書きます。

qmail-start ./Maildir/ splogger qmail&
※「./Maildir」の後ろのスラッシュ(/)を絶対に忘れないこと。

 qmailは基本的に後ろにスラッシュがあるか無いかで、MailboxかMaildirかを判断します。
 tcpserverを使うには、「ucspi-tcp」をインストールし、SMTPのアクセス制御データベースである「/etc/tcp.smtp.cdb」を作成しなければならない。
 7行目の「-u 503 -g 502」の「-u」は「qmaild」のユーザID、「-g」は「nofiles」のグループIDです。「/etc/passwd」と「/etc/group」を参照して設定してください。

自動起動スクリプト(/etc/init.d/qmail)


※「/var/qmail/rc」を参照してます。

#!/bin/sh
PATH=/var/qmail/bin
export PATH
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
${NETWORKING} = &quot;no&quot; && exit 0
-f /var/qmail/bin/qmail-start || exit 0
case "$1" in
start)
echo -n "Starting qmail:"
daemon /var/qmail/rc
echo
;;
stop)
echo -n "Stopping qmail:"
killproc qmail-send
killproc /usr/local/bin/tcpserver
echo
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage : $0 {start|stop|restart}"
exit 1
esac
exit 0

 RedHatやTurboLinux等で使用される起動スクリプトの例。ちょっと内容がテキトウです(^^;;。
※最近のRedHatでは記述方法が根本的に変わっちゃってるみたいです。
 もしかすると、所々うまく動作しないかもしれません。
「/var/init.d/qmail start」で起動。「/var/init.d/qmail stop」で終了できる。始めの数行は一般的な初期化コマンドで、ディストリビューションやそのバージョンによって違うので、別のファイルを参照した方がいい。
 ここの例では「/var/qmail/rc」で、幾つかのデーモンを起動するので、それを終了するのに2つのkillprocが必要となる。tcpserverを使わないなら「killproc /usr/local/bin/tcpserver」はいらない。
※ちなみに上記の例だと、qmail以外でtcpserverが起動している場合に、他のtcpserverも全て落としてしまうので注意が必要。

17.5、xinetdでの設定


 ひょんなことからxinetdでテストする機会があったので設定を記載しておきます(検索すれば何処にでもでてますが、、、(^^;;;)。

  • /etc/xinetd.d/qmail-smtp



service smtp
{
disable = yes
flags = REUSE NAMEINARGS
socket_type = stream
protocol = tcp
wait = no
user = qmaild
server = /usr/sbin/tcpd
server_args = /var/qmail/bin/tcp-env /var/qmail/bin/qmail-smtpd
}

 これはsmtpデーモンだけなので、qmail-startとpop3デーモンは別途起動してください。
※popは「POP3デーモン・・・qpopperの導入(MailboxとAPOP)」あたりに書いてあります。

18、POP3の設定


 ここまで設定すればサーバ間のメール交換はできるはずです。最後に受信したメールをクライアントで見れるようにPOP3の設定をします。POP3はさまざまな形態により使用するソフトが違うので「POP3デーモン・・・総合解説」を参照してください。

qmailのファイル構成


 qmailが軽量であると言われる最大の理由でもあり、初心者にとっての一番の鬼門ともなるのが、その関連ファイルの多さです。
 ここでは、qmailのファイル構成を解説します。qmailを始めた方は、読む必要無い(というか混乱を招くだけだと思います)ですが、制御ファイルはかなり重要なので、実際の運用時には気にしてください。

システムプログラム


 メール送受信などに利用されるプログラムです。デフォルトで/var/qmail/binに配置されています。
qmail-clean
 キューからメールを削除するプログラム。送信できなかったり、送信中にエラーが発生して時間内に処理できなかったファイルを削除する。

qmail-inject
 ローカルユーザが送信したメールをメールキューに入れるプログラム。

qmail-pop3d
 pop3デーモン。

qmail-popup
 pop3用の認証プログラム。pop3とapopを使用可能。

qmail-qmtpd
 qmail独自のプロトコルであるqmtp関連のファイルだが、ここでは扱ってないので略。

qmail-queue
 受信したメールをキューに収める。

qmail-send
 メールキューの状態を判断し、メールの送信先(ローカルかリモートか)やメールの破棄などを判断する。

qmail-lspawn
 ローカル宛のメールの配信をスケジュールする。

qmail-rspawn
 リモート宛のメールの配信をスケジュールする。

qmail-local
 ローカルユーザのメールボックスにメールを入れるプログラム。

qmail-remote
 リモートユーザにメールを送信する。

sendmail
 sendmail互換用のプログラム。

splogger
 ロギングプログラム。syslogdでは信頼できないから独自のプログラムを持ってるらしい(ちゃんとsyslogd.confに応じた挙動をしますが)。

制御ファイル


 制御ファイルの解説を書くのをすっかり忘れてました(^^ゞ
※っていうか書いたけど、消えてしまったようなので書き直してます。その為、書いてる途中の項目が非常に多いです。
 制御ファイルは通常「/var/qmail/control」というディレクトリに格納されます。いわゆる設定ファイルなのですが、記述方法が独特です。たとえば「me」という値に「d77.jp」を設定したい場合は、「/var/qmail/control」ディレクトリに「me」というファイルを作成し、その内容を「d77.jp」と記述します。コマンドで示すと

echo d77.jp > /var/qmail/control/me

となります。
badmailfrom
 受信拒否をするメールアドレスを指定します。たとえば「aaa@aaa.sample」というメールアドレスからのメールを受信したくない場合は、「aaa@aaa.sample」と書き込みます。「aaa.sample」ドメインから受信したくなければ「@aaa.sample」と記述します。

bouncefrom、bouncehost、doublebounceto、doublebouncehost

 バウンスメール(送信エラー時のメール)の返信先を指定します。 ダブルバウンスメールはバウンスメールがさらにエラーで返信された場合に指定する値です。

 bouncefrom、doublebouncetoはユーザ名、bouncehost、doublebouncehostはホスト名です。初期値はbouncefromが「MAILER-DAEMON」、doublebouncetoが「postmaster」、bouncehost、doublebouncehostが制御ファイル「me」と同様の値です。



concurrencylocal/concurrencyremote

 qmailが同時に実行できる配信プロセス数の指定です。local、remoteはその名のとおりローカル配信とリモート配信です。大きすぎると(メールが多い場合)負荷が高くなりますが、少なすぎるメールの配信が遅くなります。詳細は「制御ファイルの実践向け設定」を見てください。初期値はlocalが10、remoteが20で、指定可能な最大値はコンパイル前のconf-spawnの設定に準じます。conf-spawnは初期値は120、最大が255。



defaultdomain/defaulthost
 メールアドレスのドメイン名とホスト名を省略した場合に補完する値を指定します。省略するとmeと同じ値になります。

databytes
 受け取ることができるメールの最大容量(Byte)を指定します。初期値はゼロ(無制限)です。2MByteまでのメールしか受け取らない場合は「2000000」を指定します。

idhost
 メールヘッダー内のMessage-IDフィールドの作成に使用するホスト名を指定します。初期値は「me」と同じです。

locals
 qmailがローカルアドレスとみなすホスト名を指定します。初期値は「me」と同じです。

me
 サーバのローカルメールアドレスを指定します。meが設定されてないとqmailは動きません。複数指定したい場合はlocalsを使用しますが、他の設定は主にmeを参照することに注意してください。

rcpthosts、morercpthosts:

 qmailが受信可能なメール(の送信先)のホスト名を指定する。この値を無視したい場合は環境変数「RELAYCLIENT」を設定する。つまり内部ユーザが他のサーバのユーザにメールを送る場合も環境変数を設定しないと送信できない。

 初期値は「無し」であり、この場合、すべてのメールの転送を許可する為、公開サーバの場合はSPAMメールの温床となるので必ず設定すること。



queuelifetime
 メールキューの保管期間。初期値は604800(秒)。

localiphost/percenthack/plusdomain/qmqpservers/smtpgreeting/smtproutes/timeoutconnect/timeoutremote/timeoutsmtpd/virtualdomains

制御ファイルの実践向け設定


 だらだらと解説してもピンと来ないかと思うんで、ここでは実際に実用で使うような設定に関して解説します。
最低限必要な設定
 他でも散々書いてますが、制御ファイル「me」は必須です。

これは設定した方がいいと思われる設定

 「concurrencylocal」と「concurrencyremote」。制御ファイルの方でも解説してますが、デフォルトでは配信数が少なすぎです。特に最近のディストリビューションはよく「root」宛にメールを送るので、「concurrencylocal」は50くらいでもいいと思います。

 この設定は「/var/log/maillog」で「Sep 2 17:53:56 hogehoge qmail: 1030956836.627728 status: local 0/10 remote 0/20」と表示されますので、頻繁に「local 10/10」とか「remote 20/20」と表示される場合はメールキューに溜まりすぎなので、それを目安として増やすといいでしょう(増やし過ぎないように)。



SPAM対策/セキュリティ

 別記で解説しますが、制御ファイルでは「rcpthosts」くらいしか使用しません。

※というか「rcpthosts」(と環境変数「RELAYCLIENT」)を使いこなせるようになるまで、外向けにサーバを公開しないこと。

 また、セキュリティ対策で外向け/内向けにサーバを分けたいときは「smtproute」を使用します。



ユーザ制限

 企業内メールサーバ等で、画像を貼り付けまくったMicrosoftWordのファイルを全社員に送ってサーバをパンクさせるような奴を抑制したい時は「databytes」を設定しましょう。



なんか凝りたい

 「smtpgreething」に凝ったグリーティングメッセージを書きましょう。ただし、気づいてくれる人はほとんどいません。



ネットワーク/サーバが極端に遅い環境での利用

 メールの数が増えないとあまり関係無いですが、「timeoutxxx」関連の設定を増やす必要はあるかも。

qmailのテスト


 ここではqmailの動作テストの方法について解説します。あくまでも基本的な動作テストの方法だけなので、SPAM対策とかの動作テストは他のコラムにて解説します。

テストの基本


 qmailは「/var/log/maillog」にログを出力します(正確にはsploggerやsyslogdの仕事だが)。これを見ずに問題の原因究明は出来ませんので、テスト中は常に監視してください。「tail -f /var/log/maillog」などのコマンドが便利です。
※/var/log/messagesも見ておいたほうがいいかも。

qmailの手動起動


 qmailを起動させるには、qmailの本体部分とも言える「qmail-start」とSMTPデーモンである「qmail-smtpd」を起動させる必要があります(受信したメールを見るのにPOPデーモンも必要かも知れませんが、テスト段階ではPOPは無くても問題ありません)。
 いずれともroot権限で起動します。

  • qmail-startの起動


 メールの蓄積を「/home/xxxx/Mailbox」にするか「/home/xxxx/Maildir」にするかによって違います(ここで/var/mailとかじゃないの?って疑問に思う人はインストールのところを読み直してください)。

Mailbox
qmail-start ./Mailbox splogger qmail&


Maildir(「Maildir」の後のスラッシュは必須です)
qmail-start ./Maildir/ splogger qmail&

※「qmail-start」、「splogger」は「/var/qmail/bin」にあります。

  • qmail-smtpdの起動


 qmail-smtpd 2>&1 | splogger smtpd 3&
※「qmail-smtpd」も「/var/qmail/bin」にあります。
 これでメールの送受信は可能です(ただし、rcpthostsの内容によっては受信できません)。
 あくまでもテスト起動なので終わったら落としましょう。killコマンドでqmail-sendとqmail-smtpdを落とせばOKです。

qmail起動時の動作


 qmail起動直後は「ps ax」コマンドなどでプロセスの状態を確認します。通常、「/var/qmail/bin/qmail-start」で起動した場合は以下の内容がプロセスリストに載ります。

qmail-send
splogger qmail
qmail-lspawn ./Mailbox
qmail-rspawn
qmail-clean

※上記は「qmail-start ./Mailbox splogger qmail&」で起動した場合の例。当然「./Maildir/」とかで起動した場合は違う表示になったりもします。
 手動でこのプロセスを停止したい場合は「qmail-send」のみを殺してください。それで全て止まります。
 「/var/qmail/bin/qmail-smtpd」を起動した場合のプロセスは以下の2つです。
※起動方法によって表示は異なりますが、ここではtcpserverを利用して起動した場合の例です。

/usr/local/bin/tcpserver 云々
/var/qmail/bin/splogger smtpd 3

 これらが動いてなければこれ以降のテストが出来ないので、設定ファイルなどをチェックして正しく起動できるようにしなければなりません。
 起動後に「qmail-remote」のプロセスが多量に発生する場合があります。これはキューに溜まったメールを吐き出す為の処理です。ただ、この処理は一瞬で終わりますが、終わらないときは何かしらの問題が起きていることが予想されますので、ログを見ましょう。この問題は制御ファイルの記述ミスか、tcpserverのルールのミスの場合がほとんどです。
※qmailはデフォルトで10〜20通分ずつメールを処理します(ローカルとリモートで違う)。これは2、3分で10〜20通しか送らないので、100通くらい溜まってると、全てのメールを処理するのに30分くらいかかります。詳しくは制御ファイル「concurrencylocal」「concurrencyremote」で解説しています。

ucspi-tcpのインストール


 ucspi-tcpはinetdやxinetd等のスーパサーバのような物です。qmailを使うときはこのucspi-tcpを使うといいでしょう。
 ucspi-tcpを推奨する理由はその特徴から来る理由も当然ありますが、何よりqmailと相性がいいというのがあります。xinetdとqmailのセットはいろいろ考えなければならないことが多いし、いろいろなサイトにも書かれてるとおり、設定上でよくわからない部分があります。

ucspi-tcpのインストール


 まずソースコードをhttp://cr.yp.to/ucspi-tcp.htmlから入手します。ダウンロードしたら以下の手順で展開/コンパイル、インストールします。

$ su
# tar zxvf ucspi-tcp-0.88.tar.gz -C /usr/local/src
# cd /usr/local/src/ucspi-tcp-0.88
# make setup check

 makeはroot権限が必要なので初めからsuしてます。
※qmail-vidaを使う場合はmakeの前にパッチを当てる必要があります。

設定


 qmailで、spamを防ぐ方法として、制御ファイル「/var/qmail/control/rcpthosts」に自ドメイン名を設定するのが一般的です(たとえば「d77.jp」と書くと、d77.jp宛のメールしか受信しなくなります)。
「/var/qmail/control/rcpthosts」に「d77.jp」を設定した場合のメールの動作。
○:d77.jp→d77.jp
○:他ドメイン→d77.jp
×:他ドメイン→他ドメイン
×:d77.jp→他ドメイン
 これで一見spamからの防衛が出来るように見えますが、実際は大きな問題があります。外部から見れば「d77.jp」宛しか受け取らないので、当然不正中継が不可能ですが、内部ユーザが他のドメイン宛にメールを送信する場合(d77.jp→他ドメイン)は、宛先が自ドメインではないため、spamという扱いにされ送信できなくなります(サーバプログラムがメールを受け取らない)。
 これを回避する為の一般的な方法として、内部IP(ここでは例として192.168.1.0/24とします)からとローカルホストからメールを受け取った場合ときのみ「rcpthosts」の設定を無視するという方法を用います。
 これをucspi-tcpで実現する為に、具体的には「192.168.1.と127.0.0.からのメールに関しては環境変数に「RELAYCLIENT=""(rcpthostsを無視する環境変数)」を設定する」という方法を用います。
 まず、以下の手順でSMTPのルールデータベースを作成します。
1、rules.txtというファイルを作る。内容は

192.168.1.:allow,RELAYCLIENT=""
127.0.0.:allow,RELAYCLIENT=""
:deny

 という3行です。1、2行目はアクセス元が「192.168.1.」と「127.0.0.」だった場合にのみ通信を許可(allow)し、さらに「RELAYCLIENT=""」を指定しています。3行目はそれ以外は全て拒否という意味です。「ゲートウエイのIP:deny」なんて設定も追加すると、うっかりルータが乗っ取られたとしても、そこからのアクセスを拒否できたりします。
2、rules.txtからルールデータベースを作成
 以下のコマンドでルールデータベース「rules.cdb」を作ります。

# cat rules.txt | tcprules rules.cdb rules.tmp

 そして、/etcにコピー

# cp rules.cdb tcp.smtp.cdb

3、起動

tcpserver -v -p -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd

 これで、「qmail-smtpd」に「tcp.smtp.cdb」のルールを適用することが出来ます。
 起動スクリプトの記述方法に関しては「qmailのインストール」→「起動スクリプトサンプル」付近を見てください。

SPAMメール/迷惑メール対策


 ここではqmailでのSPAMメールの対策方法を記述します。

Firewallやルータなどによる遮断


 たとえばWebサーバなどを運用していて、Webフォームからメールを送信するだけにメールを使用する場合は、受信の必要が無いので、WAN側からのSMTP接続(TCP:25番)を遮断すると確実です。
 inetdやtcpserver(ucspi-tcp)などでの遮断も有効です(この場合は自分自身「127.0.0.1」のみ許可)。

中継を一切禁止


 「/var/qmail/control/rcpthosts」に自分のホスト名を記述します。たとえば自ホストのメールアドレスが「hoge@example.jp」の場合は「/var/qmail/control/rcpthosts」に「example.jp」と書きます。
 これにより、「/var/qmail/control/rcpthosts」に記述されたホスト宛のメールしか受信しなくなります。
 上記の例(example.jpと書いた場合)は、「xxx@example.jp」宛のメールしか受信しなくなります。たとえ送信元が「example.jp」でも、送信先が別のホストの場合は以下のエラーを返します。

553 sorry, that domain isn’t in my list of allowed rcpthosts (#5.7.1)

 ちなみにこれをやると、内部ユーザもメールを送信できなくなります(内部ユーザが送信する場合は宛先が指定されていないホストになる為です)。これの回避方法は次の環境変数を使います。

一部のユーザのみ中継許可


 qmailのサーバを利用して、外部にメールを送信したい場合は、qmailのサーバが中継を許可していなければなりません。
 たとえば、「hoge@example.jp」というメールアドレスの人が、ホスト「example.jp」を利用して、「xxx@yyy.com.jp」へメールを送信したい場合、「/var/qmail/control/rcpthosts」で、「example.jpのみを受信」できる設定にしていると、「hoge@example.jp」からの送信も出来なくなってしまいます。
「/var/qmail/control/rcpthosts」に「example.jp」を設定した場合のメールの動作。

○:example.jp→example.jp
○:他ドメイン→example.jp
×:他ドメイン→他ドメイン
×:example.jp→他ドメイン  ←この部分が自分自身にも適用されてしまうのが問題。

 この場合は環境変数「RELAYCLIENT」を利用します。qmailでは基本的に、「/var/qmail/control/云々」よりも環境変数の値を優先しまので、「特定のIPアドレスから接続してきた人のみrcpthostsの設定を無効(環境変数:RELAYCLIENT="")にする」という方式をとります。
 たとえば、内部ユーザが「192.168.0.xxx」というIPアドレスの場合、tcpserverなどのスーパーサーバを使ってsmtpポートに対し、以下のような設定をします。

192.168.0.:allow,RELAYCLIENT=""

※tcpserverの説明は「ucspi-tcpのインストール」で詳しく解説しています。
 こうすると、内部ユーザ「192.168.0.xxx」がsmtpへ接続された場合、「RELAYCLIENT=""」という環境変数が有効になり、「/var/qmail/control/rcpthosts」が無視されます。「RELAYCLIENT=""」は「全ての中継を許可」の意味なので、指定されたIPのユーザのみが中継可能になるというわけです。

大きなサイズのメールを受け取らない


 「/var/qmail/control/databytes」で受信データのバイト数を指定できます。上限をどのくらいにするかは難しいところですが、以下のような値が目安でしょうか?
画像データをよく受け取る。
 1024×768のフルカラービットマップが大体1MByte強なので、1.5〜2MByteくらいでしょう。ただし、イラストレータ系の人は20MByteと平気で超えます。そういう人はメールで送らないでFTPや物理的なメールを使いましょう。

mp3などの音楽データ
 クラシックなどの長いものでなければ大体3MByte〜4MByteですね。

ビジネスメール

 たまに20MByte近いパワーポイントデータを送る方がいますが、そういうのを許可してたらサーバ負荷でビジネスどころではないので、5Mbyteくらいに制限してやりましょう。パワーポイントも画像をベタベタ貼らなければ1MByte超えることはないので、そういうプレゼンが不要な場合は1Mbyte位に制限しましょう。

 文書ファイルもたまに1MByteを超えることがありますけど、ビジネス用途のサーバなら2〜5Mbyteで大丈夫です。



 ちなみに容量制限オーバの場合、以下のエラーが*メールで*返送されてきます。

552 sorry, that message size exceeds my databytes limit (#5.3.4)

どこからでもメールを使いたい方法


 たとえば外出先からメールを使用したい場合、アクセス元のISPによってIPが変わる為、正規ユーザかスパマーかを判断できません。当然ながらrcphostsも使えないし、RELAYCLIENT環境変数も問題解決にはなりません。こういう場合は幾つかの方法があります。

1、あきらめる。
2、サーバにppp接続をし、そのユーザのみを許可。
3、pop before smtp(pop3で認証した後数分間だけ、そのIPにsmtp接続を許可する方法)を使用する。
4、smtp authを使用する。

 「pop before smtp」は別コラムで解説してます。
 smtp auth(SMTP認証)はその名の通りsmtpのセッションに認証するんですけど、しばらく一般的じゃないとされてあまり注目されていなかったようですね。OutlookやBecky!でも対応してるので、ちょっと興味アリ。興味のある方はqmail-vidaと言う物がよさそうですね。
※ただ、これを執筆段階では更新が止まってますし、まだβ段階のようなのでどうなんでしょうね?(追記:APOP、仮想メールボックスの併用になるとqmail-vidaしかないようです。とりあえず、別コラムを読んでください)。

フリーメールユーザや特定のメールアドレスを遮断


 「/var/qmail/control/badmailfrom」に遮断したいメールアドレスを書き込みます。たとえばメール爆弾がMicrosoftのHotmailから来る場合は、以下の2行を追加します。

@hotmail.com
@msn.com

 ホスト名だけ書くと、そこからのメール全てを遮断します。

POP3デーモン・・・総合解説


 qmailで受信したメールを読むにはPOP3デーモンを導入しなければなりません。POP3デーモンにはいくつかの種類がありますが、ここでは状況別に何がお勧めかを羅列します。
※当然、これが全てではないです。
※OutlookはAPOPには対応してないので注意(フリーウエアか何かで対応させるのはあったかも)。セキュリティを重視するのであればsmtp-authやS/MIME等を使うみたいです(ここでは解説してませんが、qmail-vidaあたりで実現できそう?)。
Maildir対応
qmail-pop3d

Mailbox対応
qpopper

APOP

qmail-pop3d + checkapoppw

qmail-pop3d + qmail-vida

qpopper



POP before SMTP
qmail-pop3d + relay-ctrl

仮想メールボックス

vpopmail(vchkpw)

qmail-pop3d + qmail-vida



※仮想メールボックスというのは、サーバアカウントが無くてもメールの送受信を可能にする為の機能です。
 デルタ的なお勧めとしては、Maildirなら「qmail-pop3d」、Mailboxなら「qpopper」で、APOPはどれでもOKです。POP before SMTPは「qpopper」ではちょっとわからないので「qmail-pop3d」しか選択の余地がありません。仮想メールボックスは上記のどちらでもいいですが、「vpopmail」でAPOPは使えないと思った方がいいです。「qmail-vida」はさまざまな機能が使えていいのですが、最近バージョンアップの話を聞かないので、仮想メールボックスがいらない人はわざわざ入れなくてもいいです。

POP3デーモン・・・qpopperの導入(MailboxとPOP/APOP)


 qmailには「qmail-pop3d」という物がありますが、sendmail互換のMailboxに対応してません。ここではsendmail互換のMailbox対応としてqpopperを紹介します。
 解説の中ではついでにAPOP対応方法も解説します。
 ちなみに、qpopperはかなりセキュリティ上の問題が多発してるので、セキュリティ情報を気にするなり、外部からの接続を遮断するなり、信頼できないユーザにアクセスさせないなど対策をとりましょう。
※だからと言ってqpopperがダメって訳ではありません。かなり一般的に広く普及しているので、信頼できると思います。
 ちなみにqmailのMailboxは「/home/ユーザ名/Mailbox」で、qpopperが参照するのは「/var/mail/ユーザ名」です。これに関しては「qmailのインストール」→「メールボックスの作成」のところに書いてますんで、注意してください。

ダウンロードとインストール


 公式サイトはhttp://www.eudora.com/qpopper/なので、そこからqpopperを落とします。今回は「qpopper4.0.4.tar.gz」というファイルを使用しました。
 ちなみにこのバージョンはセキュリティ上の問題が発見されています(T_T。
とりあえず、起動オプションに「-u」を設定しなければ問題ないらしいんで、一応気にかけておきましょう。
 では、インストール方法。
 APOPが必要な場合は以下のアカウント作成作業をします(POPではこの設定は不要)。

# groupadd pop
# useradd -g pop -d /dev/null -s /bin/false pop

 次にqpopperを展開(POP/APOP共)

$ tar zxvf qpopper4.0.4.tar.gz
$ cd qpopper4.0.4

 環境設定はAPOPに対応するかしないかで違います。APOPを使わない場合はサーバのアカウント(/etc/passwd、/etc/shadowが参照されます)。
-APOP対応

$ ./configure –enable-specialauth –enable-apop=/etc/pop.auth –with-popuid=pop

-APOP非対応(POP)

$ ./configure –enable-specialauth

※「–enable-specialauth」はシャドウパスワード対応。
 最後にメイク。

$ make

 コンパイルは以上。インストールは手動で行います。
まずは本体をコピー

# cp ./popper/popper /usr/local/bin

APOPを使う場合は、APOP用パスワード作成用ツールのpopauthのコピー(POPの場合は不要)

# cp ./popper/popauth /usr/local/bin
# chown pop /usr/local/bin/popauth

 コンパイルとインストールは以上

設定(APOPのみ必要)


 設定はAPOPを使う時のみなので、APOPに対応する必要がないなら読み飛ばしてください。
 APOP用のパスワードの作成です。まず、アカウントデータベースを初期化します。

# popauth -init

 これで「/etc/pop.auth」が出来ますが、既に存在している場合は初期化の確認メッセージ(Really initialize POP authentication DB?)が出ますんで「y」と入力すると初期化できます。
 次にユーザ名とパスワードを追加します。

# popauth -user ユーザ名

 これでパスワードを2回聞かれるので、入力すれば設定完了です。ちなみに通常のユーザからなら、

$ popauth -user

 でもOKです。
 qpopperに関する設定はこれだけでOKです。

起動設定(xinetd)


 xinetdをスーパサーバにした設定方法です。APOP対応/非対応関係無く同じ設定で行けます。まず、以下のファイルを作成します。
/etc/xinetd.d/popper

service pop3
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/local/bin/popper
server_args = -s
}

※ちなみに「inetd」で動かしたいなら、inetd.confに以下の行を追加します。

pop-3 stream tcp nowait root /usr/sbin/tcpd popper -s

 次にアクセス制限。xinetdはhosts.allowとhosts.denyで制限できます。
hosts.allow

popper:192.168.1.

※上記の例は「192.168.1.xxx」からのアクセスを許可している。必要に応じて他の設定などを追加してください。
hosts.deny

ALL:ALL

 あとはxinetdを再起動すればpop3が使用できるようになります。

起動設定(tcpserver)


 次にtcpserver上で稼動させる設定です。これもAPOP対応/非対応関係無しです。
rc.qpopper.sh

#!/bin/sh
/usr/local/bin/tcpserver -R -H -x /etc/tcp.pop3.cdb -v 0 110 /usr/local/bin/popper -s 2>&1 | /var/qmail/bin/splogger pop3d 3 &

※「-R -H」オプションを書き忘れてました。
 -R・・・通信時にIDENT(TCP113番)を飛ばさないようにする。
 -H・・・DNS検索をしない。
 デフォルトは上記両方とも「する」になってます。IDENTを通してないとタイムアウトまで26秒待たされます(通しててもクライアント側でパーソナルファイアウォールとか設定してると同じ問題が起きる)。
 これでqpopperが起動できます。ログは/var/log/messagesに「pop3d」というエントリーで記録されます。
 「/etc/tcp.pop3.cdb」はucspi-tcpで解説していますが、ルールデータベースです。変換前のデータベースの一例は以下の通りです。
tcp.pop3.txt

#!/bin/sh
192.168.1.:allow
127.0.0.:allow
:deny

※ローカルネットワーク(192.168.1.x)からの接続を許可して、それ以外は拒否という設定。
 上記のファイルを以下のコマンドで変換すればOKです。

cat tcp.pop3.txt | tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp

POP3デーモン・・・qmail-pop3dの導入(MaildirとPOP/APOP)


 ここでは「qmail-pop3d」の解説をしますが、実はqmailをインストールした段階で関連ファイル(主にqmail-popupとqmail-pop3d)がインストールされているので、改めてインストールする必要はありません。認証モジュールだけ必要なので
 ですので、既にqmailパッケージがインストール済みという前提で解説します。

認証モジュールの導入(checkpassword:POP3認証)


 qmailではqmail-popupがIDとパスワードの入力を促し、認証モジュールが認証チェックをして初めてqmail-pop3dがメールを読むことが出来ます。
 認証モジュールに関しては標準で入っていないので、導入します。
 http://cr.yp.to/checkpwd.htmlから「checkpassword」をダウンロードします。これはAPOPには対応してません。APOP対応にしたいならここを読み飛ばして次のcheckapoppwを導入してください。
 checkpasswordは良くも悪くも/etc/passwdや/etc/shadowを用いて認証します。まぁパスワード管理が楽なことがメリットでしょう。
 今回は「checkpassword-0.90.tar.gz」を使いました。ダウンロードしたら以下のようにしてインストールします。

$ su
# tar zxvf checkpassword-0.90.tar.gz -C /usr/src
# cd /usr/src/checkpassword-0.90/
# make
# make setup check

認証モジュールの導入(checkapoppw:APOP認証)(2002/09/03)


 APOPに対応するには、checkpasswordのかわりにcheckpwパッケージに含まれるcheckapoppwを利用します。
 http://checkpw.sourceforge.net/checkpw/から「checkpw」をダウンロードします。これはAPOPには対応してません。今回は「checkpw-1.00.tar.gz」を使いました。ダウンロードしたら以下のようにしてインストールします。

$ tar zxvf checkpw-1.00.tar.gz
$ cd checkpw-1.00

※設定はqmailと同様、1ファイル1設定です。

conf-home:インストール先。デフォルトは「/」(指定値にbinディレクトリを作るので実際は/bin)。
conf-qmail:qmailの所在。デフォルトは「/var/qmail」
conf-maildir:Maildirの名称。多分パスワードファイルの所在指定としてしか使われていない。デフォルトは「Maildir」。
conf-password:パスワードファイル名。デフォルトは「.password」

 以上の設定が終えたら(多分変更無しでOKですけど)メイクします。

$ make
$ su
# make setup check

※「conf-maildir」と「conf-password」の設定でパスワードファイルの位置が決まります。デフォルトは「/home/user/Maildir/.password」です。
 この認証モジュールは独自のパスワードファイルを使うので、ユーザ毎にパスワードファイルを準備する必要があります。

$ echo パスワード>/~Maildir/.password
$ chmod 600 /~Maildir/.password

 以上で設定は終わりです。パスワードがクリアテキストというのも心もとないですが、アカウントパスワードとは分断できますし、そもそもこのパスワードファイルが他人に見られるという状況=Maildirの中身も見られるということなので、まぁ問題無いでしょう。できればユーザアカウントのパスワードとは違うパスワードにした方がいいと思います。

起動設定(tcpserver)


 認証モジュールがインストールできれば、後は既にインストール済みなので、起動方法から解説します。全ての実行ファイルは特に特に指定していない物に限っては「/var/qmail/bin」にありますので、必要に応じてパスを通してください。パスはここに書いてある個所とは違う場合もあるので、事前に確認してください。
 qmail-pop3dを実行するには、スーパサーバ、認証、デーモン本体と3段階あります。まず、それぞれに関して解説します。
-まずは、スーパサーバであるtcpserverの起動設定

/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 popperプログラム

 「/etc/tcp.pop3.cdb」はucspi-tcpで解説していますが、tcpserver用のルールデータベースです。変換前のデータベースの一例は以下の通りです。
tcp.pop3.txt

#!/bin/sh
192.168.1.:allow
127.0.0.:allow
:deny

※ローカルネットワーク(192.168.1.x)からの接続を許可して、それ以外は拒否という設定。
 上記のファイルを以下のコマンドで変換すればOKです。

cat tcp.pop3.txt | tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp

-次は認証モジュールの部分です。
 書き方はAPOP対応の「checkapoppw」と「checkpasswd」で違います。
 APOP非対応

qmail-popup サーバ名 /bin/checkpassword 実行プログラム

 APOP対応

qmail-popup サーバ名 /bin/checkapoppw 実行プログラム

-最後にデーモン本体です。

qmail-pop3d Maildir 2>&1 | splogger pop3d 3

 「qmail-pop3d」自体は「qmail-pop3d Maildir」と書くだけです。画面にログを出したくないので「2>&1」と付いてます。ログはsploggerにリダイレクトします。sploggerはqmailに標準添付のロギングプログラムで、「splogger タグ ファシリティレベル」とオプションをつけます。「タグ」はログに記録される指標なので、わかりやすいように「pop3d」でOKです。ファシリティレベルはsyslogの話になってしまうのですが、簡単に説明すると「2(デフォルト)」だと/var/log/maillog、「3」だと「/var/log/messages」に出力されます。qmal-smtpdとかは「2」がいいですが、pop3dは通常「3」でOKです。
 さて、実際に実行するときはこれらをいっぺんに起動します。IPレベルでの接続をスーパサーバで振り分け→認証部分でPOP3認証→POP3の処理です。起動時はこれをいっぺんに書きます。
-非APOP

/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup サーバ名 \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1 | \
/var/qmail/bin/splogger pop3d 3&

-APOP

/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup サーバ名 /bin/checkapoppw \
/var/qmail/bin/qmail-pop3d Maildir 2>&1 | \
/var/qmail/bin/splogger pop3d 3&

 微妙に違っているところはバックグラウンドで動かさないとダメ(ダメって訳ではないがデーモンをフォアで動かしても意味がない)なので、最後に「&」が付いてます。サーバ名はメールサーバの名前なので「mail.hogehoge.jp」なら、それをそのまま書きます。
 あとはそれをスクリプトにしちゃいましょう。以下はサーバ名を「mail.hogehoge.jp」、APOP対応で起動する場合のスクリプトです。
※APOPに対応しない場合はcheckapoppwをcheckpasswdに書き換えるだけです。
-/var/qmail/rc.qmail-pop3d

#!/bin/sh
/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup mail.hogehoge.jp /bin/checkapoppw \
/var/qmail/bin/qmail-pop3d Maildir 2>&1 |\
/var/qmail/bin/splogger pop3d 3&

 これでOKです。

(余談)動作チェック


 うまく動かない場合などはtcpserver等を使わないで起動したり、コマンドラインから起動することも出来ます。コマンドラインからは以下のコマンドで起動できます。
※以下はAPOPの場合。POPはcheckapoppwをcheckpasswdに書き直す。

/var/qmail/bin/qmail-popup サーバ名 /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir 2>&1

 ちなみにこの方法だとフロントエンドで動くのでctrl+cを押すまでプロンプトが帰ってきません。また、ログは標準出力に出力されるので、そのまま画面に出ます。

POP3デーモン・・・POP before SMTP対応


 通常の自宅サーバでのSPAM対策は「/var/qmail/control/rcpthosts」に自ドメインをして、送信可能なIPアドレスに対し、「RELAYCLIENT=""」という環境変数を指定すれば問題ありません。
 しかし、送信可能なIPアドレスが特定できない状況(ISPやダイヤルアップ接続ユーザ等)の場合はこの方法は使えません。
 「POP before SMTP」はこういうときに有効な手段の一つで、POP3認証を済ませたユーザだけSMTP中継を許可するというSPAM対策手法の一つです。SMTP認証(SMTP AUTH)のように認証を別々にすることによる煩わしさにも解放されます(SMTP認証の方が安全と言えば安全だが)。
 弱点としては、POP認証を済ませた後、同じIPを持つ人がきた場合(どこかのドメインでNATで振り分けられたユーザとか)に無防備になりますが、それは非常に難しいことですし、POP認証後の制限時間を短くすることによってもある程度避けられます。
 また、当然ながら、POP認証を事前に済ませる必要があるので、POP3へのアクセスも解放されて無ければなりません。
 なお、POP before SMTPを実現するのに、今回はqmail-pop3dへの機能追加という形を取っています。qpopperでがんばってみたのですがかなり大変そうなのでやめました。どうしてもMaildirがイヤだって人はqpopperでも調べれば方法があります。

インストール


 基本的にqmail-pop3dに機能追加するという方法なので、qmail-pop3dの導入は終わってるものと仮定します。APOP対応/非対応は関係なくどちらでもOKです。
 今回は「relay-ctrl」を使います。これを利用するには「daemontools」が必要になります(「daemontools」とはqmailと同じ作者が作ったツール群で、サービスが落ちたときの再起動をしてくれたりなどの便利なツールが入ってます)。今回使用するバージョンは以下のとおりです。

daemontools-0.76
relay-ctrl-3.1.1

 インストール方法は検索すればいくらでも出てくるので、簡単に解説します。

  • daemontoolsのインストール


 「http://cr.yp.to/daemontools.html」からダウンロード(How to install daemontoolsにある)。

$ su
# tar zxvf daemontools-0.76.tar.gz -C /usr/src
# cd /usr/src/admin/daemontools-0.76
# package/install


  • relay-ctrlのインストール


 「http://untroubled.org/relay-ctrl/」からダウンロード。

$ tar zxvf relay-ctrl-3.1.1.tar.gz
$ cd relay-ctrl-3.1.1
$ vi conf-man
(「/usr/local/man」を「/usr/local/share/man」に書き換える)
$ make
$ su
# ./installer

 インストールは以上です。

relay-ctrlの設定


 daemontoolsについては設定は不要です(一部のファイルを使うだけなので)。
 relay-ctrlはそのままでは動きません。以下の設定を行います。
-まず、キャッシュ(/var/spool/relay-ctrl/allow)を作成します。

# mkdir /var/spool/relay-ctrl
# mkdir /var/spool/relay-ctrl/allow
# chmod 700 /var/spool/relay-ctrl
# chmod 777 /var/spool/relay-ctrl/allow

 次に、キャッシュの位置を示す設定ファイル(/etc/relay-ctrl/RELAY_CTRL_DIR)を作成します。

# mkdir /etc/relay-ctrl
# echo "/var/spool/relay-ctrl/allow" > /etc/relay-ctrl/RELAY_CTRL_DIR

・キャッシュを操作するプログラムにsetuidの設定

# chmod u+s /usr/local/bin/relay-ctrl-allow

・キャッシュの削除の設定(要cron)
/etc/cron.d/relay-ctrl

* * * * * root /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age

・キャッシュの生存時間の設定

# echo "600" > /etc/relay-ctrl/RELAY_CTRL_EXPIRY

単位は「秒」です。
 relay-ctrlの設定は以上です。
 キャッシュと生存時間に関しては、あとで解説します。

関連デーモンの設定


 まず、qmail-smtpdの起動ファイルに幾つかの指定を追加します。既存の設定に以下の強調されている部分を追加するだけでOKです。

/usr/local/bin/envdir /etc/relay-ctrl \
/usr/local/bin/relay-ctrl-chdir \
/usr/local/bin/tcpserver -R -H -x \
/etc/tcp.smtp.cdb -v -u 503 -g 502 0 smtp \
/usr/local/bin/relay-ctrl-check \
/var/qmail/bin/qmail-smtpd 2>&1 | \
/var/qmail/bin/splogger smtpd 3 &

 このとき、「tcp.smtp.cdb」に「RELAYCLIENT」の設定がされているとその設定が優先されます。
※つまり、「192.168.1.:allow,RELAYCLIENT=""」という行があった場合、「192.168.1.xxx」というIPアドレスを持つユーザはPOP認証をしなくてもSMTPによる転送が可能になります。
 次は「qmail-pop3d」関連の設定です。

/usr/local/bin/envdir /etc/relay-ctrl \
/usr/local/bin/relay-ctrl-chdir \
/usr/local/bin/tcpserver -x \
/etc/tcp.pop3.cdb -v 0 110 \
/var/qmail/bin/qmail-popup \
メールサーバ名 /bin/checkpassword \
/usr/local/bin/relay-ctrl-allow \
/var/qmail/bin/qmail-pop3d Maildir 2>&1 \
| /var/qmail/bin/splogger pop3d 3 &

 こんな感じに追加し、各デーモンを再起動します。
APOPの場合も「 メールサーバ名 /bin/checkpassword \」の行を「 メールサーバ名 /bin/checkapoppw \」に書き換えるだけで対応できます。

動作テスト


 まず、自ドメインから外のドメインのメールに対しメール送信のチェックをします。
 送信が出来てしまったら問題です(^^;。POP before SMTPでは、POP認証を済ませないと、メール送信が出来ません。もし、認証もせずに送信できた場合は幾つかの原因が考えられます。

  • 「/var/qmail/control/rcpthosts」に自ドメインが指定されていない(指定しないとSPAMメールウェルカム状態になります)。

  • メールクライアントが親切にpop認証を事前にしてくれてる(「/var/spool/relay-ctrl/allow」にpop認証を済ませたIPアドレスのファイルが記録されるので、それを削除すれば再チェックできます)。

  • 送信者のIPからアクセスがあった場合、環境変数「RELAYCLIENT=""」がセットされてしまっている。


 送信でエラー「553 sorry,that domain isn’t in my list of allowed rcpthosts(#5.7.1)」が出ればOKです。
 次に、pop3接続をし、pop3認証を済ませます(メールの受信)。これにより、「/var/spool/relay-ctrl/認証者のIP」というファイルが作成されます(内容は「user=ユーザ名」です)。このファイルはほおって置けば消えますが、rmコマンドで手動で消せば何度でもテストできます。
 pop3認証後、メールが送信できればテスト完了です。

プロセスリストに変な物が、、、


 これらの設定が終わる頃、プロセス(ps aux)に「sh /command/svscanboot」とか、「svscan /service」とか、「readproctitle service errors: …..」とかいうものが見つかります。これらはdaemontoolsをインストールすると自動的に起動します。単に、relay-ctrlを使用するだけならメモリの無駄なので止めましょう。止め方は「/etc/inittab」にある「SV:123456:respawn:/command/svscanboot」という行をコメントアウトして再起動です。
※当然、daemontoolsを有効活用する場合はこれらのプロセスは必要です。
※それにしてもルートディレクトリにディレクトリ作るなよとか思いました(しかもインストーラではインストール先は固定になってます)。

ドメイン移行/複数ドメイン並行稼動時のqmailの設定


 このサイトのドメインはd77.jpですが、以前はdelta0.netというドメインでした。
 delta0.net(旧)はレンタルWebスペース+メールでしたので、d77.jp(新)への移行に伴い、qmailでメールサーバを構築。そして、delta0.netを業者のDNSからここのドメインへ移動してます(その証拠にwww.delta0.netとwww.d77.jpへのpingの結果は同じになると思います)。
 さて、メールの移行ですが、delta0.netへ届くメールをd77.jpで受信するのは簡単です(それも解説します)。しかし、複数のメールアドレス(例としてaaa@example.jpとbbb@example.jpとしましょう)を持っており、aaa@example.jpをaaa@example.jpへ転送する一方、bbb@example.jpは転送しないという場合もあります(bbb@example.jpは存在していたとしてもです)。
 ここでは、こういう複雑な要因が絡んだ時のqmailの設定方法を解説します。
 なお、ほとんど制御ファイル(デフォルトでは/var/qmail/control)とエイリアス(デフォルトでは/var/qmail/alias)の設定で解決します。

複数ドメインの平行稼動


 DNSの設定に関しては解説しませんが、とりあえず正引きデータは2つ分用意し、それぞれMXレコードを定義します。うちではdelta0.netへのメールは、d77.jpが管理するような設定にしてありますが、まぁ特に凝った設定は必要ありません。優先度も同一でいいです(1つのサーバに優先も何もないですから)。
 次にqmailの設定です。既に一方のドメインで正常稼動する状態であるとします。ここでは、d77.jpでqmailが稼動しており、そこにdelta0.netドメインを追加します。
 重要な制御ファイルは2つ、「locals」と「rcpthosts」です。「me」は1ドメインしか書けないのでここでは関係ありません。
 「locals」には、複数のドメイン、、、例に沿って説明すると「d77.jp」と「delta0.net」を記述します。基本的にはこれで複数ドメインに対応完了ですが、「rcpthosts」も設定しないとSPAMと勘違いされて遮断されますの。基本的には「rcpthosts」の内容は「locals」と同じになります。環境によってもしかすると違う設定になるかも知れませんので注意が必要です。
 設定はこれで完了。ちなみに「rcpthosts」は変更後即座に反映されるようですが、「locals」はqmailを再起動しないと反映されないようです(これで一日悩みました^^;)。
 再起動しなかったり、間違えた設定をすると「Sorry. Although I’m listed as a best-preference MX or A for that host,it isn’t in my control/locals file, so I don’t treat it as local. (#5.4.6)」のようなエラーが出ます。

特定のメールを受信する。(2002/10/29)


 ここで解説するのは、たとえば、example.jp1とexample.jp2というドメインを並行稼動していた場合に、以下のようなパターンでメールを受信したい場合の設定です。
※全て例のメアドなので、送っても無駄です。

aaa@example.jp1:通常に受信
aaa@example.jp2:aaa@example.jp1で受信。
bbb@example.jp1:通常に受信
bbb@example.jp2:受信しない(そんな人はいない旨のエラーを出す)。

 まず、必要なのが制御ファイル「rcpthosts」。これに受信する全てのドメインを記述します。上記の例なら、「example.jp1」と「example.jp2」です。ちなみに「locals」は不要です。
 次に制御ファイル「virtualdomains」を設定します。設定内容は「2つ目のドメイン:転送用の名前」です。転送用の名前は何でもいいですけど、次のaliasに影響します。例として「transfar」とした場合、上記の例と照らし合わせると「example.jp2:transfar」です。
 こうすると何が起きるかと言うと、「aaa@example.jp2」へメールを送ったとき、「transfar-aaa@example.jp1(転送用の名前-メアドのユーザ名@制御ファイルmeのドメイン)」というメールアドレスとして受信します。
 さて、これにより、「aaa@example.jp2」は「transfar-aaa@example.jp1」へ「bbb@example.jp2」は「transfar-bbb@example.jp2」へ送られるようになります。当然「transfar-???@example.jp1」というメールボックスが無ければエラーになります。というかそういうメールボックスは無いように制御ファイル「virtualdomains」を設定してください。
 最後に「aaa@example.jp2:aaa@example.jp1で受信」という設定をします」。上記の設定により「aaa@example.jp2」は「transfar-aaa@example.jp1」へ送られるようになったので、エイリアスを設定してやれば「transfar-aaa@example.jp1」を「aaa@example.jp2」へ送ることが出来ます。
 エイリアスの設定はエイリアスディレクトリ(デフォルトで「/var/qmail/alias/」)に「.qmail-transfar-aaa(.qmail-転送元アドレスのユーザ名)」というファイルを作成し、内容を「aaa」とするだけです。
 これにより、「aaa@example.jp2」は「transfar-aaa@example.jp1」として受信され、エイリアスにより「aaa@example.jp1」で受信可能となるわけです。
「bbb@example.jp1」のようにエイリアス設定されていないメールは、メールボックスが無いので、送信元に「Sorry, no mailbox here by that name. (#5.1.1)」というメールが返信されます。

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

Time limit is exhausted. Please reload CAPTCHA.