原文(英語)はこちら
この文書の内容はPostfixのバージョン2.0以降を対象にしています。
この文書では、複数のインターネットドメインに関するメールを管理するにはPostfixをどのように設定すればいいのかについて概要を説明しています。対象ドメインは、そのマシン自身が最終配信先となっている場合も、どこか別の宛先に転送することを目的としている場合もあります。
ここでは、Postfixに組み込まれている配信のしくみだけでなく、Postfix以外のメール配信ソフトを利用するためのポイントについても紹介しています。
この文章では以下の話題について説明しています。
ほとんどのPostfixシステムは、いくつかのドメイン名のみを最終的な宛先としています。これらのドメイン名には、Postfixが動作するマシンのホスト名と[IPアドレス]が含まれ、さらにはホスト名の親ドメインも含まれることもあります。以降この文書では、これらのドメインを正規ドメイン(canonical domain)と呼ぶことにします。これらは通常、ADDRESS_CLASS_READMEファイルで定義されているように、Postfixのlocal domainアドレスクラスで実装されています。
Postfixでは、正規ドメイン以外に、任意の数の追加ドメインの最終的な宛先となるように設定することができます。これらのドメインはマシン名に直接関連付けられないので、ホストドメインと呼ばれます。ホストされるドメインは通常、ADDRESS_CLASS_READMEファイルで定義されているように、virtual alias domainアドレスクラスやvirtual mailbox domainアドレスクラスで実装されています。
でも待ってください! まだあります。Postfixは他のドメインのバックアップMXホストとして設定することができます。この場合、Postfixはそれらドメインの最終的な宛先にはなりません。単にプライマリMXホストがダウンしているときにメールをキューに入れ、プライマリMXホストが使用可能になったときにメールを転送するだけです。この機能は ADDRESS_CLASS_README ファイルで定義されているrelay domainアドレスクラスで実装されています。
最後に、Postfixはインターネット上でメールを送信するトランジットホストとして設定することができます。もちろん、Postfixはそのようなメールの最終的な宛先ではありません。この機能は許可されたクライアントやユーザのみが使用でき、ADDRESS_CLASS_READMEファイルで定義されているdefault domainアドレスクラスによって実装されています。
ここに示す例では、DBMやBerkeley DBのようなローカルファイルからのテーブル検索を使っています。これらはpostmapコマンドで簡単にデバッグできます:
例: postmap -q info@example.com hash:/etc/postfix/virtual
ローカルファイルをデータベースに置き換える方法については、LDAP_README、MYSQL_README、PGSQL_READMEのドキュメントを参照してください。読者は、ネットワークデータベースに移行する前にシステムをローカルファイルで動作させ、postmapコマンドを使用してネットワークデータベース検索がローカルファイル検索と全く同じ結果を生成することを確認することを強く勧めます。
例: postmap -q info@example.com ldap:/etc/postfix/virtual.cf
追加ドメインをホストする最も簡単な方法は、Postfixのmydestination設定パラメータに列挙されているドメインにドメイン名を追加し、UNIXパスワードファイルにユーザー名を追加することです。
このやり方では、正規ドメインとホストされたドメインを区別しません。それぞれのユーザ名はすべてのドメインでメールを受信できます。
以下の例では、ローカルのPostfixマシンでホストされているドメインとして "example.com "を使用します。
/etc/postfix/main.cf: mydestination = $myhostname localhost.$mydomain ... example.com
この方法を使った場合の制限:
この後の例で、この2つの制限に対する解決策を示します。
この節で説明する方法を使うと、すべてのホストされたドメインにおいて、電子メールアドレスをなどの情報をそれぞれドメインごとに持つことができます。しかし、ローカルメールボックスへの配送にはUNIXシステムアカウントを使用します。
virtual alias domainsを使うと、ホストされている各アドレスは、ローカルの UNIXシステムアカウントまたはリモートのアドレスの別名として設定されます。以下の例では、example.comドメインでこの仕組みを使う方法を示しています。
1 /etc/postfix/main.cf: 2 virtual_alias_domains = example.com ...other hosted domains... 3 virtual_alias_maps = hash:/etc/postfix/virtual 4 5 /etc/postfix/virtual: 6 postmaster@example.com postmaster 7 info@example.com joe 8 sales@example.com jane 9 # 全メールを受信するには以下の記述をコメントアウト解除してください 10 # @example.com jim 11 ...virtual aliases for more domains...
注意:
2行目:virtual_alias_domainsの設定は、example.comがいわゆるvirtual alias domain(仮想の別名ドメイン)であることをPostfixに伝えます。この設定を省略すると、Postfixはメールを拒否する(リレーアクセスが拒否される)か、またはメールを配送できなくなります(example.com宛のメールは自分自身にループバックします)。
virtual alias domainのドメイン名をmydestinationに指定してはいけません!
3-8行目: /etc/postfix/virtual のファイルにはバーチャルエイリアスが含まれます。上の例では、postmaster@example.com 宛のメールはローカルの postmaster に送られ、info@example.com 宛のメールは UNIX アカウント joe に、sales@example.com 宛のメールは UNIX アカウント jane に送られます。example.comの他のすべてのアドレスへのメールは、"User unknown "というエラーメッセージとともに拒否されます。
10行目: コメントアウトされたエントリー(#の後のテキスト)は、バーチャルエイリアスファイルに列挙されていないすべてのexample.comアドレスのメールを受け取るキャッチオールのバーチャルエイリアスを実装する方法を示しています。これは危険がないわけではありません。最近のスパム送信者は、思いつく限りの名前でメールを送受信しようとします。キャッチオールのメールボックスは、多くのスパムメールを受信し、anything@example.com の名前で送信されたスパムメールの返送も多くなる可能性があります。
バーチャルファイルを変更したら、"postmap /etc/postfix/virtual" のコマンドを、main.cfのファイルを変更したら"postfix reload" を実行してください。
注意:仮想エイリアスは、ローカルアドレス、リモートアドレス、またはその両方で解決することができます。あなたのマシンのUNIXシステムアカウントで解決できる必要はありません。
仮想エイリアスファイルについて、詳しくは virtual(5)のマニュアルページに、右側の複数のアドレスも含めて記載されています。
バーチャルエイリアスは1つの問題を解決してくれます:それは、各ドメインがそれぞれ独自のメールアドレス情報を持つことができるということです。しかしまだ欠点が一つあります。それは、各バーチャルアドレスはUNIXシステムアカウントの別名になっているということです。バーチャルアドレスを増やすと、UNIXシステムアカウントも増えてしまいます。次の節でこの問題を解決する方法を示します。
システムがホストするドメインとユーザーの数が増えるにつれて、すべてのユーザーに独自の UNIX システム アカウントを与えるのは望ましいことではなくなってきます。
Postfixの virtual(8) メールボックス配信エージェントを使うと、すべての受信者アドレスが独自の仮想メールボックスを持つことができます。仮想エイリアスドメインとは異なり、仮想メールボックスドメインでは、各受信者アドレスを別のアドレスに置き換えるという不器用なことをする必要がなく、仮想メールボックスアドレスの所有者がUNIXシステムアカウントを持つ必要もありません。
Postfixのvirtual(8)メールボックス配信エージェントは、受信者のメールアドレスで別のテーブルを検索し、ユーザーのメールボックスのパス名、uid、および gid の情報を得ます。 Maildir 形式の配信は、メールボックスのパス末尾を「/」にすることで有効になります。
複数のテーブルという概念が煩わしいときは、(一旦機能すれば)情報をSQLデータベースに移行できることを思い出してください。この方法を取る場合は、この文書の冒頭にある「ローカルファイルとデータベース」の節を必ず確認してください。
ここに示すのは"example.com"という:仮想メールボックスドメインの例です。
1 /etc/postfix/main.cf: 2 virtual_mailbox_domains = example.com ...more domains... 3 virtual_mailbox_base = /var/mail/vhosts 4 virtual_mailbox_maps = hash:/etc/postfix/vmailbox 5 virtual_minimum_uid = 100 6 virtual_uid_maps = static:5000 7 virtual_gid_maps = static:5000 8 virtual_alias_maps = hash:/etc/postfix/virtual 9 10 /etc/postfix/vmailbox: 11 info@example.com example.com/info 12 sales@example.com example.com/sales/ 13 # 全メールを受信するには以下の記述をコメントアウト解除してください 14 # @example.com example.com/catchall 15 ...virtual mailboxes for more domains... 16 17 /etc/postfix/virtual: 18 postmaster@example.com postmaster
注意:
2行目: virtual_mailbox_domainsの設定は、example.com がいわゆる仮想メールボックスドメインであることを Postfix に伝えます。この設定を省略すると、Postfix はメールを拒否する(リレーアクセスを拒否する)か、または配信できなくなります(example.com 宛てのメールは自分にループバックします)。
仮想メールボックスドメインの名前をmydestinationに書いてはいけません!
仮想メールボックスドメインの名前を仮想エイリアスドメインに書いてはいけません!
3行目:virtual_mailbox_baseのパラメーターには、すべての仮想メールボックスのパス名において先頭に共通して付加する値を指定します。これは、誰かが間違いを犯した場合の安全機構です。これにより、メールがファイルシステム全体に配信されるのを防ぎます。
4, 10-15行目:virtual_mailbox_mapsのパラメーターには、仮想メールアドレスにひもづけられたメールボックス(または maildir)のパス名を含む検索テーブルを指定します。この例では、info@example.com へのメールは /var/mail/vhosts/example.com/info のメールボックスに送信され、sales@example.com へのメールは /var/mail/vhosts/example.com/sales/ にある maildir に送信されます。
5行目:virtual_minimum_uidには、メールボックスまたは maildir 所有者の UID の下限値を指定します。これは、誰かが間違いを犯した場合の安全機構です。メールが機密ファイルに書き込まれるのを防ぎます。
6, 7行目:virtual_uid_mapsとvirtual_gid_mapsのパラメーターでは、すべての仮想メールボックスが常に uid 5000、gid 5000 によって所有されることを指定しています。このように設定したくないときは、受信者のメールアドレスを検索する検索テーブルを指定します。
14行目:コメントアウトされたエントリー(# の後に書かれた文字列)は、すべてのメールを受け取るキャッチオール仮想メールボックスアドレスを実装する方法を示しています。大量のスパムメールや、anything@example.com の名前で返送されるスパムメールを受信する準備をしておいてください。
仮想ALIASファイルの中に、仮想メールボックスのワイルドカードを記してはいけません!
8, 17, 18行目:ご覧のとおり、仮想エイリアスと仮想メールボックスを混在させることができます。この機能を使って、example.com のpostmaster アドレス宛てのメールをローカルのpostmasterにリダイレクトします。 同じしくみを使って、あるアドレス宛てのメールをリモートのアドレスに転送することもできます。
18行目: この例では、main.cf の mydestination パラメーターの指定に $myorigin が含まれていることを前提としています。そうでない場合は、仮想エイリアステーブルエントリの右側にドメイン名を明示して指定します。そうしないと、メールが間違ったドメインに送信されます。
仮想ファイルを変更したら「postmap /etc/postfix/virtual」のコマンドを、vmailbox ファイルを変更したら「postmap /etc/postfix/vmailbox」のコマンドを、main.cfのファイルを変更したら「postfix reload」のコマンドをそれぞれ実行してください。
注意: メール配信は、virtual_uid_mapsと および virtual_gid_maps で指定された受信者の UID/GID 権限を使って行われます。Postfix 2.0 以前では、誰でも書き込み可能な親ディレクトリに mailDIR を作成しません。使用する前に、あらかじめ作成しておく必要があります。親ディレクトリの書き込み権限によっては、Postfix が自力で mailBOX ファイルを作成できる場合もありますが、事前に mailBOX ファイルを作成しておく方が安全です。
仮想メールボックス配信エージェントについて詳しくは、virtual(8) のマニュアルページを参照してください。
ここではPostfix 仮想メールボックスを設定するまた別の方法を説明します。繰り返しますが、ホストされているすべてのアドレスは独自のメールボックスを持つことができます。 ただし、virtual(8) 配信エージェントを制御するほとんどのパラメータは使えなくなりました。有効なパラメータはvirtual_mailbox_domains と virtual_mailbox_maps のみです。これらのパラメータは、不明な受信者宛てのメールを拒否するために必要です。
最終的な配信には Postfix とは別のソフトウェアが使われていますが、すべてが連携して動作するようにするには、Postfix の概念もいくつか知っておく必要があります。この両者をつなぐ役割についての詳細な背景については、ADDRESS_CLASS_README ファイルで定義されているvirtual mailbox domainクラスを参照してください。
この節では、Postfix から見て物事がどのように見えるべきかについて説明します。 Cyrus または Courier maildropに関する具体的な情報については、CYRUS_README または MAILDROP_README を参照してください。
以下に示すのは、Postfix 以外の配信エージェントに配信するホスト型ドメイン example.com の例です。
1 /etc/postfix/main.cf: 2 virtual_transport = ...see below... 3 virtual_mailbox_domains = example.com ...more domains... 4 virtual_mailbox_maps = hash:/etc/postfix/vmailbox 5 virtual_alias_maps = hash:/etc/postfix/virtual 6 7 /etc/postfix/vmailbox: 8 info@example.com whatever 9 sales@example.com whatever 10 # 以下の行をコメントアウト解除するとすべてのアドレスでメールを 11 # 受け取るキャッチオールを実装するよう設定することができます 12 # @example.com whatever 13 ...他ドメインの仮想メールボックス... 14 15 /etc/postfix/virtual: 16 postmaster@example.com postmaster
注意:
2行目: ホストされているドメインで Postfix 以外のメールボックスストアに配信するとき、virtual_transport のパラメータには通常、Postfix LMTP クライアント、またはパイプ配信エージェントを経由して Postfix 以外のソフトウェアを実行する master.cf エントリの名前を指定します。以下に典型的な例を示します(実際に指定するのはこのどれか1つだけ):
virtual_transport = lmtp:unix:/path/name (UNIX-domainソケットを使用) virtual_transport = lmtp:hostname:port (TCPソケットを使用) virtual_transport = maildrop: (pipe(8)コマンドを使用)
Postfix は LMTP に対応しています。 また、maildropに配信するための設定例は、デフォルトの Postfix master.cf ファイルですでに定義されています。詳しくは、MAILDROP_README の文書を参照してください。
3行目:virtual_mailbox_domains の設定は、前の段落で説明した virtual_transport を経由してexample.com が配信されることを Postfix に伝えます。この virtual_mailbox_domains の設定を省略すると、Postfix はメールを拒否(リレーアクセスを拒否)するか、または配信できなくなります(example.com などに宛てたメールは自分にループバックします)。
virtual MAILBOX domainの値をmydestinationに書いてはいけません!
virtual MAILBOX domainの値を仮想ALIASドメインに書いてはいけません!
4, 7-13行目:virtual_mailbox_maps のパラメーターには、すべての有効な受信者アドレスが登録されている検索テーブルを指定します。Postfix は検索結果の値を無視します。上の例では、info@example.com と sales@example.com が有効なアドレスとして列挙されています。example.com ドメインのその他のアドレスに宛てたメールは、Postfix SMTP サーバーによって「ユーザー不明」として拒否されます。存在しない受信者に宛てて、ローカルから送られたメールまたはローカルエイリアス拡張から送られたメールを拒否するかどうかは、Postfix 以外の配信エージェントに任されています。ローカル ファイルではなくLDAP、MySQL、または PgSQL を使う場合は、この文書の冒頭にある「ローカル ファイルとデータベース」の節を必ず確認してください。
12行目: コメントアウトされた記述(# の後の文書)は、キャッチオール アドレスのがあることを Postfix に通知する方法を示しています。繰り返しますが、検索結果は Postfix によって無視されます。
仮想 ALIAS ファイルには仮想 MAILBOX ワイルドカードを決して入れないでください!
注意: virtual_mailbox_maps でワイルドカードを指定した場合でも、Postfix 以外のメールボックスにおいて、そのドメイン内の任意のアドレスのメールを受信できるようにストアを設定する必要があります。
5, 15, 16行目: 上で示したように、仮想エイリアスと仮想メールボックスを混在させることができます。 この機能を使用して、example.com のpostmasterアドレス宛てのメールをローカルのpostmasterに転送します。 同じしくみを使って、任意のアドレスをローカル アドレスまたはリモート アドレスに転送することができます。
16行目: この例では、main.cf の mydestination パラメーターの設定値として $myorigin が記述されていることを前提としています。そうでない場合は、仮想エイリアス テーブルのエントリとしてドメイン名明記してください。そうしないと、メールが間違ったドメインに送信されます。
virtualファイルを更新した後は"postmap /etc/postfix/virtual"のコマンドを、vmailboxファイルを更新した後は"postmap /etc/postfix/vmailbox"のコマンドを、main.cfのファイルを更新した後は"postfix reload"のコマンドをそれぞれ実行してください。